1.Java集合
java三大集合类,list set map
![clollection简单继承结构](https://img-blog.csdn.net/20170315093642279?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXNsZ21fMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.定义
ArrayList正如名字一样数组列表,或者数组队列 ,其是基于数组实现的扩充的,所以又叫做动态数组
3.特性
1)因为实现了List,所以arrayList是有序的。
2)因为是基于数组实现的,所以访问元素快。
3)因为插入元素时,涉及到数组元素要整体移动,所以插入慢。
4.源码分析
1.构造函数
//默认构造函数
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//这里是一个空数组
}
//构造指定大小list
public ArrayList(int arg0) {...}
//创建一个包含collection的ArrayList
public ArrayList(Collection<? extends E> arg0) {...}
注意:默认构造函数创建的arrayList大小是空的。
2.重要方法
1)添加元素
//在列表尾部添加元素。
public boolean add(E arg0) {...}
//在指定位置添加元素
public void add(int arg0, E arg1){
this.rangeCheckForAdd(arg0);//检查添加位置是否越界,故arg0可以等于size(list大小)
this.ensureCapacityInternal(this.size + 1);//检查数组是否需要扩容
System.arraycopy(this.elementData, arg0, this.elementData, arg0 + 1, this.size - arg0);
//极其重要一个方法,目的是从原数组this.elementData指定位置arg0开始复制,长度为this.size - arg0到目标数组this.elementData从arg0 + 1开始覆盖。
this.elementData[arg0] = arg1;
++this.size;
}
注意:添加元素的流程为检查数组大小,有位置直接添加,没位置需要扩容。
扩容
private void grow(int arg0) {
int arg1 = this.elementData.length;
int arg2 = arg1 + (arg1 >> 1);//原大小+原大小/2
if (arg2 - arg0 < 0) {
arg2 = arg0;
}
if (arg2 - 2147483639 > 0) {
arg2 = hugeCapacity(arg0);
}
this.elementData = Arrays.copyOf(this.elementData, arg2);
}
2)删除元素
//删除指定位置元素
public E remove(int arg0) {
this.rangeCheck(arg0);
++this.modCount;
Object arg1 = this.elementData(arg0);
int arg2 = this.size - arg0 - 1;
if (arg2 > 0) {
System.arraycopy(this.elementData, arg0 + 1, this.elementData, arg0, arg2);
}//添加和删除一个原理
this.elementData[--this.size] = null;
return arg1;
}
//删除指定元素
public boolean remove(Object arg0) {
int arg1;
if (arg0 == null) {
for (arg1 = 0; arg1 < this.size; ++arg1) {
if (this.elementData[arg1] == null) {
this.fastRemove(arg1);
return true;
}
}
} else {
for (arg1 = 0; arg1 < this.size; ++arg1) {
if (arg0.equals(this.elementData[arg1])) {
this.fastRemove(arg1);//和上边删除指定位置元素方法一样,不过少了一个验证index越界检验。
return true;
}
}
}
return false;
}
//这个方法,是删除列表中所有元素,注意传参哦
public boolean removeAll(Collection<?> arg0) {...}
总结:
还有很多方法没列出来,因为我觉得弄明白这两个方法实现原理,其他的如get方法,迭代器方法,subList截取子列表,trimToSize()等等,很简单了。。。
System. arraycopy(Object src, int srcPos,Object dest, int destPos,int length);
这个方法很重要,添加就是基于它实现的。
我建议大家可以自己实现下,这是我实现的,主要写了几个简单的接口
https://github.com/AminLiu/JavaCoding/tree/master/src/dataStructure