常见的java集合类有:
线程安全的:Hashtable,ConcurrentHashMap,Vector,Stack(栈)
线程不安全的:HashMap,ArrayList,LinkedList,HashSet,TreeSet,TreeMap
如下图所示,java集合类主要由两个跟接口Collection和Map派生出来的,Collection派生出来了三个子接口,分别是List,Set,Queue,具体派生关系见下图:
- ArrayList:数组列表,或者说是动态数组,底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素。
- LinkedList: 底层数据结构是双向链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素(JDK1.6 之前为循环链表,JDK1.7 取消了循环。)
- Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
- LinkedHashSet底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。
- TreeSet底层数据结构采用红黑树来实现,元素唯一且已经排好序;
List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value;
Map相关集合类:
- HashMap:线程不安全,HashMap存储的值是没有顺序的,根据key的HashCode值来存储数据,根据key来获取他的value值,具有很快的访问速度。最多只允许一个key值为Null,多个时会覆盖,允许多条记录的Value为null。
- TreeMap:线程不安全,基于红黑树实现,保存的数据按照key值默认按升序排序,TreeMap不允许key的值为null。是非同步的。
- HashTable:所有方法都加了synchronized关键字,线程安全,Key和value的值都不能为null,支持线程的同步,也就是任意一个时刻只能有一个线程写HashTable,这也导致了HashTable写入数据的时候会比较慢。
- LinkedHashMap:保存了记录的插入顺序,key和value都可以为空,是非同步的。