首先要了解collection的继承结构
HashMap
- 线程不安全,但是可以使用ConcurrentHashMap(原理详解:
http://blog.csdn.net/Sherry_Rui/article/details/51462549?locationNum=4&fps=1
源码详解:http://blog.csdn.net/darrensun2014/article/details/51759751?locationNum=1&fps=1
) - 底层是数据+链表
- 对于放入的K,V,先通过函数取得K的hash值,然后去找到对应下标的数组,如果数组的位置上有值得情况,加入头部插入值。
- get的时候,先key去hashcode,然后equals() 5、允许key或者value为null
- key不可以重复,value可以重复
HashSet
底层是HashMap,对key的操作转化为对map的操作。
HashTable
相对与HashMap来说,线程安全,不过当下已经out了。
list下的两个常用的集合
迭代collection
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
ArrayList:底层是动态数组,快速查找元素,可以有重复的元素。它允许所有元素,包括null。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
LinkedList:底层是链表。可以有重复的元素, LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意ArrayList和LinkedList都没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(…));
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
list详解:http://blog.csdn.net/wuchuanpingstone/article/details/6678653