为什么HashMap取出的数据顺序和存储时的顺

为什么HashMap取出的数据顺序和存储时的顺,第1张

// //////////////测试数据///////////////

if (tabTitle != null && tabTitlesize() > 0) {

tabTitleclear();

}

for(int i = 0; i < 5; i++) {

List<SeatTime> list = new ArrayList<SeatTime>();

for (int k = 0; k < 30; k++) {

SeatTime st = new SeatTime();

stsetTime("10:00_" + k);

stsetDatetime("2014-11-18_" + k);

stsetDatedesc("11月18日 明天 10:30_" + k);

if (k % 3 == 0) {

stsetState("1");

} else {

stsetState("0");

}

listadd(st);

}

ConfigLog("zrck", "i========"+i);

timeMapput("日期" + i, list);

}

//获取map里的key值

Iterator it = timeMapentrySet()iterator();

while (ithasNext()) {

Entry entry = (Entry) itnext();

tabTitleadd(entrygetKey()toString()replaceAll(" ",""));

ConfigLog("zrck", "============"+entrygetKey()toString());

}

测试后的结果

输入时按顺序插入的,但是取出时数据就乱套了,查了下资料发现,hashmap是散列映射,也就是它不会记录数据存储时的顺序,也就无法保证你取出时的顺序,为了解决这个问题,很简单采用LinkedHashMap或者是TreeMap即可,当然会造成一些额外开销,但并不影响什么。

重写自定义对象的hashcode()方法,让内容相同的对象返回一样的hashcode默认情况自定义对象是以内存地址为hashcode,你“重新创建一个一样的对象”,存在“重新创建”就会导致对象不一样所以要重写覆盖hashcode方法才能获取到map值

另外,也可以低层一点,你的自定义对象上设一个int id属性 而Map转为以id为键,比如Map<int, Value>。

public class TestMapSort {

/

@param args

/

public static void main(String[] args) {

TreeMap map = new TreeMap();

for(int i=0; i<10; i++) {

int s = (int)(Mathrandom()10);

Systemoutprintln(s); //打印随机产生的数据无序

mapput(s,s); //测试随机put10个数字

}

Collection col = mapkeySet(); //从map里取键集合,这里应该是排序的

Iterator it = coliterator(); //遍历

while(ithasNext()) {

int key =IntegerparseInt(itnext()toString()); //强制转换为int

Systemoutprintln(key); //打印键

Systemoutprintln(mapget(key)); //打印键对应的值

}

}

}

按照楼上的建议重新写了一个 我没有在Structs里面测,对立面的标签用起来感觉不习惯,我打印测试了 可以实现排序的功能

import javautil;

public class TreeMapTest {

@SuppressWarnings("unchecked")

public static MapEntry[] getSortedTreeMap(TreeMap treemap) {

Set set = treemapentrySet();

MapEntry[] entries = (MapEntry[]) settoArray(new MapEntry[set

size()]);

Arrayssort(entries, new Comparator() {

public int compare(Object arg0, Object arg1) {

Object key1 = ((MapEntry) arg0)getKey();

Object key2 = ((MapEntry) arg1)getKey();

return ((Comparable) key1)compareTo(key2);

}

});

return entries;

}

public static void main(String[] args) {

TreeMap tb = new TreeMap();

tbput("11", "aad");

tbput("ss", "aaaa");

tbput("bb", "aa");

tbput("aaa", "aad");

tbput("fff", "aad");

MapEntry[] set = getSortedTreeMap(tb);//调用上面方法排序

for (int i = 0; i < setlength; i++) {

Systemoutprintln(set[i]getKey()toString());

Systemoutprintln(set[i]getValue()toString());

}

}

}

以上就是关于为什么HashMap取出的数据顺序和存储时的顺全部的内容,包括:为什么HashMap取出的数据顺序和存储时的顺、java中的Map的键如果是自己写的一个类的对象,怎么根据这个键获取值、JAVA 中 Map的按顺序 PUT如何实现 等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9267727.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存