Collection
- int size()
- boolean isEmpty()
- Iterator
iterator()
List
- ArrayList
- 默认初始容量10,当超出当前容量时扩容,新容量=原容量的 0.5倍+1(第一次扩容后为16)
- 数组实现的线性表,中间位置插入或者删除元素时需要对数组进行拷贝复制。
- 适合随机查找和遍历,不适合插入和删除。
- LinkedList
- 使用双向循环链表实现
- 很适合数据的动态插入和删除
- Vector
- 数组实现,线程安全
- 默认初始容量10,当超出当时容量时扩容,新容量=原容量的1倍(第一次扩容后为20)
-
Set
EnumSet, 创建一个包含指定元素类型的所有元素的枚举 set
- HashSet,内部由HashMap实例实现
- LinkedHashSet,内部由LinkedHashMap实例实现
-
Queue
LinkedList
- Deque定义了在Queue两端进行insert和remove函数(addFirst/addLast)
- LinkedList通过Deque实现
PriorityQueue
HashMap
- 链接法解决冲突,链表大小超过8时会自动转化为红黑树,当删除小于6时重新变为链表
- 线程不安全,在扩容的时候put时可能会产生了死链,由此会在get时造成了CPU 100%
- add,delete和contain方法具有恒定的时间复杂度O(1)
- 默认初始容量16,长度始终是2的n次方,扩容加载因子为0.75,第一个临界点在当HashMap中元素的数量等于table数组长度加载因子(160.75=12),如果超出则按扩容为原来的2倍(第一次扩容后为32)。
- LinkedHashMap
- 与HashMap原理相同,内部由双向链表维持着key的顺序
- add,delete,contain时间复杂度是O(1)
- TreeMap
- 内部由红黑树实现,按键的大小维持数据顺序
- add,delete 和contain方法的时间复杂度为O(nlgn)
- Hashtable
- 不允许出现键与值等于null,synchronized实现线程安全
- 默认初始容量为11,扩容加载因子为0.75,扩容增量:2*原数组长度+1(一次扩容后是容量为23)。
- EnumMap
- IdentityHashMap
- Properties
- WeakHashMap
工具类
Collections
集合操作的工具类,提排序/查找等方法
- Collections.sort() 使用Timsort进行排序
- Collections.synchronizedCollection() 将一个集合变为线程安全的集合,装饰器模式利用监视器锁包装操作
Collections.singletonList() 无法被修改的list
Arrays
Arrays.toString()
-
RandomAccess
RandomAccess接口是一个标志接口,用下表访问集合中的元素更快
Iterator
fail-fast:在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改,则会抛出Concurrent Modification Exception。迭代器在遍历时直接访问集合中的内容,每当迭代器每次遍历下一个元素时会比较modCount的值,修改集合内容会改变modCount。Collection集合采用了fail-fast机制。
- fail-safe: 在用迭代器遍历一个集合对象时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。java.util.concurrent包下的容器都是安全失败。 ```java import java.util.Iterator; import java.util.NoSuchElementException;
public class CountDownIterable implements Iterable
private Integer num;
public CountDownIterable(Integer num) {
this.num = num;
}
@Override
public Iterator<Integer> iterator() {
return new CountDownIterator(num);
}
private static class CountDownIterator implements Iterator<Integer> {
Integer num;
public CountDownIterator(Integer num) {
if (num <= 0) {
throw new IllegalArgumentException();
}
this.num = num;
}
@Override
public boolean hasNext() {
return num > 0;
}
@Override
public Integer next() {
if (num <= 0) {
throw new NoSuchElementException();
}
return num--;
}
}
public static void main(String[] args) {
CountDownIterable countDown = new CountDownIterable(10);
for (Integer i : countDown) {
System.out.println(i);
}
}
} ```
参考:
https://blog.csdn.net/learningcoding/article/details/79983248
https://www.jianshu.com/p/4bb01e139cda