Java基础 - 集合
集合包括常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等。
-
Arraylist
ArrayList是实现List接口的动态数组,初始容量10,即数组大小。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作(数据向新数组的重新拷贝)。不是同步的,多线程中使用,最好在创建的时候保证同步。
例如 :
List list = Collections.synchronizedList(new ArrayList());
新建:即创建一个transient修饰的数组。
新增:
方法:add(E e)、add(int index, E element)、addAll(Collection<? extends E> c)、addAll(int index, Collection<? extends E> c)、set(int index, E element)
通常会先一步检测容器大小,查看是否需要扩容。调用ensureCapacity()方法对ArrayList集合进行扩容操作
public void ensureCapacity(int minCapacity) { //修改计时器 modCount++; //ArrayList容量大小 int oldCapacity = elementData.length; /* * 若当前需要的长度大于当前数组的长度时,进行扩容操作 */ if (minCapacity > oldCapacity) { Object oldData[] = elementData; //计算新的容量大小,为当前容量的1.5倍 int newCapacity = (oldCapacity * 3) / 2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; //数组拷贝,生成新的数组 elementData = Arrays.copyOf(elementData, newCapacity); } }
若为指定index位置插入元素add(int index, E element),会调用System.arraycopy()方法,目的就是将index位置空出来以供新数据插入,这里需要进行数组数据的右移,这是非常麻烦和耗时的,所以如果指定的数据集合需要进行大量插入操作,推荐使用LinkedList。
删除:
方法:remove(int index)、remove(Object o)、removeRange(int fromIndex, int toIndex)、removeAll()
删除元素后,会调用System.arraycopy(...)方法对剩余元素位置进行调整
获取:
方法:get(int index)
由于ArrayList是动态数组,所以我们完全可以根据下标来获取ArrayList中的元素,而且速度还比较快,故ArrayList适于随机访问
-
LinkedList
LinkedList是实现List接口的链表,插入和删除时优于ArrayList,而随机访问则比ArrayList逊色些。