集合实现类集合接口有序性唯一性线程安全空值性能排序数据结构索引应用场景备注ArrayListList有序可重复不安全允许空值查找效率高,添加/删除效率低使用 Collections.sort() 传入ArrayList,会采用默认的方式进行排序(字典序)。自己实现 Comparator 接口,再使用 Collections.sort() 来实现自定义排序数组下标索引适合快速随机查找和遍历,不适合插入和删除,当操作是在一列数据的后面添加数据而不是在前面或者中间,并需要随机地访问其中的元素时,使用ArrayList性能比较好数组空间不够,ArrayList默认扩展50%的大小。VectorList有序可重复安全允许空值查找效率高,添加/删除效率低-数组下标索引-可以看做线程安全ArrayList,已弃用,由 CopyOnWriteArrayList 或者 Collections.synchronizedList 替代LinkedListList有序可重复不安全允许空值查找效率底,添加/删除效率高-双向链表下标索引当对一列数据的前面或者中间执行添加或者删除操作时,并且按照顺序访问其中的元素时,要使用LinkedListLinkedList 提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用StackList有序可重复安全允许空值查找效率高,添加/删除效率低,整体效率低-无索引-继承自Vector,堆栈,后进先出,已弃用,由 ArrayDeque 或者 ConcurrentLinkedQueue 替代HashMapMap无序,无法保证键值对的顺序key不可重复,value可重复,使用 hashCode 与 equals 方法保证key不重复不安全允许空值,key允许一个null,value允许多个nullHashMap通常比TreeMap、LinkedHashMap 快,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap 慢-JDK7:数组+链表;JDK8:数组+链表+红黑树无索引场景遍历使用的是Iterator迭代器,系统调用key的 hashCode() 方法得到其 hashCode 值,得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定key—value的存储位置HashtableMap无序,无法保证键值对的顺序key 不可重复,value 可重复,使用 hashCode 与 equals 方法保证 key 不重复安全不允许空值整体效率低-哈希表无索引-遍历使用的是 Enumeration 列举TreeMapMap有序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排序的场景-LinkedHashMapMap有序(可分为插入顺序和访问顺序两种)key 不可重复,value 可重复,使用 hashCode() 与 equals() 方法保证 key 不重复不安全key不可以,value可以LinkedHashMap比HashMap慢一点,因为它需要链表来维护key-value的插入顺序。整体效率低-基于HashMap和双向链表来实现无索引当我们希望有顺序地去存储 key-value时,就需要使用 LinkedHashMap双向链表用来维护顺序WeakHashMapMap无序,无法保证键值对的顺序key 不可重复,value 可重复,使用 hashCode 与 equals 方法保证 key 不重复不安全允许空值,key允许一个null,value允许多个null--哈希表(数组+链表)无索引适用于缓存的场景-EnumMapMap无序,无法保证键值对的顺序key 不可重复,value 可重复不安全允许空值,key允许一个null,value允许多个null相比HashMap,EnumMap的性能和速度要快很多-数组有索引(通过ordinal方法取索引)--IdentityHashMapMap无序,无法保证键值对的顺序key 可重复,value 可重复,使用 hashCode 与 equals 方法保证 key 不重复不安全允许空值,key允许一个null,value允许多个null速度要比HashMap快一点-哈希表(数组+链表)无索引比如序列化、深度复制、记录对象代理等场景;两个对象是同一个类型的对象,而且两个对象的数据完全相同,对于jvm来说,他们也是完全不同的,如果要用一个容器来记录这样的对象,就需要用 IdentityHashMapIdentityHashMap中key能重复,因为 key 比较的方法是
==
,所以若要存放两个相同的 key,就需要存放不同的地址PropertiesMap无序,无法保证键值对的顺序key 不可重复,value 可重复,使用 hashCode 与 equals 方法保证 key 不重复不安全不允许存null--哈希表无索引配置文件Properties类表示一组持久的属性。 Properties可以保存到流中或从流中加载。 属性列表中的每个键及其对应的值都是一个字符串TreeSetCollection有序不可重复,同样需要重写 hashCode 和 equals 方法,TreeSet 判断两个对象不相等的方式是两个对象通过 equals 方法返回 false,或者通过 compareTo 方法比较没有返回 0不安全不允许空值查找效率高,添加/删除效率低,整体效率高1.自然排序,使用 compareTo 方法来比较元素之间大小关系,然后将元素按照升序排列。2.定制排序,实现 Comparator 接口的compareTo 方法红黑树,基于 TreeMap 实现无索引需要排序的场景只能添加同一种类型的对象HashSetSet无序(即存取顺序不一致)不可重复,使用 hashCode() 与 equals() 方法保证 key 不重复不安全允许存null,只能存1个null具有良好的存取和查找性能,其性能通常都优于 TreeSet-哈希表(数组+链表),基于 HashMap 实现无索引需要快速查找的场景-LinkedHashSetSet有序不可重复不安全允许空值LinkedHashSet 插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能-双向链表和哈希表,基于 LinkedHashMap 实现无索引-链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性