集合实现类 | 集合接口 | 有序性 | 唯一性 | 线程安全 | 空值 | 性能 | 排序 | 数据结构 | 索引 | 应用场景 | 备注 |
---|---|---|---|---|---|---|---|---|---|---|---|
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 实现 | 无索引 | - | 链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性 |