首页 Java java教程 ​Java集合:Set、List、Queue、Map四个体系的归纳总结

​Java集合:Set、List、Queue、Map四个体系的归纳总结

Aug 08, 2018 am 10:51 AM
java集合

Java集合大致分为Set、List、Queue、Map四个体系 

其中Set代表无序、不可重复的集合;List代表有序、重复集合;Map代表具有映射关系的集合;Queue是队列的实现。

集合和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),集合里面只能保存对象(实际上只是保存对象的引用变量)。

Java集合中有两个派生的 接口:Collection 和 Map
Collection集合体系的继承树:

1.pngMap集合体系的继承树:
1.png

下面分别讲述
Set集合:
Set集合类似一个罐子,程序可以依次将多个对象“丢进”里面,Set不会记住元素的添加顺序,Set集合不允许有相同的元素。

HashSet:
特点:
不能保证元素的排列顺序
HashSet不是同步的
集合元素值可以为null
HashSet判断两个元素相等的标准是:两个对象通过equals()方法比较相等,并且两个对象的hashcode()方法返回值也相等。
注意:当把一个对象放进HashSet中时,如果需要重写该对象的equals()方法,则应该重写其hashCode()方法。规则是:如果两个对象通过equals()方法比较返回true,两个对象的hashCode值应该相同。

LinkedSet:
LinkedSet根据原始的hashCode的值来决定元素的存储位置,但是他同时使用链表维护元素的次序,这样使得元素的插入的顺序保存。LinkedSet会按照元素的添加顺序来访问集合里的元素。
LinkedSet需要维护元素的插入位置,因此性能会略低于HashSet的性能。

TreeSet:
TreeSet可以确保集合元素处于排序状态。
TreeSet并不是根据元素的插入顺序进行排序的,而是根据元素的实际值的大小来进行排序的。
TreeSet采用红黑树的数据结构来存储集合元素。
TreeSet支持两种排序方法:自然排序和定制排序。在默认情况下,TreeSet采用自然排序。

自然排序:TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列。在默认情况下,TreeSet采用自然排序。
当把一个对象加入TreeSet集合中时,TreeSet调用该对象的compareTo(Object obj)方法与容器中的其他对象比较大小,然后根据红黑树结构找到它的存储位置。
判断两个对象是否相等的唯一标准是:两个对象通过compareTo(Object obj)方法比较是否返回0。
如果两个对象通过equals()方法比较返回true时,这两个对象通过compareTo(Object obj)方法比较应返回0。

定制排序:如果需要实现定制排序,则需要在创建TreeSet集合对象时,提供一个Comparator对象与该TreeSet集合关联,由该Comparator对象负责集合元素的排序逻辑。

EnumSet:
EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内部的定位顺序来决定集合元素的顺序。
EnumSet内部以位向量的形式存储。
EnumSet集合不允许加入null元素。

各Set实现类的性能分析:
HashSet的性能总比TreeSet好,因为TreeSet需要额外的红黑树算法来维护集合的次序。
LinkedSet对于普通的插入、删除操作,LinkedSet比HashSet要稍微慢一些,这是由维护链表所带来的额外开销造成的。但是由于有链表,遍历LinkedSet比较快。
EnumSet性能最好,但只能保存同一个枚举类得枚举值作为集合元素。

List:
List代表一个元素有序,可重复的结合,集合中的每个元素都有对应的顺序索引。
List集合可以根据位置索引来访问集合中的元素,因此List可以使用for循环来遍历。

ArrayList、LinkedList和Vector
ArrayList源码分析:
LinkedList源码分析:

Queue:
Queue用于模拟队列这种数据结构。
PriorityQueue:
PriorityQueue保存队列元素的顺序并不是按照加入的顺序,而是按照队列元素的大小进行排序的。
PriorityQueue不允许插入null元素。

Deque:
Deque接口是Queue接口的子接口,它代表一个双端队列。
当程序中需要使用“栈”这种数据结构时,推荐使用ArrayDeque。

各种线性表的性能分析:
1.如果需要遍历List集合元素,对ArrayList、Vector集合,应该使用随机访问方法(get)来遍历集合元素,这样性能更好;对于LinkedList集合应该使用迭代器(Iterator)来遍历集合元素。
2.如果需要经常执行插入、删除,应使用LinkedList。
3.如果多线程同时访问List集合中的元素,应该使用Collections将集合包装成线程安全的集合。

Map:
Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。
Map中存在一个keySet()方法,用于返回Map中所有key组成的Set集合。

HashMap、Hashtable:
HashMap和Hashtable的区别:
1.Hashtable是一个线程安全的Map,HashMap是非线程安全的,所以HashMap的性能比较好。
2.Hashtable不允许使用null作为key和value,HashMap允许使用null作为key或者value。

Hashtable、HashMap判断两个key相等的标准是:两个的key的equals()方法返回true,两个key的HashCode值相同;判断两个value相等的标准是value的equals()方法返回值相同。

LinkedMap:
LinkedMap会记住key-value的添加顺序。

TreeMap:
TreeMap也是采用了红黑树的结构,TreeMap中判断两个key相等的标准是:
两个key通过compareTo()方法的返回值为0.(在自然排序下)
两个key通过compareTo()方法的返回值为0.同时equals()方法比较返回为true。(定制排序下)。

EnumMap:
EnumMap内部以数组的形式保存。
EnumMap不允许使用null作为key,但是允许value为null。

Map的性能分析:
HashMap的性能要比Hashtable的性能要好。
TreeMap中的key-value对总是处于有序状态,无须进行专门的排序操作。
对于一般的运用场景,多考虑使用HashMap。
LinkedMap要比HashMap慢,是因为需要维护链表来保持key-value的添加顺序。
EnumMap的性能最好,但是只能使用同一个枚举类的枚举值作为key。

相关推荐:

Java集合Set、List、Map的遍历方法

一段代码搞懂关于Java中List、Set集合及Map的使用

以上是​Java集合:Set、List、Queue、Map四个体系的归纳总结的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Java的类负载机制如何起作用,包括不同的类载荷及其委托模型? Java的类负载机制如何起作用,包括不同的类载荷及其委托模型? Mar 17, 2025 pm 05:35 PM

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存? 如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存? Mar 17, 2025 pm 05:44 PM

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射? 如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射? Mar 17, 2025 pm 05:43 PM

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案? 如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案? Mar 17, 2025 pm 05:46 PM

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)? 如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)? Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

See all articles