百科狗-知识改变命运!
--

Java中HashMap和TreeMap的区别深入理解

是丫丫呀1年前 (2023-12-16)阅读数 7#综合百科
文章标签元素接口

HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。

HashMap 非线程安全 TreeMap 非线程安全

线程安全

在Java里,线程安全一般体现在两个方面:

1、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized。如ArrayList和Vector,HashMap和Hashtable

(后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。

2、每个线程都有自己的字段,而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样。

1.AbstractMap抽象类和SortedMap接口

AbstractMap抽象类:(HashMap继承AbstractMap)覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。

SortedMap接口:(TreeMap继承自SortedMap)它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一份实现。

2.两种常规Map实现

HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。

(1)HashMap(): 构建一个空的哈希映像

(2)HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射

(3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像

(4)HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像

TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

(1)TreeMap():构建一个空的映像树

(2)TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素

(3)TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序

(4)TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序

3.两种常规Map性能

HashMap:适用于在Map中插入、删除和定位元素。

Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

4.总结

HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。

元素崛起和匹配有什么区别

List:是存储单列数据的集合,存储的数据是有序并且是可以重复的?

Map:存储双列数据的集合,通过键值对存储数据,存储 的数据是无序的,Key值不能重复,value值可以重复?key和value是一一对应的

Collection接口

Collection是Java中最基本的集合接口。它描述了一组有关集合操作的方法。

int Size(); //集合大小

boolean isEmpty(); //是否为空

boolean contains(Object o); //是否包含某个对象

Iterator iterator(); //返回一个迭代对象,用来遍历集合中的元素

Object[] toArray(); //将集合中的元素以数组形式然后返回

T[] toArray(T[] a); //上一个方法的泛型形式

boolean add(E e); //将对象e添加进集合,添加成功则返回true

boolean remove(Object o); //移除某个元素

boolean containsAll(Collection c); //传入一个集合c,如果c中的元素都存在,则返回true

boolean addAll(Collection c); //本集合减去c集合中的元素

boolean retainAll(Collection c); //取本集合和c集合的交集

void clear(); //清空集合

boolean equals(Object o); //判断相等

int hashCode(); //获取集合当前的hash值

Set接口

Set接口直接继承自Collection接口,并且方法接口上也一模一样。Set对添加的元素有一些要求,其不允许出现重复的元素,并且元素之间没有次序。这相当于一个不允许重复的离散的集合。因此,添加进Set的元素类型需要定义equals方法。若是使用自定义的类,则应该重写equals方法来确保实现自己需要的功能。

Set接口主要实现了两个类:HashSet,TreeSet。

Java中HashMap和TreeMap的区别深入理解

HashSet是按照哈希来存取元素的,因此速度较快。HashSet继承自抽象类AbstractSet,然后实现了Set、Cloneable、Serializable接口。?

TreeSet也是继承自AbstractSet,不过不同的是其实现的是NavigableSet接口。而NavigableSet继承自SortedSet。SortedSet是一个有序的集合。其添加的元素必须实现了Comparable接口,因为其在添加一个元素的时候需要进行排序。NavigableSet则提供了更多的有关元素次序的方法。

LinkedHashSet也是Set的一个实现。和HashSet类似,只不过内部用链表来维护,按照元素插入次序来保存。

List接口

List接口也是继承自Collection。与Set不同的是,List可以存储重复的元素。主要有两种实现:ArrayList和LinkedList。?

ArrayList没有什么好说的,就像传统的数组一样,有着很快的随机存取速度,但是插入删除的速度就很慢。?

LinkedList则与ArrayList恰恰相反,因为用链表来保存数据,所以插入删除元素的速度很快,但是访问数据的速度就不如ArrayList了。

Map接口

Map(映射)是一个存储键值对的容器接口。每一个元素包含一个key对象和value对象,且元素不允许重复。?

Map接口的实现有以下几个:?

HashMap是最常用的一个实现。HashMap使用hash映射来存取数据,这个速度是相当快,是O(1)的速度。其容量capacity,和负载因子load factor可以在一开始设定。当元素个数达到capacity*load factor的时候,就会进行扩容。?

LinkedHashMap和HashMap类似,只不过内部用链表来维护次序。因此遍历时候的顺序是其插入顺序。?

TreeMap是基于红黑树的Map,插入的数据被有次序保存,并且有很高的效率。因此在遍历输出的时候可以得到排序的数据。但是这要求插入的数据实现了comparable接口。

总结

Collection、Set、List和Map都是接口,不能被实例化。

Set和List都继承自Collection,而Map则和Collection没什么关系。

Set和List的区别在于Set不能重复,而List可以重复。

Map和Set与List的区别在于,Map是存取键值对,而另外两个则是保存一个元素。

希望对您有所帮助!~

元素崛起和匹配有什么区别。

水龙对应的海洋峡谷,地图上的草丛会变得更多,果子也更多,火龙对应炼狱峡谷,草丛被烧光,同时围绕着红蓝buff的岩石会部分消失,增添了新的路径,土龙对应山脉峡谷,地图上会出现新地图,在元素龙巢穴的前方还会出现高墙。

消灭一个元素龙就可以得到一定的加成,水龙持续回血,火龙提升物理攻击和法术攻击,土龙提升护甲与魔法抗性。

简介:

而当消灭全部三只元素龙的时候,还可以得到更强的龙魂。不同的龙魂效果不同,水龙魂可以在对敌人造成伤害的时候恢复更多的血量。

火龙魂是使用技能或者普攻攻击敌人的时候会发生爆炸,造成小范围的AOE伤害,就有点像端游中九头蛇的范围伤害,土龙魂则是一定时间内没受到伤害的话就会附加护盾。

全部三只元素龙被击杀后,会出现全新的远古巨龙,也就是大家常说的,老龙,击杀远古巨龙可以获得一个几乎无法阻挡的BUFF,带有真实伤害灼烧效果,并且会直接处决生命值低于20%的敌方英雄。

所以,有了远古龙buff必然是要快速接团,力求尽快结束比赛。而落后的一方也可以通过抢小龙,龙魂,远古龙来试图扭转战局,必要时刻远古龙与纳什男爵的选择也是大家需要考虑的。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)