JAVA集合使用概述
Set集合概述:
1.继承自collection接口
2.无序存放
3.没有重复元素
常用Set集合
HashSet:
1.使用HASH算法来存储元素
2.equals() / hashCode()方法比较对象相等
LinkedHashSet:
1.与HashSet类似
2.链表结构保存插入顺序
TreeSet:
1.继承自SortedSet
2.集合中元素排序
支持并发的Set集合:
1.CopyOnWriteArraySet : 线程安全的无序的集合
内部实现为CopyOnWriteArrayList
2. ConcurrentSkipListSet : 线程安全的有序的集合
内部实现为ConcurrentSkipListMap
3. Collections.synchronizedSet(set)
Set集合总结:
HashSet适用于普遍场景
TreeSet是有序集合
LinkedHashSet保持插入时顺序
Collections.synchronizedSet(set)适用于普遍高并发场景
ConcurrentSkipListSet是有序集合
CopyOnWriteArraySet使用ReentrantLock实现,有更好性能,适用于读多写少的高并发场景
List集合概述:
继承自collection接口
有序存放
允许重复元素
ArrayList:
1.基于动态数组实现
2.扩容机制
3.查询元素快,插入,删除中间元素慢
LinkedList :
1.基于双向链表实现
2.查询元素慢,插入,删除中间元素快
支持并发的List集合:
1.Vector:基于数组实现,与ArrayList类似,线程安全(方法被synchronized修饰)
2.CopyOnWriteArrayList:写时复制(读写分离),使用ReentrantLock
List集合总结 (ArrayList VS LinkedList):
1.ArrayList查询快,写数据慢;LinkedList查询慢,写数据快
2.ArrayList查询快是因为底层是由数组实现,通过下标定位数据快。写数据慢是因3.为复制数组耗时。LinkedList底层是双向链表,查询数据依次遍历慢。写数据只需修改指针引用
4.ArrayList和LinkedList都不是线程安全的,小并发量的情况下可以使用Vector,若并发量很多,且读多写少可以考虑使用CopyOnWriteArrayList,因为5.CopyOnWriteArrayList底层使用ReentrantLock锁,比使用synchronized关键字的Vector能更好的处理锁竞争的问题
Map集合
常用的Map类:
1.HashMap:非线程安全,equals和hashCode,key和value允许null
2.LinkedHashMap:非线程安全,满足HashMap特性,存入顺序和取出顺序一致
LinkedHashMap顺序保证:
3.TreeMap:非线程安全,数据排序,firstEntry()就是取出的排序后最大或最小的值
4.HashTable:数据结构和HashMap差别不大,线程安全,方法名前加synchronized,key和value不允许null
5.Collections.synchronizedMap:
性能对比:
单线程:
HashMap>SynchronizedMap>Hashtable>ConcurrentHashMap
多线程:
ConcurrentHashMap>SynchronizedMap>Hashtable