Collection(接口)
List(接口)
ArrayList(实现类,线程不安全)
Vector(线程安全,已淘汰)
LinkedList(实现类)
Set(接口)
HashSet(实现类):底层通过HashMap实现 ,数组+哈希表
LinkedHashSet:有序set
TreeSet(实现类):唯一、有序;二叉树实现 ,需要实现内部比较器或者传入外部比较器;
Map(接口)
HashMap(实现类):元素必须重写hashCode 和equals
LinkedHashMap:有序map,按照插入顺序排序
HashTable:线程安全
TreeMap(实现类):可以传入比较器
什么是线程安全?
当多个线程同时访问或修改线程共享资源的时候,由于线程内部可能进行的不是原子性操作,就可能导致无法预知的数据异常
通常我们可以使用锁来对竞争资源进行保护,达到线程安全的目的。
HashMap基本结构:数组+链表/红黑树
initialcapacity(初始容量大小):默认16
load_factor(扩容因子):当元素个数大于容量*扩容因子时,进行数组扩容,每次
_TREEIFY_THRESHOLD=8:树化的临界值>=8
UNTREEIFY_THRESHOLD=6:红黑树转链表的临界值
MIN_TREEIFY_CAPACITY=64:树化的另一个条件数组容量>64
如何避免哈希碰撞?
在进行hash计算的时候,key做了一些位运算,使得key的高位与低位都有参与计算,从而使hash结果更为散列化
hash表如何优化
在进行put的时候,如果某hash值对应的桶位链表长度大于等于8时,会进行树化操作;当元素remove的时候,会判断红黑树的节点个数,如果小于6就转换成链表存储;同时,树化的时候还有一个点,会判断hash表的容量,如果小于64页不进行树化,只做扩容
hashMap的线程安全问题?
存在线程安全问题,同时get和put可能导致为get为null
hashTable与hashMap的区别?
HashTable是线程安全的,他给更新操作都添加了Synchronize,在多线程环境下,可以直接使用,但是效率较低,实际中不常用
hashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。使用HashMap时就必须要自己增加同步处理
concurrentHashMap是线程安全的,他采用的是分段锁,提高了并发时的效率。
线程安全的LIst?
vector。原理和ArrayList类似,给方法添加了synchronized,效率低
CopyOnWriteArrayList。利用了写时复制的原理,达到了读共享,写互斥的效果,从而保证了线程安全,缺点是占用空间
ArrayList构造:动态数组
DEFAULT_CAPACITY:默认数组大小
initialCapacity:初始化数组大小
扩容:当前数组长度大于容量值的话进行扩容,0.5倍