Collection集合

  |  

集合框架

没有 java.util.concurrent 下面的线程安全容器添加进来;也没有列出 Map 容器

线型数据结构的集合

Vector、ArrayList、LinkedList均为线型的数据结构。

区别:

底层实现方式

ArrayList 内部用数组来实现;LinkedList 内部采用双向链表实现;Vector 内部用数组实现。

读写机制
  1. ArrayList

    • 在执行插入元素是超过当前数组预定义的最大值时,数组需要扩容,扩容过程需要调用底层 System.arraycopy()方法 进行大量的数组复制操作,扩容是增加50%的容量;

    • 删除元素时并不会减少数组的容量(如果需要缩小数组容量,可以调用 trimToSize()方法 );

    • 在查找元素时要遍历数组,对于非null的元素采取equals的方式寻找。
  2. LinkedList

    • 在插入元素时,须创建一个新的Entry对象,并更新相应元素的前后元素的引用;在查找元素时,需遍历链表;
    • 在删除元素时,要遍历链表,找到要删除的元素,然后从链表上将此元素删除即可。
  3. Vector与ArrayList仅在插入元素时容量扩充机制不一致。

    • 对于Vector,默认创建一个大小为10的Object数组,并将capacityIncrement设置为0;当插入元素数组大小不够时,如果capacityIncrement大于0,则将Object数组的大小扩大为现有size+capacityIncrement;如果capacityIncrement<=0,则将Object数组的大小扩大为 现有大小的2倍(也就是扩容1倍)。
读写效率
  • ArrayList对元素的增加和删除都会引起数组的内存分配空间动态发生变化。因此,对其进行插入和删除速度较慢,但检索速度很快。

  • LinkedList由于基于链表方式存放数据,增加和删除元素的速度较快,但是检索速度较慢。

线程安全性

ArrayList、LinkedList为非线程安全;Vector是基于 synchronized 实现的线程安全的ArrayList。

需要注意的是:单线程应尽量使用ArrayList,Vector因为同步会有性能损耗;即使在多线程环境下,我们可以利用 Collections 这个类中为我们提供的 synchronizedList(List list)方法 返回一个线程安全的同步列表对象。

1
2
3
4
//API
static <T> List<T> synchronizedList(List<T> list)
//举例
List list = Collections.synchronizedList(new ArrayList());

Copyright © 2018 - 2020 Kuanger All Rights Reserved.

访客数 : | 访问量 :