List(有序 可重复的)
• ArrayList: 底层是动态数组,查询快,效率高,增删慢,默认长度为10,当添加的元素超过当前数组长度时,会进行扩容操作,创建一个新数组,长度为当前数组长度的1.5倍,扩容调用的是grow()方法,通过grow()方法中调用的Arrays.copyof()方法进行对原数组的复制,在通过调用System.arraycopy()方法进行复制,达到扩容的目的
• Vector: 底层是动态数组,默认长度为10,查询快,线程安全,效率慢
• LinkedList: 双向链表 增删快,效率高,查询慢,线程不安全
Map
• HashMap: 数组+链表+红黑树 没有存储顺序 线程不安全
• TreeMap:红黑树 非线程安全 有存储顺序 默认key升序 如果需要改变排序方式,则需要使用比较器:comparator
• HashTable:数组+链表 线程安全
• LinkedHashMap:继承于hashMap hashMap是无序的 LinkedHashMap额外维护了一个双向链表用于保持迭代顺序 所以是有序的 默认为插入顺序
Set(无序 不可重复)
• HashSet+:散列集 允许为空 实际为HashMap的实例 值存在hahMap的key上
• TreeSet: 底层是TreeMap 特点 插入无序内部有序
• LinkedHashSet:底层为LinkedHashMap
hashMap1.7和1.8
• 1.7:数组+ 单链表
• 1.8:数组+链表+红黑树(当链表节点大于等于8,也就是默认阈值,会转化为红黑树,当链表节点小于等于6,转为普通链表当链表)
hashMap和hashTable区别
-
hashMap是线程不安全的,可以通过ConcurrentHashMap来得到一个安全的集合,hashTable是线程安全的
-
hashMap允许有空值,hashTable是不允许的
-
hashMap的默认容量为16,hashTable的默认容量为11,两者的负载因子均为0,75,当使用的容量大于乘以负载因子时,会触发扩容机制
concurrentHashMap
- 1.8之前
segment+HashEntry:Segment是一个数组,单个segment包含HashEntry,HashEntry是链表结构,可保存key和value.指向下一个节点的指针每个Segment相当于一个HashMap,
默认的Segment长度是16,可以支持16个线程的并发操作。 - 1.8
1.8 CAS+synchronized+Node实现,同样也加入了红黑树,避免链表过长导致性能的问题
浙公网安备 33010602011771号