- 常用集合图录
- List 接口的实现类
- ArrayList
- ArrayList 底层采用数组来存储元素,当数组满的时候,需要对数组进行扩容,会生成一个新的数组,新的数组大小为原数组大小的1.5倍,会比较慢。然后将老的数据复制到新的数组中,这个需要一定的时间,如果扩容之后只新增了一个元素,此时可能会造成一些空间的浪费。
- 非线程安全
- LinkedList
- LinkedList 底层采用双向链表来存储元素,所以追加元素的时候,只需要将最后一个元素next指针指向新的元素就可以了,非常的快。
- 非线程安全
- Vector
- Vector与ArrayList一样,也是通过数组实现的
- Vector是线程安全的,同步需要更高的花销,效率上比ArrayList会慢些
- 如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.如果在集合中使用数据量比较大的数据,用vector有一定的优势
- Stack
- 继承自Vector,拥有栈先进后出,无法使用下标等特性
- ArrayList
-
Queue的接口实现类
-
Priority Queue优先级队列
-
会自动帮忙排序
-
-
-
Set接口实现类
-
Hashset
-
唯一,无序
-
HashSet是哈希表结构,主要利用HashMap的key来存储元素,计算插入元素的hashCode来获取元素在集合中的位置;
-
底层由HashMap(后面讲解)来实现,为哈希表结构,新增元素相当于HashMap的key,value默认为一个固定的Object。在我看来,HashSet相当于一个阉割版的HashMap;
-
由于Set集合中并没有角标的概念,所以并没有像List一样提供get()方法。当获取HashSet中某个元素时,只能通过遍历集合的方式进行equals()比较来实现
-
线程不安全,若2个线程同时操作HashSet,必须通过代码实现同步;
-
-
TreeSet
-
唯一,有序
-
TreeSet是红黑树结构,每一个元素都是树中的一个节点,插入的元素都会进行排序;
-
线程不安全
-
-
-
Map接口实现类
-
HashMap
-
线程不安全
-
Map 在 Java 中表示为键值对存储结构 Map<K,V>,
-
首先有一个每个元素都是链表(可能表述不准确)的数组,当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这时就添加到同一hash值的元素的后面,他们在数组的同一位置,但是形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率
-
遍历方法:entries, for, Iterator
-
-
ConcurrentHashmap
-
jdk7采用分段锁segment 来实现线程安全,jdk8后使用synconize
-
-
HashTable
-
使用全局锁synconize线程安全
-
-
TreeMap
-
主要用于存入元素的时候对元素进行自动排序,迭代输出的时候就按排序顺序输出
-
-