java HashMap,TreeMap与LinkedHashMap的详解
javaHashMap,TreeMap与LinkedHashMap的详解
今天上午面试的时候问到了Java,Map相关的事情,我记错了HashMap和TreeMap相关的内容,回来赶紧尝试了几个demo理解下
packageMap;
importjava.util.*;
publicclassHashMaps{
publicstaticvoidmain(String[]args){
Mapmap=newHashMap();
map.put("a","aaa");
map.put("b","bbb");
map.put("c","ccc");
map.put("d","ddd");
Iteratoriterator=map.keySet().iterator();
while(iterator.hasNext()){
Objectkey=iterator.next();
System.out.println("map.get(key)is:"+map.get(key));
}
Hashtabletab=newHashtable();
tab.put("a","aaa");
tab.put("b","bbb");
tab.put("c","ccc");
tab.put("d","ddd");
Iteratoriterator_1=tab.keySet().iterator();
while(iterator_1.hasNext()){
Objectkey=iterator_1.next();
System.out.println("tab.get(key)is:"+tab.get(key));
}
TreeMaptmp=newTreeMap();
tmp.put("a","aaa");
tmp.put("b","bbb");
tmp.put("c","ccc");
tmp.put("d","ddd");
tmp.put("a","aba");
Iteratoriterator_2=tmp.keySet().iterator();
while(iterator_2.hasNext()){
Objectkey=iterator_2.next();
System.out.println("tmp.get(key)is:"+tmp.get(key));
}
LinkedHashMap<String,Integer>linkedHashMap=newLinkedHashMap<String,Integer>();
linkedHashMap.put("dasdsa",1);
linkedHashMap.put("gdsf",2);
linkedHashMap.put("texvdfd",3);
linkedHashMap.put("bdada",4);
linkedHashMap.put("gdsf",3);
for(Stringtemp:linkedHashMap.keySet()){
System.out.println(temp);
}
}
}
Map不同于List,底层使用键值对的形式存储数据Map.Entry是内部的一个子条目,Map的不同实现对键值对的索引方案不同
HashMap 本身是用hash函数对键值做索引 我们不能确定最后键值的顺序
但是存在一个有趣的现象就是在以Integer作为键值对的时候,当位数为1位时 键值是按照从小到大排的,位数上升到两位的时候就可能存在问题
TreeMap 内部存在着一个平衡树来存储着键值索引,TreeMap把键值按照比较函数排序,我推测内部是可能存在着一个AVLtree
LinkedHashMap 这个存在着一个特性是,键值对是按照插入顺序排序的,如果存在着重复插入,以首次插入的顺序来记,网上的一种说法是该结构内部存在着2重hash
一个解决顺序问题,一个解决存储问题,正确性待确认
HashMap和TreeMap 是最常用的两种Map结构, 一般来说HashMap的效率比较高,也最为常见,如果我们需要键值有序的话,我们才会用到TreeMap
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!