一、前言
集合类是Java数据结构的实现。它是java.util包中的重要内容,允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。
二、Java集合类框架图
三、Java集合类型
Java集合框架主要包括两种类型的容器,一种是集合(Collection),另一种是图(Map)。
一、Collection接口
Collction接口有三种类型,分别是List,Set和Queue;
List常用的实现类ArrayList、LinkedList、Vector;
Set常用的实现类TreeSet、HashSet、LinkedHashSet;
1.List
List接口扩展自Collection,它可以定义一个允许重复的有序集合,用数组存储元素,可以插入多个null元素,同时它增加了面向位置的操作,允许在指定位置上操作元素,也就是建立了索引,可以用for进行循环遍历。
1.1ArrayList
ArrayList用数组存储元素,数组容量可动态扩建,如果元素个数超过了数组的容量,会自动进行扩容(扩容机制原理);
ArrayList是线程不安全的集合(ArrayList线程不安全底层原理);
1.2LinkedList
LinkedList用链表存储元素,链表和数组最大的区别在于它们对元素的存储方式的不同,导致它们在对数据进行操作时,效率也会不同;
PS:数组元素增删慢,查找快,而链表却相反,增删快,查找慢(数组连续内存空间,查找速度快,增删慢;链表充分利用了内存,存储空间是不连续的,首尾存储上下一个节点的信息,所以寻址麻烦,查找速度慢,但是增删快);数组和链表的区别
1.3Vector
Vector用数组存储元素,容量能够动态的增长,它的很多实现方法都加入了同步语句,因此是线程相对安全的;(Vector是相对安全的线程)
2.Set
Set接口扩展子Collection,它是不允许存储重复元素的无序集合,只允许一个null元素,不具备索引,因此不可以用普通for循环遍历(可以用强for循环和迭代器)底层数据结构采用的是哈希表
PS:这里的无序指的是存入和取出的顺序不一致,取出的时候会根据存入数据的属性进行排序
哈希表=数组+链表(如果链表长度超过8,自动转换为红黑树)
2.1TreeSet
TreeSet扩展自AbstractSet,它是一个有序的Set集合,通过TreeMap实现(TreeSet的实现)
2.2HashSet
HashSet是一个用于实现Set接口的具体类,通过散列法的机制来存储信息,元素并没有以某种特定顺序存放,底层是HashMap;
2.3LinkedHashSet
LinkedHashSet是用一个链表来扩展HashSet类,以元素插入的顺序来维护集合的链表,允许以插入的顺序在集合中迭代,底层是HashMap;
二、Map接口
Map接口有两种类型,分别是HashMap和TreeMap;
常用的实现类有HashMap、LinkedHashMap、TreeMap;
1.HashMap
HashMap是基于哈希表的Map接口的非同步实现的双列的无序集合,元素以key-values形式存储,它根据键的hashCode值存储数据,根据键可以获取值,具有很快的访问速度,同时,key不可以重复,因此最多只允许一条记录的key为null,底层数据结构是哈希表(HashMap底层原理);
1.1LinkedHashMap
LinkedHashMap继承自HashMap,它主要是用链表实现来扩展HashMap类,因此它是有序的HashMap(LinkedHashMap底层原理);
2.TreeMap
TreeMap基于红黑树数据结构的实现,实现SortMap,能够把它保存的记录根据键排序,也可以指定排序的比较器(键值使用Comparable或Comparator接口来排序),当用Iterator遍历TreeMap时,得到的记录是排过序的,同时不允许key值为空,非同步的;
四、集合类型的线程安全性
线程安全的集合:Vector、Hashtable;
线程不安全的集合:ArrayList、TreeSet、HashSet、LinkedHashSet、HashMap、LinkedHashMap、TreeMap;
PS:高并发的情况下,使用线程不安全的集合,容易抛出ConcurrentModificationException异常;
一、如何解决集合的线程不安全问题;
java中的JUC为我们提供了一些解决并发问题的工具类;
ArrayList转换为线程安全的类,使用:CopyOnWriteArrayList(实现线程安全的原理);
Set转换为线程安全的类,使用:CopyOnWriteArraySet(实现线程安全的原理);
Map转换为线程安全的类,使用: ConcurrentHashMap(实现线程安全的原理);
PS:也可以使用Arrays、Collections集合工具类;
五、Java的多线程和锁机制
参考:Java的多线程和锁机制