Collection(集合)
对应的工具类Collections,包含排序、洗牌等操作
List
ArrayList
本质是Object数组
private transient Object[] elementData
默认数组的长度为10
add时超过10则数组长度增加原来长度的一半
list变数组:(T[])list.toArray(newT[list.size()]);
LinkedList
本质是双向的链表
private static class Node<E>{
E item;
Node<E> next;
Node<E> prev;
}
add是new Node 节点,然后关联起来
Set(同数学上的集合,元素不重复)
HashSet
本质是HashMap
private transient HashMap<E, Object>map ;
可以用来做随机抽奖的容器
sortedSet
TreeSet
本质是 TreeMap
构造时可以加入comparator 参数,自定义定义排序规则
add时用key来存值,value为一个object对象
Map(字典)
HashMap
本质是Entry数组和单向链表的结合
transient Entry[] table
static Entry <K,V> implementsMap.Entry<K,V>{
final K key;
V value;
Entry<K,V> next;
Final int hash;
}
默认数组长度为16
增加容量时2倍增加
put元素时,会先对比hash值和equals内容。判断键值是否相等。
如图:
可以用来做统计文字出现次数的容器
SortedMap
TreeMap
遍历容器的方法:
1. for循环Iterator
为什么重写类中的equals方法必须重写hashcode
将对象放到集合(set、map)时会涉及对比hashcode的情况。如果不重写调用的hashcode方法则会调用object类的hashcode方法(对象的地址),这样会造成内容相同的对象,在内存地址不同的情况下,会被存入set、map中。但是集合中要求对象中的内容不能重复的。这样就矛盾了