JDK1.7中使用数组+链表实现JDK1.8中使用数组+链表+红黑树实现在JDK1.8中的原理
初始容量(capacity )为16,在第一次放入元素时才分配
扩容条件:当前容量(capacity )*加载因子(loadFactor )>总容量(threshold )。每次扩容为当前的2倍
当链表节点大于8个,且桶的长度大于64则升级为红黑树,没有超过64则直接扩容为两倍
当红黑树的节点小于6个则还原为链表线程不安全无序、最多一条key为null的数据 2、HashTable
哈希表:数组+链表实现初始容量为11,加载因子0.75,每次扩容为2倍+1线程安全 3、TreeMap
红黑树实现对key自动排序,key不能重复无序、键值可为null 4、linkedHashMap
链表实现有序线程不安全 5、ConcurrentHashMap
JDK1.7:使用分段锁segmentJDK1.8:取消分段锁,使用CAS和Synchronized来保证线程安全,Synchronized只锁了当前链表或红黑树的首结点,从而提升了效率 二、Collection 1、List ArrayList
动态数组实现JDK1.7:在创建对象时就创建一个长度为10的数据,放不下时创建一个长度为原先1.5倍的新数组,将原先的内容复制到新数组。对象的创建类似单例模式中的饿汉式。JDK1.8:创建对象时创建空数组,第一次调用add操作时才创建长度为10的数组。对象的创建类似单例模式中的懒汉式。线程不安全查询快、增删慢 linkedList
双向链表实现线程不安全增删快、查询慢空间占用比ArrayList大 Vector
动态数组实现默认创建长度为10的数组,每次扩容为当前的两倍线程安全,synchronized实现。相当于加了锁的ArrayList CopyonWriterArrayList
写入时复制适合大量读的操作,可以读写分离,但并不是读写锁实现的线程安全初始容量为0,每次写入的时候扩容,新的容量为插入容量+当前容量 2、Set TreeSet
基于TreeMap实现有序、不允许有重复元素 HashSet
基于HashMap实现无序、不允许有重复元素, 允许有 null 值线程不安全 linkedHashSet
基于linkedHashMap实现 CopyonWriteSet
基于CopyOnWriteArrayList实现 3、Queue Deque
常用子类ArrayDeque BlockingQueue——阻塞队列
常用子类
linkedBlockingQueue
ArrayBlockingQueue
常用来实现生产者和消费者模型
AbstractQueue学习笔记,欢迎纠正补充~