Java集合框架
目录
概况
Collection
List
ArrayList
- ArrayList由数组实现数据存储
- ArrayLisst基本等同于Vector,但是ArrayList线程不安全,多线程不推荐使用
ArrayList无参构造
ArrayList list = new ArrayList();
for (int i = 0; i < 10; i++) {
list.add(i);
}
list.add(11);
- 如果是无参构造,刚开始ArrayList是一个空数组
- 第一次扩容,初始大小为10
3. 以后扩容,按照1.5倍扩容
int newCapacity = oldCapacity + (oldCapacity >> 1);
ArrayList有参构造
ArrayList list = new ArrayList(8);
for (int i = 0; i < 10; i++) {
list.add(i);
}
list.add(11);
- 以指定的长度初始化
- 扩容直接按照1.5倍扩容
Vector
- Vector底层是一个数组
- Vector是线程安全的,但是效率慢
Vector无参构造
Vector vector = new Vector();
for (int i = 0; i < 10; i++) {
vector.add(i);
}
vector.add(11);
- 无参构造直接调用有参构造,并且初始值为10
- 按照2倍扩容
Vector有参构造
Vector vector = new Vector(6);
for (int i = 0; i < 6; i++) {
vector.add(i);
}
vector.add(11);
- 按照指定的长度初始化数组
- 按2倍扩容
LinkedList
- 底层是一个双向链表
- 可重复添加元素、可添加任意元素
- 线程不安全
- 增加、删除效率高
LinkedList添加元素
LinkedList linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);
LinkedList删除元素
LinkedList linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);
linkedList.remove(0);
Set
HashSet
- HashSet底层是一个HashMap,第一次添加数据,table数组扩容到16
- 如果table数组到了临界值 16 * 0.75 =》12,会扩容到32,新的临界值即为24,以此类推
- 每添加一个node,size都会++
- 在Java8中,如果一条链表的元素到达8个,并且 table的大小大于等于64,就会转化为红黑树
HashSet hashSet = new HashSet();
hashSet.add("java");
hashSet.add("python");
hashSet.add("java");
LinkedHashSet
- 底层是一个LinkedHashMap,维护了一个hash表和双向链表
- 每个结点都有before和after
- 遍历LinkedHashSet是有序的
- 底层原理和HashSet相同
TreeSet
- 底层是一个TreeMap
- 构造函数传入的比较器赋给了 TreeMap 的comparator
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
private final Comparator<? super K> comparator;
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
- 排序规则
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}
Map
HashMap
- 以键值对形式存储
- 线程不安全
- 如果添加相同的key,会覆盖之前的值
- 为了方便遍历,有一个EntrySet存放HashMap$Node的引入地址
- 底层原理同上HashSet
Hashtable
- 以键值对形式存储
- 线程不安全
- key和value都不能为null
- 扩容:int newCapacity = (oldCapacity << 1) + 1; => oldCapacity * 2 +1
- 初始化大小为11
public Hashtable() {
this(11, 0.75f);
}
TreeMap
同TreeSet