Java中常用集合类对比_集合比较
集合实现类 | 集合接口 | 有序性 | 唯一性 | 线程安全 | 空值 | 性能 | 排序 | 数据结构 | 索引 | 应用场景 | 备注 |
---|---|---|---|---|---|---|---|---|---|---|---|
ArrayList | List | 有序 | 可重复 | 不安全 | 允许空值 | 查找效率高,添加/删除效率低 |
使用 Collections.sort() 传入ArrayList,会采 用默认的方式进行排序(字典序)。 自己实现 Comparator 接口,再使用 Collections.sort() 来 实现自定义排序 |
数组 | 下标索引 | 适合快速随机查找和遍历,不适合插入和删除,当操作是在一列数据的后面添加数据而不是在前面或者中间,并需要随机地访问其中的元素时,使用ArrayList性能比较好 | 数组空间不够,ArrayList默认扩展50%的大小。 |
Vector | List | 有序 | 可重复 | 安全 | 允许空值 | 查找效率高,添加/删除效率低 | - | 数组 | 下标索引 | - | 可以看做线程安全ArrayList,已弃用,由 CopyOnWriteArrayList 或者 Collections.synchronizedList 替代 |
LinkedList | List | 有序 | 可重复 | 不安全 | 允许空值 | 查找效率底,添加/删除效率高 | - | 双向链表 | 下标索引 | 当对一列数据的前面或者中间执行添加或者删除操作时,并且按照顺序访问其中的元素时,要使用LinkedList | LinkedList 提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用 |
Stack | List | 有序 | 可重复 | 安全 | 允许空值 | 查找效率高,添加/删除效率低,整体效率低 | - | 无索引 | - | 继承自Vector,堆栈,后进先出,已弃用,由 ArrayDeque 或者 ConcurrentLinkedQueue 替代 | |
HashMap | Map | 无序,无法保证键值对的顺序 | key不可重复,value可重复,使用 hashCode 与 equals 方法保证key不重复 | 不安全 | 允许空值,key允许一个null,value允许多个null | HashMap通常比TreeMap、LinkedHashMap 快,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap 慢 | - | JDK7:数组+链表;JDK8:数组+链表+红黑树 | 无索引 | 场景 | 遍历使用的是Iterator迭代器,系统调用key的 hashCode() 方法得到其 hashCode 值,得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定key—value的存储位置 |
Hashtable | Map | 无序,无法保证键值对的顺序 | key 不可重复,value 可重复,使用 hashCode 与 equals 方法保证 key 不重复 | 安全 | 不允许空值 | 整体效率低 | - | 哈希表 | 无索引 | - | 遍历使用的是 Enumeration 列举 |
TreeMap | Map | 有序 |
key 不可重复,value 可重复,使用 hashCode 与 equals 方法保证 key 不重复 |
不安全 | key不可以,value可以 |
TreeMap通常比HashMap、Hashtable要慢, 因为TreeMap底层采用红黑树来管理key-value。 整体效率低 |
1. 自然排序:TreeMap 的所有 key 必须实现 Comparable 接口,而且所有的 key 应该是同一个类的对象,否则会抛出ClassCastException。 2.定制排序:创建TreeMap时,传入一个 Comparator 对象,该对象负责对TreeMap中的所有key进行排序。 |
红黑树 | 无索引 | 需要基于key排序的场景 | - |
LinkedHashMap | Map | 有序(可分为插入顺序和访问顺序两种) | key 不可重复,value 可重复,使用 hashCode() 与 equals() 方法保证 key 不重复 | 不安全 | key不可以,value可以 | LinkedHashMap比HashMap慢一点,因为它需要链表来维护key-value的插入顺序。整体效率低 | - | 基于HashMap和双向链表来实现 | 无索引 | 当我们希望有顺序地去存储 key-value时,就需要使用 LinkedHashMap | 双向链表用来维护顺序 |
WeakHashMap | Map | 无序,无法保证键值对的顺序 | key 不可重复,value 可重复,使用 hashCode 与 equals 方法保证 key 不重复 | 不安全 | 允许空值,key允许一个null,value允许多个null | - | - | 哈希表(数组+链表) | 无索引 | 适用于缓存的场景 | - |
EnumMap | Map | 无序,无法保证键值对的顺序 | key 不可重复,value 可重复 | 不安全 | 允许空值,key允许一个null,value允许多个null | 相比HashMap,EnumMap的性能和速度要快很多 | - | 数组 | 有索引(通过ordinal方法取索引) | - | - |
IdentityHashMap | Map | 无序,无法保证键值对的顺序 | key 可重复,value 可重复,使用 hashCode 与 equals 方法保证 key 不重复 | 不安全 | 允许空值,key允许一个null,value允许多个null | 速度要比HashMap快一点 | - | 哈希表(数组+链表) | 无索引 | 比如序列化、深度复制、记录对象代理等场景;两个对象是同一个类型的对象,而且两个对象的数据完全相同,对于jvm来说,他们也是完全不同的,如果要用一个容器来记录这样的对象,就需要用 IdentityHashMap |
IdentityHashMap中key能重复,因为 key 比较的方法是 == ,所以若要存放两个相同的 key,就需要存放不同的地址
|
Properties | Map | 无序,无法保证键值对的顺序 | key 不可重复,value 可重复,使用 hashCode 与 equals 方法保证 key 不重复 | 不安全 | 不允许存null | - | - | 哈希表 | 无索引 | 配置文件 | Properties类表示一组持久的属性。 Properties可以保存到流中或从流中加载。 属性列表中的每个键及其对应的值都是一个字符串 |
TreeSet | Collection | 有序 | 不可重复,同样需要重写 hashCode 和 equals 方法,TreeSet 判断两个对象不相等的方式是两个对象通过 equals 方法返回 false,或者通过 compareTo 方法比较没有返回 0 | 不安全 | 不允许空值 | 查找效率高,添加/删除效率低,整体效率高 |
1.自然排序,使用 compareTo 方法来比较元 素之间大小关系,然后将元素按照 升序排列。2.定制排序,实现 Comparator 接口的compareTo 方法 |
红黑树,基于 TreeMap 实现 | 无索引 | 需要排序的场景 | 只能添加同一种类型的对象 |
HashSet | Set | 无序(即存取顺序不一致) | 不可重复,使用 hashCode() 与 equals() 方法保证 key 不重复 | 不安全 | 允许存null,只能存1个null | 具有良好的存取和查找性能,其性能通常都优于 TreeSet | - | 哈希表(数组+链表),基于 HashMap 实现 | 无索引 | 需要快速查找的场景 | - |
LinkedHashSet | Set | 有序 | 不可重复 | 不安全 | 允许空值 | LinkedHashSet 插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能 | - | 双向链表和哈希表,基于 LinkedHashMap 实现 | 无索引 | - | 链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性 |
Java中常用集合类对比_集合比较相关推荐
- java中的集合_你真的了解Java中的集合类么?
Java中的集合类很多,有各种List,各种Map,各种Set.那么这么多类,我们怎么来区分它们呢? 我们来看某个集合类是以什么结尾的,如果以List结尾,那说明这个集合类的本质就是一个List,Li ...
- 【Java中常用的集合类】
1.Java中集合框架图 2.List 和 Set 的区别? List , Set 都是继承自Collection 接口 List 特点:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重 ...
- java中数据结构的应用_Java集合入门 (二)常用数据结构和应用场景-数组
Java极客 | 作者 / 铿然一叶 这是Java极客的第 48 篇原创文章 一.数组的特点 1.数组大小固定 2.一个数组只能存储相同数据类型 3.随机访问性能高 4.存储空间连续,这样可以 ...
- 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...
程序员的成长之路互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, ...
- Java中常用的类,包,接口
Java中常用的类,包,接口 包名 说明 java.lang 该包提供了Java编程的基础类,例如 Object.Math.String.StringBuffer.System.Thread等,不使用 ...
- java高级特性2_Java高级特性 第2节 java中常用的实用类(1)
一.Java API Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用:此外也特指API的说明文档,也称帮助文档. Java中常用的包: jav ...
- java 中常用的类
java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l static double abs(double a) 获取double 的绝对值 l sta ...
- java中常用API、Scanner类、匿名对象、Random类、ArrayList类、对象数组
java中常用API: API:Application Programming Interface,应用程序编程接口.Java API是JDK中提供给我们使用的类的说明文档.这些类将底层的代码实现封装 ...
- JAVA中常用接口的介绍及使用示例 java lang Comparable
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! JAVA ...
最新文章
- 第十九篇:主题建模Topic Modelling
- linux 网络编程学习
- 十分钟理解线性代数的本质_数学对于编程来说到底有多重要?来看看编程大佬眼里的线性代数!...
- 2362:Square 能否拼接为正方形 . DFS+回溯
- 迪普交换机清空配置_交换机环路详解
- Netty与mina的比较
- 【Python】line.strip().split(‘,‘)含义
- canvas--绘制路径
- 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(6)——Training
- .Net报文请求转义
- C#_自动化测试3_controll IE
- 如何有效地卸载office
- 【年度总结】于无声处听惊雷-2016年度总结
- 设计低反射率触摸屏显示器以实现阳光下的可读性
- 【详细】国内网站备案流程与步骤
- Excel数值累加操作演示(一)
- 【leetcode 993】【二叉树的堂兄弟节点】
- 本地搭建自己的kindle书库,并实现公网访问
- 【Java学习路线之JavaWeb】JSP教程
- Win7 瘦身 winsxs文件夹
热门文章
- graphql 有必要吗_您准备好观看GraphQL了吗?
- stripe pay_J2Pay –简介
- 将MongoDB集成到您的Spring项目中
- java集成lucene_将Lucene搜索集成到应用程序中
- guice 实例_使用Google Guice消除实例之间的歧义
- java 事件通知_正确获取Java事件通知
- akka使用_使用Akka简化交易系统
- Java equals()和hashCode()
- q7goodies事例_Java 8 Friday Goodies:新的新I / O API
- ug弹簧可变性装配_弹簧可配置魔术