Collection
|_ Set
|_ TreeSet
|_ HashSet
|_ SortedSet
|_ List
|_ Vector
|_ Stack
|_ ArrayList
|_ LinkedList
Map
|_ HashMap
|_ Hashtable
|_ TreeMap
.....
List
1.List中元素有序、允许重复的元素,Set中的元素无序、不可重复的元素。
2.Vector、ArrayList是以数组形式存储在内存中,LinkedList则以链表形式存储。
3.Vector线程同步、ArrayList、LinkedList线程不同步。Vector同步,Arraylist不同步,ArrayList比Vector性能更好。
4.LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。
5.ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。
源码分析:
Vector:
public Vector() {
this(10);
}
public Vector(int initialCapacity) {
this(initialCapacity,0);
}
public Vector(int initialCapacity, int capacityIncrement) {//第二个参数,每次增长的量
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
扩容:
//Vector
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity); //增长
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
//ArrayList:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); //增长
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
效率:
ArrayList Vector 对于插入删除 效率很快,通过索引操作,查询速度慢
LinkedList 查询速度慢,插入删除慢
查找方面 LinkedList 要移动指针,查询慢
增删方面 ArrayList Vector 要重排数据,所以增删慢
Set
Map
HashMap 线程不同步,允许NULL的key和Value
HashTable线程同步,不允许NULL的key或Value
HashSet和HashMap的区别
*HashMap* | *HashSet* |
HashMap实现了Map接口 | HashSet实现了Set接口 |
HashMap储存键值对 | HashSet仅仅存储对象 |
使用put()方法将元素放入map中 | 使用add()方法将元素放入set中 |
HashMap中使用键对象来计算hashcode值 | HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false |
HashMap比较快,因为是使用唯一的键来获取对象 | HashSet较HashMap来说比较慢 |