JAVA朝花夕拾-集合框架
Collections框架:
Collections :
List:(当存储相同的元素时不会覆盖,先进先出,可以使用sort排序)
ArrayList: 可以使用null,采用数组实现,若不指定大小则初始化大小10,如果使用size()直接输出为0,每次扩容大小为原来的1.5倍,线程不安全,查找时间复杂度为:O(n);
get O(1),add() O(1),remove O(n);
LinkedList: 不能使用Null,采用链表实现,线程不安全。
add(),get(),remove();
Vector: 采用数组实现,线程安全,方法使用Synchronized
Set:(当存储重复的元素时会覆盖,会自动排序)
HashSet: 底层采用HashMap实现
TreeSet: 底层采用TreeMap实现
遍历:
1, 采用Iterator<E>接口
Iterator<e> iterator=Collection.iterator();
while(iterator.hasNext())
print(iterator.next());
2,ForEach
for(E e:Collection c)
Map:(hash冲突是指 hash值一样,导致冲突)
HashMap:
非线程安全
允许null做键值
底层采用数组加链表的方式实现,一个Node数组,每个Node数组都是链表的头。
数组默认初始化大小的长度是16
put(key,value):
1,hash(key.hashCode); //根据key重新计算hash值
2,indexFor(hash,length); //找到数组对应的索引 length为数组的长度
3,如果数组对应的Node不为Null,就循环遍历链表,找到key相同的Node,将value替换将oldvalue返回。
4,如果没找到,就将key,value添加到索引处
为了尽量不去遍历链表,我们就需要尽可能使数均匀的分布在数组上,因此需要一个好的计算hash值的方法
当数的数量足够多时,Hash冲突的几率也越来越高,在设计的时候,为了不影响性能,会自动进行数组扩容,
当元素个数超过数组长度的0.75,会进行自动扩容,数组长度*2
性能参数:
数组初始容量,负载因子(到数组长度多少进行扩容)
TreeMap:
非线程安全
不允许null
底层采用红黑树实现,有序,想要自定义排序如下:
TreeMap<Object,Object> tm=new TreeMap(new Comparator(){
public int compare(obj1,obj2);
} );
HashTable:
线程安全
不允许null
底层采用数组加链表(Hash表)实现
Map遍历:
1.通过Map.keySet()方法返回一个Set,然后通过set的遍历遍历。
2,通过forEach:
for(Map.Entry<Obj,Obj> entry:Map<Obj,Obj>map){
entry.getKey();
entry.getValue();
}