志在指尖
用双手敲打未来

怎么决议使用 HashMap 还是 TreeMap? ​

问:怎么决定运用HashMap还是TreeMap?
介绍
TreeMap的Key值是要求完成java.lang.Comparable,所以迭代的时分TreeMap默许是依照Key值升序排序的;TreeMap的完成是根据红黑树结构。适用于按自然次序或自界说次序遍历键(key)。
HashMap的Key值完成散列hashCode(),分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。
结论
假如你需要得到一个有序的成果时就应该运用TreeMap(因为HashMap中元素的摆放次序是不固定的)。除此之外,由于HashMap有更好的功能,所以大多不需要排序的时分咱们会运用HashMap。
拓展
1、HashMap和TreeMap的完成
HashMap:根据哈希表完成。运用HashMap要求增加的键类明确界说了hashCode()和equals()[能够重写hashCode()和equals()],为了优化HashMap空间的运用,您能够调优初始容量和负载因子。
HashMap():构建一个空的哈希映像
HashMap(Mapm):构建一个哈希映像,而且增加映像m的所有映射
HashMap(intinitialCapacity):构建一个具有特定容量的空的哈希映像
HashMap(intinitialCapacity,floatloadFactor):构建一个具有特定容量和加载因子的空的哈希映像
TreeMap:根据红黑树完成。TreeMap没有调优选项,因为该树总处于平衡状况。
TreeMap():构建一个空的映像树
TreeMap(Mapm):构建一个映像树,而且增加映像m中所有元素
TreeMap(Comparatorc):构建一个映像树,而且运用特定的比较器对关键字进行排序
TreeMap(SortedMaps):构建一个映像树,增加映像树s中所有映射,而且运用与有序映像s相同的比较器排序java
2、HashMap和TreeMap都对错线程安全
HashMap承继AbstractMap抽象类,TreeMap承继自SortedMap接口。
AbstractMap抽象类:覆盖了equals()和hashCode()办法以保证两个持平映射回来相同的哈希码。假如两个映射巨细持平、包含相同的键且每个键在这两个映射中对应的值都相同,则这两个映射持平。映射的哈希码是映射元素哈希码的总和,其间每个元素是Map.Entry接口的一个完成。因此,不论映射内部次序怎么,两个持平映射会陈述相同的哈希码。
SortedMap接口:它用来保持键的有序次序。SortedMap接口为映像的视图(子集),包含两个端点供给了访问办法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet相同。增加到SortedMap完成类的元素必须完成Comparable接口,不然您必须给它的结构函数供给一个Comparator接口的完成。TreeMap类是它的仅有一个完成。
3、TreeMap中默许是依照升序进行排序的,怎么让他降序
经过自界说的比较器来完成
界说一个比较器类,完成Comparator接口,重写compare办法,有两个参数,这两个参数经过调用compareTo进行比较,而compareTo默许规则是:
假如参数字符串等于此字符串,则回来0值;
假如此字符串小于字符串参数,则回来一个小于0的值;
假如此字符串大于字符串参数,则回来一个大于0的值。
自界说比较器时,在回来时多增加了个负号,就将比较的成果以相反的形式回来,代码如下:
staticclassMyComparatorimplementsComparator{
@Overridepublicintcompare(Objecto1,Objecto2){//TODOAuto-generatedmethodstubStringparam1=(String)o1;
Stringparam2=(String)o2;return-param1.compareTo(param2);
}
}
之后,经过MyComparator类初始化一个比较器实例,将其作为参数传进TreeMap的结构办法中:
MyComparatorcomparator=newMyComparator();
Mapmap=newTreeMap(comparator);
这样,咱们就能够运用自界说的比较器完成降序了
publicclassMapTest{publicstaticvoidmain(String[]args){//初始化自界说比较器MyComparatorcomparator=newMyComparator();//初始化一个map调集Mapmap=newTreeMap(comparator);//存入数据map.put(“a”,”a”);
map.put(“b”,”b”);
map.put(“f”,”f”);
map.put(“d”,”d”);
map.put(“c”,”c”);
map.put(“g”,”g”);//遍历输出Iteratoriterator=map.keySet().iterator();while(iterator.hasNext()){
Stringkey=(String)iterator.next();
System.out.println(map.get(key));
}
}staticclassMyComparatorimplementsComparator{
@Overridepublicintcompare(Objecto1,Objecto2){//TODOAuto-generatedmethodstubStringparam1=(String)o1;
Stringparam2=(String)o2;return-param1.compareTo(param2);
}
}
}

未经允许不得转载:IT技术网站 » 怎么决议使用 HashMap 还是 TreeMap? ​
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载