Collection
类集设置的目的
普通数组,并不是动态数组,在扩容时候每次是自己进行new一个更大的新的数组,而在实践开发的时候,方便实际Java实现了类集。
类集中的三大接口:Collections,Map,Iterator。
所有的类集合都在java.util包中。
Collection接口
Collection 接口是在整个 Java 类集中保存单值的最大操作父接口,里面每次操作的时候都只能保存一个对象的数据
def:采用泛型技术
public interface Collection<E> extends Iterable<E>;
常用方法
public boolean add(E e);
//return无论如何只有ture
public Iterator<E>
List
ArrayList,Vecter,LinkList(链表结构)
ArrayList
ArrayList:使用泛型数组结构,对于增加删除操作快,查找慢
ArrayList<Integer> data=new ArrayList
构造方法
构造器 | 描述 |
---|---|
ArrayList() | 构造一个初始容量为10的空列表。 |
ArrayList(int initialCapacity) | 构造具有指定初始容量的空列表。 |
ArrayList(Collection<? extends E> c) | 按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。 |
每次扩容为原始的1.5倍,若需要极大的空间,需要在初始化时候进行声明
ArrayList的内部原理
首先我们来看一下它的定义
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
传入一个默认的数组,而private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
显然是一个空数组
所以ArrayList在构造开始是一个空数组,但是jdk里面说是10个长度,为什么呢
当我们在添加元素时候看一看add方法的定义
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}
首先modCount记录修改的次数,然后使用add方法,它接受三个参数:要添加的元素e,集合的元素数据数组elementData,以及集合数组大小size
进一步的我们在看一下此处的add定义
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
}
如果当前的size,s已经等于了数组的长度则进行grow扩容
所以我们来看一下grow的定义
private Object[] grow() {
return grow(minCapacity:size + 1);
}
再来看看此处的grow的具体逻辑
private Object[] grow(int minCapacity) {
int oldCapacity = elementData.length;
if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
int newCapacity = ArraysSupport.newLength(oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity >> 1 /* preferred growth */);
return elementData = Arrays.copyOf(elementData, newCapacity);
} else {
return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
}
}
首先定义了一一个原数组的长度由于扩容1.5倍首先就得排除初始的为空或者只有1的情况如何创建一个新的更大数组copy过来
Vector
Vector是同步的,如果不需要线程安全建议使用ArraysList
每次扩容的数量是可以定义的
LinkedList
Linkedlist:使用的双向链表
可以实现队列和栈