Java 集合类
2016-03-04 13:34
489 查看
集合 性能 默认容量 空时的大小 10K条目的开销(没有考虑键和值的大小) 准确设置大小? 扩展算法
HashSet O(1) 16 144 360K 否 x2
HashMap O(1) 16 128 360K 否 x2
Hashtable O(1) 11 104 360K 否 x2+1
LinkedList O(n) 1 48 240K 是 +1
ArrayList O(n) 10 88 40K 否 x1.5
StringBufferO(1) 16 72 24 否 x2
还有两个抽象类:
Collection(非有序,允许重复)
List(有序,允许重复)【ArrayList、LinkedList、Vector】
CopyOnWriteArrayList是ArrayList 的一个线程安全的变体。
Set(非有序,除了TreeSet【二叉排序树】,不允许重复)【HashSet(哈希表散列表)、TreeSet】
CopyOnWriteArraySet是HashSet的一个线程安全的变体。
Map(非有序,除了TreeMap【二叉排序树】,key不允许重复,value允许重复)【HashMap(哈希表散列表)、TreeMap】
HashTable和Vector线程安全,性能HashMap和ArrayList更好,但不是线程安全的。
HashTable不允许value为空。
ConcurrentHashMap通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍
HashMap和WeakHashMap的区别:
强引用、弱引用和动态回收内存
弱引用动态回收
(01) 新建WeakHashMap,将“键值对”添加到WeakHashMap中。
将“键值对”添加到WeakHashMap中时,添加的键都是弱键。
实际上,WeakHashMap是通过数组table保存Entry(键值对);每一个Entry实际上是一个单向链表,即Entry是键值对链表。
(02) 当某“弱键”不再被其它对象引用,并被GC回收时。在GC回收该“弱键”时,这个“弱键”也同时会被添加到queue队列中。
例如,当我们在将“弱键”key添加到WeakHashMap之后;后来将key设为null。这时,便没有外部外部对象再引用该了key。
接着,当Java虚拟机的GC回收内存时,会回收key的相关内存;同时,将key添加到queue队列中。
(03) 当下一次我们需要操作WeakHashMap时,会先同步table和queue。table中保存了全部的键值对,而queue中保存被GC回收的“弱键”;同步它们,就是删除table中被GC回收的“弱键”对应的键值对。
例如,当我们“读取WeakHashMap中的元素或获取WeakReference的大小时”,它会先同步table和queue,目的是“删除table中被GC回收的‘弱键’对应的键值对”。删除的方法就是逐个比较“table中元素的‘键’和queue中的‘键’”,若它们相当,则删除“table中的该键值对”。
而Comparator接口可以通过 java.util.Collections.sort(List list,Comparator c)调用
Vector
HashSet O(1) 16 144 360K 否 x2
HashMap O(1) 16 128 360K 否 x2
Hashtable O(1) 11 104 360K 否 x2+1
LinkedList O(n) 1 48 240K 是 +1
ArrayList O(n) 10 88 40K 否 x1.5
StringBufferO(1) 16 72 24 否 x2
Java集合类最重要的三个接口
List,Queue,Set,Map,其中List和Set继承于Collection。还有两个抽象类:
Collection(非有序,允许重复)
List(有序,允许重复)【ArrayList、LinkedList、Vector】
CopyOnWriteArrayList是ArrayList 的一个线程安全的变体。
Set(非有序,除了TreeSet【二叉排序树】,不允许重复)【HashSet(哈希表散列表)、TreeSet】
CopyOnWriteArraySet是HashSet的一个线程安全的变体。
Map(非有序,除了TreeMap【二叉排序树】,key不允许重复,value允许重复)【HashMap(哈希表散列表)、TreeMap】
HashTable和Vector线程安全,性能HashMap和ArrayList更好,但不是线程安全的。
HashTable不允许value为空。
ConcurrentHashMap通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍
HashMap和WeakHashMap的区别:
强引用、弱引用和动态回收内存
弱引用动态回收
(01) 新建WeakHashMap,将“键值对”添加到WeakHashMap中。
将“键值对”添加到WeakHashMap中时,添加的键都是弱键。
实际上,WeakHashMap是通过数组table保存Entry(键值对);每一个Entry实际上是一个单向链表,即Entry是键值对链表。
(02) 当某“弱键”不再被其它对象引用,并被GC回收时。在GC回收该“弱键”时,这个“弱键”也同时会被添加到queue队列中。
例如,当我们在将“弱键”key添加到WeakHashMap之后;后来将key设为null。这时,便没有外部外部对象再引用该了key。
接着,当Java虚拟机的GC回收内存时,会回收key的相关内存;同时,将key添加到queue队列中。
(03) 当下一次我们需要操作WeakHashMap时,会先同步table和queue。table中保存了全部的键值对,而queue中保存被GC回收的“弱键”;同步它们,就是删除table中被GC回收的“弱键”对应的键值对。
例如,当我们“读取WeakHashMap中的元素或获取WeakReference的大小时”,它会先同步table和queue,目的是“删除table中被GC回收的‘弱键’对应的键值对”。删除的方法就是逐个比较“table中元素的‘键’和queue中的‘键’”,若它们相当,则删除“table中的该键值对”。
集合类排序Comparable和Comparator
调用java.util.Collections.sort(List list)时,List的每个对象都必须实现了comparable接口。而Comparator接口可以通过 java.util.Collections.sort(List list,Comparator c)调用
ArrayList和Vector扩容区别
ArrayListpublic void ensureCapacity(int minCapacity) { modCount++;//父类中的属性,记录集合变化次数 int oldCapacity = elementData.length; if (minCapacity > oldCapacity) {//扩容的条件,数组需要的长度要大于实际长度 Object oldData[] = elementData; int newCapacity = ((oldCapacity * 3)/2 + 1<minCapacity?minCapacity: ((oldCapacity * 3)/2 + 1); elementData = (E[])new Object[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, size); } }
Vector
public synchronized void ensureCapacity(int minCapacity) { modCount++;//父类中的属性,记录集合变化次数 ensureCapacityHelper(minCapacity); } private void ensureCapacityHelper(int minCapacity) { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) {//扩容的条件,数组需要的长度要大于实际长度 Object[] oldData = elementData; //扩容因子大于0,相加,否则两倍 int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) : (oldCapacity * 2); if (newCapacity < minCapacity) { newCapacity = minCapacity; } elementData = new Object[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, elementCount); } }
相关文章推荐
- 【SpringMVC】SpringMVC系列11之Restful的CRUD
- Java集合
- Java实例分析:宠物商店
- 【SpringMVC】SpringMVC系列10之视图与视图解析器
- ibatis和spring的整合
- Spring学习之声明式事物管理
- 【SpringMVC】SpringMVC系列9之Model数据返回到View
- java学习笔记-文件流
- 【SpringMVC】SpringMVC系列8之Servlet API 作为入参
- 【SpringMVC】SpringMVC系列7之POJO 对象绑定请求参数值
- Java HashMap遍历实践,看看不同方式的性能如何
- Java HashMap遍历实践
- JAVA_常用工具类
- 【SpringMVC】SpringMVC系列6之@CookieValue 映射请求Cookie 值
- spring编码过滤器 配置
- Java 异常类型
- 【SpringMVC】SpringMVC系列5之@RequestHeader 映射请求头属性值
- java中断文章
- java学习笔记-输入输出流
- 【SpringMVC】SpringMVC系列4之@RequestParam 映射请求参数值