先通过一张图来展示java集合类之间的继承关系
先总的来说一下list,set,map的特点
list里存放数据是有序的,它的顺序是按照存放顺序,元素以线性方式存储,集合中可以存放重复对象。
set中存放数据是无序的,它里面的数据也不可以重复,集合中的数据不按特定的顺序排序,只是简单的把数据放入集合中。
map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。map是有序的,它是以key-value的方式存储数据,不可以存在相同的key,但是可以存在相同的value。map集合中的key是存放在set集合中。
一、List
- ArrayList
是以数组来实现,在查找是速度比较快,但是在增加和删除的时候就比较慢。可以有重复和有空值
它的初始大小是是10,然后每次增加是增加当前的0.5倍的容量。
它增加数据使用的是add()方法
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
ensureCapacityInternal()方法是来判断传入数据之后容量是否大于当前容量,如果大于的话就扩容,当前的容量乘以1.5,然后把老数组放入新数组,然后增加数据。
-
LinkedList
LinkedList是一个双向循环链表,适合对插入和删除操作比较多的时候使用,但是LinkedList访问速度比较慢。 -
Vector
Vector和ArrayList是比较像的,它们都是基于索引,都是有数组来实现,然后都是有序的,数据都可以重复,允许有空值,可以随机访问。
但是Vector是线程安全的,但是ArrayList比Vector快。因为ArrayList不需要同步,ArrayList使用的比较多。
二、Set
- HashSet
哈希表存放的是哈希值。HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的,所以取数据也是按照哈希值取得。可以写入空数据。 - TreeSet
TreeSet的特点是:
1.不能写入空数据 2.写入的数据是有序的 3.不写入重复数据
TreeSet可以自然排序,TreeSet是有排序规则的
三、Map
1. HashMap
HashMap的底层实现的也是使用数组,但是数组的每一项是一个链表。
HashMap的初始容量是16,然后它的加载因子是0.75。
HashMap扩容方法:当hashmap中的元素个数超过数组大小loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16,那么当hashmap中元素个数超过16* 0.75=12的时候,就把数组的大小扩展为2* 16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知hashmap中元素的个数,那么预设元素的个数能够有效的提高hashmap的性能。比如说,我们有1000个元素new HashMap(1000), 但是理论上来讲new HashMap(1024)更合适,不过上面已经说过,即使是1000,hashmap也自动会将其设置为1024。 但是new HashMap(1024)还不是更合适的,因为0.75* 1000 < 1000, 也就是说为了让0.75 * size > 1000, 我们必须这样new HashMap(2048)才最合适,既考虑了容量的问题,也避免了resize的问题。
resize过程:比如原来的hash是对n=3(即桶的个数)取余,这时往hashmap中放两个数,7和23,取余后分别是1和2,因此分别放入第一个桶和第二个桶中。扩容以后,n=6(即桶的个数变成了6个),此时要把原来table的Entry数组元素移到新的table中,那么使7和23分别对6取模,结果是1和5(和原来分别相差0和3,即要么相差0,要么相差一个原来n的大小),可以看到,经过rehash之后,元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置,这样大大减少了计算量。
再举一个例子,桶的个数为4(n=4),这时往hashmap中放两个数,11和21,取模后可知分别放入3号桶和1号桶中,此时扩容,n=8,再次取模后,11和21分别放在3号桶和5号桶(和原来相差0和4(原n=4))
2. HashTable
HashTbale也是使用的散列表,然后初始容量是11,它是线程安全的,是通过实现synchronized关键字保证线程安全。也是通过key-value来保存数据。
key和value都不允许出现null值。
四、线程安全的集合类
Vector,Stack,HashTable,enumeration