引言
在使用Java时,正确的集合类型选择,能帮我们提高代码的运行效率;
那么常见的单例集合类型有哪些呢?
按照类型来分的话单例集合总体分为三种:List、Set、Queue;
List
List集合的特点是有序,并且允许出现重复元素;
ArrayList:基于Object[]]数组实现,可以根据下表遍历数组,适用于查询遍历的使用场景;
LinkedList:基于双向链表实现,不具有下标,但在插入、删除等场景下有不错的性能表现;
Vector:基于Object[]数组实现,是基于synchronized实现的线程安全的集合,性能略差;
Stack:Vector的子类,提供了FILO的栈结构;
CopyOnWriteArrayList:基于Object[]数组实现,使用ReentrantLock实现线程安全(哈希冲突的情况下);
Set
Set集合的特点是无序,且不允许重复;
HashSet:HaspMap的子类,采用Key存储数据,实现了元素的无序且唯一;
LinkedHashSet:HaspSet的子类,元素唯一,有序;
TreeSet:TreeMap的子类,自动排序或者是按照自定义规则排序;
Queue
Queue集合的特点是FIFO先进先出;
LinkedList:基于双向链表实现的队列集合;
PriorityQueue:优先队列,内部数组结构是一个基于Object[]数组实现的一个小顶堆,在小顶堆中,根节点始终是堆中具有最小值的元素,所以PriorityQueue非常适合需要按优先级顺序处理业务的场景;
BlockingQueue:阻塞队列,线程安全,适合多线程并发的场景;
ArrayList和Vector的区别
初始容量:
ArrayList的初始容量默认为0,添加第一个元素时扩容为10;
扩容方式:
ArrayLis:t在元素超出数组容量时扩容机制是原数组长度X1.5;
Vector:扩容是原基础扩容1倍;
线程安全:
ArrayList:线程不安全;
Vector:线程安全,基于synchronized实现;
执行效率:
Vector在每次操作时需要重复加锁---释放锁,所以性能较差,ArrayList相对具有较好的性能;
ArrayList和LinkedList的区别
底层数据结构:
ArrayList:基于数组实现;
LinkedList:基于双向链表实现;
插入和删除元素:
ArrayList:在插入和删除的场景中需要对整个数组进行复制移动,性能消耗大;
LinkedList:在插入和删除场景中只影响相邻的元素,性能较优;
查询和遍历元素:
ArrayList:可以根据下标查找和遍历,性能较优;
LinkedList:需要借助迭代器遍历,性能较差;
实现RandomAccess:
ArrayList:实现了RandomAccess接口,因为它内部是数组结构,内部空间连续,可以通过下标随机访问;
LinkedList:没有实现RandomAccess接口,它内部是链表结构,空间不连续,无法通过下标快速访问;
ArrayList的扩容机制
初始化时,不带参时默认初始容量为0,写入第一个元素时,扩容为10;
初始化时,带参构造则按照所带参数初始化容量;
当数组容量满了的时候,会按照原容量的1.5倍扩容;
最大容量不会超过Integr.Max_Value;