Collections:使用Iterator遍历
Map:使用Map.entrySet遍历
List:元素有序,可重复
- ArrayList:动态数组实现,随机存取速度快
- LinkedList:双向队列实现,插入删除速度快
Set:元素无序,不可重复
Queue:模拟堆栈、队列
Hashtable中key和value均不允许为null,否则抛出异常NullPointerException
HashMap中key和value允许为null
ConcurrentHashMap中key和value均不允许为null,否则抛出异常NullPointerException
Hashtable线程安全
HashMap线程不安全
ConcurrentHashMap线程安全
Hashtable与ConcurrentHashMap区别
均是线程安全
Hashtable在get和put方法上使用了synchronized进行同步,属于重量级独占锁
ConcurrentHashMap使用了锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问
WeakHashMap:对key实行“弱引用”,如果一个key不再被外部所引用,那么该 key可以被GC回收
通过java.util.Collections类可以做到:
创建空的List/Set/Map
创建线程安全的List/Set/Map:
排序:
二分查找:
批量赋值:
反转:
不同集合之间拷贝:
…..
java.util.* 常用集合类使用总结
// 1.实现:java.util.Stack<E> extends Vector<E>
// 2.线程安全
// 3.常用操作:push,pop,peek
// 4.遍历:Iterator
Stack stack1 = new Stack<>();
stack1.pop();
// 1.说明:双向队列,基于数组实现,支持分别在两端进行插入和删除
// 2.实现:java.util.ArrayDeque<E> extends Deque<E>
// 3.非线程安全
// 4.常用操作:addFirst/removeFirst;addLast/removeLast;offerFirst/pollFirst;offerLast/removeLast
// 5.add和offer区别:在操作失败时是否抛出异常/返回null或false
// 6.可以当做堆栈使用,比Stack效率高
// 7.ArrayQueue比LinkedList效率高
Deque<Integer> stack2 = new ArrayDeque<Integer>();
// 1.说明:双向队列,基于链表实现,支持分别在两端进行插入和删除
// 2.非线程安全
Deque<Integer> stack4 = new LinkedList<Integer>();
// 1.说明:单向队列,FIFO,在尾部插入,在头部取出
// 2.线程安全,内部使用ReentrantLock控制并发
// 3.固定大小
// 4.常用操作:add/remove;offer/poll
// 5.add和offer区别:在操作失败时是否抛出异常/返回null或false
ArrayBlockingQueue<Integer> stack3 = new ArrayBlockingQueue<Integer>(10);
// 1.说明:双向队列,基于链表实现,支持分别在两端进行插入和删除
// 2.线程安全,内部使用ReentrantLock控制并发
Deque<Integer> stack5 = new LinkedBlockingDeque<Integer>();
List<String> strList = new ArrayList<String>(); // 非线程安全
List<String> strList2 = new Vector<String>(); // 线程安全
List<String> strList3 = Collections.synchronizedList(new ArrayList<String>()); // 线程安全
Map<String,Object> map1 = new HashMap<String, Object>(10); // 非线程安全
Map<String,Object> map2 = Collections.synchronizedMap(new HashMap<String,Object>());// 线程安全,效率次高
Map<String,Object> map3 = new ConcurrentHashMap<String,Object>(10); // 线程安全,效率最高
Hashtable<String,Object> hashTable = new Hashtable<String,Object>(); // 线程安全,效率次高
// TreeMap和HashMap区别?
// HashMap:基于哈希表实现,HashMap要求KEY明确定义了hashCode()和equals(),HashMap可以使用初始容量和负载因子进行调优
// TreeMap:基于红黑树实现,没有调优选项,因为该树总处于平衡状态,适用于按自然顺序或自定义顺序遍历键(key),比HashMap慢一些(插入过程中涉及到树重建?)
// 什么是红黑树?在生成二叉树的过程是非常容易失衡的,最坏的情况就是一边倒(只有右/左子树),这样势必会导致二叉树的检索效率大大降低(O(n)),所以为了维持二叉树的平衡,大牛们提出了各种实现的算法,如:AVL,红黑树等
// 红黑树是一个自平衡的排序二叉树
// WeakHashMap和HashMap区别?
// HashMap.put(a,"");WeakHashMap.put(a,""); 【HashMap.remove(a);a=null;System.gc();】
// 当某一个key除了WeakHashMap之外,没有被其它引用时,会被自动回收