3 Java Collection
1. 接口的继承关系
Collection < List Set Queue
Iterator
Map < HashMap HashTable TreeMap
collection 接口继承关系 集合框架图
2. List
List- ArrayList
动态数组实现
扩容机制:
发生时机: array.add(object)
验证 now_size+1(最小需求容量)是否需要扩容。
- 如果当前数组为空,且当前最小需求容量小于默认容量(10) , 将当前最小需求容量 改为10 ;
- 用最小需求容量和当前数组长度作对比,判断是否需要扩容。若大于。则调用grow函数扩容。
- 在grow函数中,计算一个1.5倍*旧容量的值newcapacity,与最小需求容量作对比,若小于最小需求容量,则扩容新值改为最小需求容量。
- 再判断新值与max_array_list的大小,如果大于max。则新值不可用,使用hugeCapacity函数对最小容量作判断。如果最小需求容量<max, 直接扩容maxsize。若大于,则设置成Integer.MAX, 今后不再扩容。
Fast-Fali机制:
ArrayList里面会维护一个modCount属性值,标识修改状态。
在一个线程A使用迭代器遍历数组的时候,另一个线程B修改了数组结构时,当下一次A调用迭代器.next方法时的时候会抛出异常ConcurrentModificationException。
解决方法:
- 在涉及改变结构的地方直接加sychronized关键字来同步。
- 或则说使用CopyOnWriteArrayList
思想: 读写分离。
在写操作上加锁,通过复制一份新新数据来完成变更操作。
在这个过程中,旧数据同时存在,可供其他线程读取。
缺点: 内存占用(会存在两个对象)、数据一致性问题(在进行写的时候,写入的数据不能立马被其他线程读到)
序列化:
数组使用 transient 修饰。
不使用默认的序列化方法,defaultReadObject/ write
自己重写。是的只需要序列化/反序列化size大小数组而不是capacity大小的数组。
-
Vector
数组实现、线程安全
-
LinkList
链表实现。可用作队列、双向队列、栈。
栈方法: pop posh
队列方法: poll offer
双向队列方法: offerFirst offerLast pollFirst pollF=Last
3. Set
-
HashSet
由HashTable实现,键值对的值为默认值
-
TreeSet
排序二叉树实现。(注意实现Compareble接口和覆盖Compare函数)
-
LinkedHashMap
基于LinkedHashTable实现
4. Map
-
HashMap
数组+链表+红黑树实现
不是线程安全 (synchronizedMap方法 或者使用ConcurrentHashMap)
1. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。 2. loadFactor:负载因子,默认为 0.75。 13/04/2018 Page 51 of 283 3. threshold:扩容的阈值,等于 capacity * loadFactor 4. 树化阈值 : 8 5. 列化阈值 : 6 6. 树化节点树阈值:64
-
ConcurrentHashMap
ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承
ReentrantLock 来进行加锁。通过同时对不同segment操作进行并发。
每个segment维护了一个撒列表。
2. List
-
ArrayList
数组实现
-
Vector
数组实现、线程安全
-
LinkList
链表实现。可用作队列、双向队列、栈。
3. Set
-
HashSet
由HashTable实现,键值对的值为默认值
-
TreeSet
排序二叉树实现。(注意实现Compareble接口和覆盖Compare函数)
-
LinkedHashMap
基于LinkedHashTable实现
4. Map
-
HashMap
数组+链表+红黑树实现
不是线程安全 (synchronizedMap方法 或者使用ConcurrentHashMap)
1. capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。 2. loadFactor:负载因子,默认为 0.75。 13/04/2018 Page 51 of 283 3. threshold:扩容的阈值,等于 capacity * loadFactor 4. 树化阈值 : 8 5. 列化阈值 : 6 6. 树化节点树阈值:64
-
ConcurrentHashMap
ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承
ConcurrentMap
ReentrantLock 来进行加锁。通过同时对不同segment操作进行并发。
每个segment维护了一个撒列表。
要存取一个元素需要经过两次hash 。第一次hash定位到segment,第二次hash在散列表上定位到某一个桶。
-
LinkHashMap
记录了插入顺序的hashMap , 可以使用Iterator遍历
网友评论