单列集合的框
架
—-Collection 所有单列集合的跟接口
———-list Collection的子接口,实现了List接口的类的特点: 有序可重复
—————-ArrayList 底层使用了Object数组来实现 特点:查询快,增删慢
—————-LinkedList 底层使用了链表的数据结构来实现。特点:查询慢,增删快
—————-Vector 底层使用了Object数组来实现。 但是是线程安全的,操作效率低。
———Set Collection的子接口,实现了Set接口的类的特点:无序不可重复。
—————-HashSet 底层使用了哈希表来实现的。特点:存取快。
—————-TreeSet 底层使用了红黑树来实现的。特点:可以对集合中的元素进行排序。
- 浅谈ArrayList:线程不安全
实现原理: ArrayList是一个可变数组大小的列表,允许null在内的所有元素,构造一个初始容量为10的空列表(Jdk1.6以后创建一个ArrayList对象时,不会立即初始化一个容量为10的空列表,当第一次添加的时候才会初始化),也可以提定初始容量initialCapacity,ArrayList最大的特点内部是数组结构,一看到数组,我们会立刻想到角标索引,所以在操作元素时,可以根据索引准确判断元素的位置,查询快。其实ArrayList是包装了一个数组对象,可以调用get() set() 操作元素,查询快,增删慢是因为在添加元素时,会设计数组的拷贝(在源码中看)
扩容增量: 原容量的0.5倍
如 ArrayList的容量为10,一次扩容后是容量为15
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
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);
}
- 浅谈Vector:线程安全
实现原理:同ArrayList
底层数据结构是数组结构
加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容
扩容增量:原容量的 1倍
如 Vector的容量为10,一次扩容后是容量为20 - 浅谈LinkedList:线程不安全
调用无参数的构造方法默认创建了一个空列表,LinkedList是链表式结构,增删快,查询慢。 浅谈HashSet:
因为set集合是无序的,所以添加元素的时候就讲究原则了。
HashSet添加元素的原理:往HashSet添加元素的时候,首先HashSet会调用元素的hashCOde方法得到元素的哈希码值,然后会经过一系列运算就可以算出该元素在哈希表中的存储位置/情况1:如果算出该元素的位置目前没有任何元素存储,那么该元素可以直接存储
情况2: 如果算出该元素的位置目前已经存有其他的元素,那么还会调用元素的equals方法与该位置的元素再比较一次。
如果equals方法返回的是false,那么该元素允许存储,如果euqlas方法返回的是true,那么该元素视为重复元素。
该类实现原理:底层实现是一个HashMap(保存数据),实现Set接口。
默认初始容量为16(为何是16,见下方对HashMap的描述)。
加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容。
扩容增量:原容量的 1 倍。
如 HashSet的容量为16,一次扩容后是容量为32浅谈TreeSet
因为无序所以添加元素就有原则。
添加元素的原理:`1. 往TreeSet添加元素的时候,如果元素本身具备自然顺序的特性,那么会根据元素自然顺序的特性进行排序存储。- 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么元素所属的类必须要实现Comparable接口,把元素的比较规则定义
在CompareTo方法上。 - 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而且元素所属的类没有实现COmparable接口,那么必须要在创建
TreeSet对象的时候传入比较器。 - 如果比较的方法(CompareTo 或者Compare )返回的是0的时候,那么该元素就被视为重复元素,不允许添加。
- 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么元素所属的类必须要实现Comparable接口,把元素的比较规则定义
`
初始容量:调用无参数的构造方法,默认初始容量为0.