集合实现类 集合接口 有序性 唯一性 线程安全 空值 性能 排序 数据结构 索引 应用场景 备注
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中常用集合类对比_集合比较相关推荐

  1. java中的集合_你真的了解Java中的集合类么?

    Java中的集合类很多,有各种List,各种Map,各种Set.那么这么多类,我们怎么来区分它们呢? 我们来看某个集合类是以什么结尾的,如果以List结尾,那说明这个集合类的本质就是一个List,Li ...

  2. 【Java中常用的集合类】

    1.Java中集合框架图 2.List 和 Set 的区别? List , Set 都是继承自Collection 接口 List 特点:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重 ...

  3. java中数据结构的应用_Java集合入门 (二)常用数据结构和应用场景-数组

    Java极客  |  作者  /  铿然一叶 这是Java极客的第 48 篇原创文章 一.数组的特点 1.数组大小固定 2.一个数组只能存储相同数据类型 3.随机访问性能高 4.存储空间连续,这样可以 ...

  4. 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...

    程序员的成长之路互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, ...

  5. Java中常用的类,包,接口

    Java中常用的类,包,接口 包名 说明 java.lang 该包提供了Java编程的基础类,例如 Object.Math.String.StringBuffer.System.Thread等,不使用 ...

  6. java高级特性2_Java高级特性 第2节 java中常用的实用类(1)

    一.Java API Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用:此外也特指API的说明文档,也称帮助文档. Java中常用的包: jav ...

  7. java 中常用的类

    java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l  static double abs(double  a) 获取double 的绝对值 l  sta ...

  8. java中常用API、Scanner类、匿名对象、Random类、ArrayList类、对象数组

    java中常用API: API:Application Programming Interface,应用程序编程接口.Java API是JDK中提供给我们使用的类的说明文档.这些类将底层的代码实现封装 ...

  9. JAVA中常用接口的介绍及使用示例 java lang Comparable

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! JAVA ...

最新文章

  1. 第十九篇:主题建模Topic Modelling
  2. linux 网络编程学习
  3. 十分钟理解线性代数的本质_数学对于编程来说到底有多重要?来看看编程大佬眼里的线性代数!...
  4. 2362:Square 能否拼接为正方形 . DFS+回溯
  5. 迪普交换机清空配置_交换机环路详解
  6. Netty与mina的比较
  7. 【Python】line.strip().split(‘,‘)含义
  8. canvas--绘制路径
  9. 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(6)——Training
  10. .Net报文请求转义
  11. C#_自动化测试3_controll IE
  12. 如何有效地卸载office
  13. 【年度总结】于无声处听惊雷-2016年度总结
  14. 设计低反射率触摸屏显示器以实现阳光下的可读性
  15. 【详细】国内网站备案流程与步骤
  16. Excel数值累加操作演示(一)
  17. 【leetcode 993】【二叉树的堂兄弟节点】
  18. 本地搭建自己的kindle书库,并实现公网访问
  19. 【Java学习路线之JavaWeb】JSP教程
  20. Win7 瘦身 winsxs文件夹

热门文章

  1. graphql 有必要吗_您准备好观看GraphQL了吗?
  2. stripe pay_J2Pay –简介
  3. 将MongoDB集成到您的Spring项目中
  4. java集成lucene_将Lucene搜索集成到应用程序中
  5. guice 实例_使用Google Guice消除实例之间的歧义
  6. java 事件通知_正确获取Java事件通知
  7. akka使用_使用Akka简化交易系统
  8. Java equals()和hashCode()
  9. q7goodies事例_Java 8 Friday Goodies:新的新I / O API
  10. ug弹簧可变性装配_弹簧可配置魔术