一. Java 容器
生活中容器用来包装或装载物品的贮存器,而在Java中,容器是用来装载对象的储存器。Java提供了丰富的容器类型,主要包括List、Set、Queue、Map 等,其中除了Map其余的三种都继承了Collection接口,如图所示:
二. 容器之间的区别
2.Set: 不可重复的容器;
3.Queue:即队列,按照一定的规则进出;
4.Map: 即key-value 键值对,key与value 一一对应,其中key是不允许重复出现的。
三. 常用容器原理分析
3.1 Map 主要介绍HashMap/Hashtable/ConcurrentHashMap/TreeMap
3.1.1 HashMap:底层是用一个单链表数组来存储Key-Value 键值对,原理是对Key进行Hash确认其在数组中的位置,然后在对应位置的的链表上进行增删查改;(Note:注意对hash()函数的重写)
3.1.2 Hashtable:与HashMap 原理相同,只是通过synchronized关键字来保证了线程安全性;
3.1.3 ConcurrentHashMap: 与HashMap 原理相同,主要解决了HashMap 的线程安全问题,同时又弥补了Hashtable 的效率问题。HashTable 是对象锁,而ConcurrentHashMap 锁的只是Key 所对应的某个链表。
3.1.4 TreeMap:底层是一颗红黑树,提供有序的Map,根据提供的comparator对key进行排序。LinkedHashMap也提供了有序的Map,其继承HashMap, 在此基础上用了一个双向链表来记录存入的先后顺序。
3.2 Set 主要介绍 HashSet/TreeSet
3.2.1 HashSet : 底层是用HashMap 来存储元素;
3.2.2 TreeSet: 底层默认用TreeMap 来存储元素。
3.3.1 ArrayList: 底层是用数组来存储元素,特点是查询快,更新慢。(Note:其数组具有动态扩容功能,默认是原来的1.5倍)
3.3.2 LinkedList: 底层是用双向链表来存储元素,特点更新快,查询慢。
3.3.3 Vector: 底层是用数组来存储元素,与上面提到的ArrayList相似,主要的不同是Vector通过synchronized来保证其线称安全。
3.1.4 Arrays.asList(): 此方法返回一个内部自定义的ArrayList,与上面提到的并不是一个类。其继承AbstractList,重写了set(int index, E element)方法,但没重写add/remove 方法,从而保证了数组的长度是不可变的。
3.4 Queue 将会在线程池系列介绍