声明:本文材料来源于bilibili动力节点视频,仅为学习使用!!!
Collection
1. List接口继承Collection接口,Collection接口继承了Iterable接口。
Iterable接口中定义了iterator()抽象方法,获得迭代器对象。
使用迭代器hashNext方法,next方法对Iterable实现类进行遍历。
所以但凡是Iterable下的子类均可以获得迭代器对象进行遍历。
iterator的remove方法移除某个下标的对象,将其返回并将指针前移一位。
2. Collection接口下还分List接口,Set接口:
List是有序可重复的,Set是无序不可重复的。有序是指存进去是什么顺序,取出来就是什么顺 序。无序是存进去是什么顺序,取出来不一定是原来的顺序。可重复是指存入的元素可以相同。 不可重复是指存入的元素不可以相同。
Collection中contains(Object o)方法会调用o.equals()方法,所以要求Collection中的元素重写equals方法。
3. List接口的常用实现类:ArrayList,LinkedList,Vector。
ArrayList:底层数据结构是数组。在内存中连续存储。有序可重复。有下标。优点是在末尾增加元素的效率高。根据下标查找元素效率高。缺点是随机增删元素效率低。不指定容量的情况下,默认容量是10,当实际容量等于最大容量时会自动扩容,增加到原来的1.5倍。扩容会导致运行效率降低,所以尽量避免扩容行为的出现。
LinkedList:底层数据结构是双向链表,在内存中分散存储。优点是随机增删元素效率高。缺点是查询某个元素效率低,每次都要遍历整个链表。
Vector:底层数据结构是数组,是线程安全的。类中每个方法都有synchronized关键字,所以Vector使用时效率低。
4. Set接口的常用实现类:HashSet,TreeSet(实现SortedSet可排序的set)
HashSet:底层数据结构是HashMap,无序不可重复。往HashSet中添加元素等于往HashMap的key部分添加元素。具体细节见下面HashMap。
TreeSet实现了SortedSet接口,SortedSet接口继承Set接口。所谓sort即可排序的。底层数据结构是TreeMap二叉树。装入的Set集合中的元素要实现Comparable接口的compareTo方法或者在创建HashSet对象时传入一个Comparator接口实现。需按自己的需求写比较规则。二叉树通过比较大小来判断进入左子树还是右子树。
private V put(K key, V value, boolean replaceOld) {
Entry<K,V> t = root;
if (t == null) {
addEntryToEmptyMap(key, value);
return null;
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
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 {
V oldValue = t.value;
if (replaceOld || oldValue == null) {
t.value = value;
}
return oldValue;
}
} while (t != null);
} else {
Objects.requireNonNull(key);
@SuppressWarnings("unchecked")
Comparable<? super K> k = (Comparable<? super K>) key;
do {
parent = t;
cmp = k.compareTo(t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else {
V oldValue = t.value;
if (replaceOld || oldValue == null) {
t.value = value;
}
return oldValue;
}
} while (t != null);
}
addEntry(key, value, parent, cmp < 0);
return null;
}
Map
1. Map也是集合,与Collection没有任何关系。Map最大的特点是存储的形式是键值对Key/Value。
2. Map接口常用的实现类有HashMap,HashTable,Properties,TreeMap(实现SortedMap接口,可排序)。
HashMap:底层是数组和单向链表简称哈希表。优点是结合了数组和链表的优势。增删元素在链表上完成,查询也不需要全部扫描,只需要扫描一部分。
使用HashMap存储数据时,Key对应的类必须同时重写HashCode(),equals()方法。在put(k,v)方法调用后,会调用key的hashCode(),返回哈希值,会将key,value,hash封装成Node对象。将哈希值进行哈希算法得到对应的数组下标。若此时对应的位置没有Node对象,则放入链表。若有对象,则对遍历他们。遍历的同时调用Node对象的key.equals(其他Node对象的key)。若key重复则覆盖value。若遍历结束仍没有相同的key则将Node对象放到链表末端。 get(k)方法调用后,会根据调用key的hashCode方法得到hash值,对哈希值进行哈希算法计算对应的数组下标。若该位置没有Node对象则返回Null。若有Node对象,遍历他们,直到key.eqlaus(其他Node.key)返回true,返回value。若匹配不到,返回Null。
HashMap默认容量为16,加载因子为0.75,当容量到达原容量的0.75时,扩大到原容量的两倍,链表节点数大于8时,转换为红黑树(一种自平衡二叉树)。
HashTable:是线程安全的,效率较低。原容量为11,加载因子为0.75,扩容为原容量*2+1。
Properties:是线程安全的,因为继承了HashTable。KeyValue只能是String类型。
TreeMap:底层是二叉树。
总结:
ArrayLsit:底层是数组。
LinkedList:底层是双向链表。
Vector:底层是数组,线程安全的,效率较低,使用较少。
HashSet:底层是HashMap,放到HashSet集合中的元素等于放到HashMap的key部分了。
TreeSet:底层是TreeMap,放到TreeSet集合中的元素等同于放到TreeMap的key部分了。
HashMap:底层是哈希表。
HashTable:底层也是哈希表,是线程安全的,效率较低,使用较少。
Properties:是线程安全的,key和value只能存储字符串String。
TreeMap:底层是二叉树。可按key的大小自动顺序排序。
List集合存储元素的特点:
有序可重复
Set(Map)集合存储元素的特点:
无序不可重复
SortedSet(SortedMap)集合存储元素的特点:
首先是无序不可重复,第二可以进行排序。