List接口概述
List接口是单序列集合Collection里面的一个
实现List接口的集合类中的元素是有序的,且允许重复
List集合中的元素都对应一个整数型的序号记载其在集合中的位置,可以根据序号存取集合中的元素。
其中比较重要的List集合类型有ArrayList还有LinkedList;
ArrayList
ArrayList是List中比较重要的集合
ArrayList底层代码的理解:
初始化参数;
构造器方法
//无参的构造器
public Mylistpuls(){
//没有参数值默认为10哥容量的数组
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//有参构造器
public Mylistpuls(int init) throws Exception {
//判断参数是否大于0
if(init>0){
//如果参数大于0那么就重新构造一个参数大小的数组
this.elementData = new Object[init];
}else if (init==0){
//如果初始参数为0那边就给把空的数组赋给它
this.elementData = EMPTY_ELEMENTDATA;
}else {
throw new Exception("输入的参数不符合要求不能小于0"+init);
}
}
添加的方法:
首先我们需要判断我们插入的索引值是不是符合要求的,如果不符合要求我们就直接抛出异常。
索引值符合要求的时候 我们还需要判断我们初始化的数组是否还有位置存放这个元素
如果没有地方存放了我们需要使用我们扩容方法。
如果有地方存放我们的元素我们就使用复制的方法把当前index索引后面的所有元素都向后移动一位然后把我们要插入的值赋给要插入的位置 size++;
public boolean add(int index,Object o) throws Exception {
//首先判断填写的数字是否符合要求
rangeCheckForAdd(index);
//判断是否为空数组
if (size==0 || size==elementData.length){
grow();
} System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index]=o;
size++;
return true;
}
删除的方法
当我们需要删除一个元素的时候,我们就可以循环遍历这个数组,再使用equals对比方法比出与我们要删除的值相同的元素,我们就需要把那个位置的后面所有元素全部向前移动一个位置,最后把要删除的元素赋值为null size--;
//删除的方法
public boolean remove(Object o) {
for (int i = 0; i < this.size; i++) {
if (elementData[i].equals(o)) {
for (int j = i; j < size - i - 1; j++) {
this.elementData[j] = elementData[j + 1];
}
size--;
return true;
}
}
return false;
}
修改的方法
修改的方法其实就是上面两种方法的结合
首先我们还是需要判断索引
然后循环遍历数组,找到与index想用的索引
再把索引位置的值改为value即可
//修改的办法
public boolean set(int index, Object value) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("输入的索引有范围有误:" + index);
}
//循环遍历数组里面的位置与输入的数字相同
for (int i = 0; i < size; i++) {
if (i == index) {
this.elementData[i] = value;
return true;
}
}
return false;
}
获取元素
获取元素可以说是最简单的方法了,我们只需要判断是否与索引相同返回即可
public Object get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index out of:" + index);
}
return this.elementData[index];
}
LinkedList
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。
因为上面写过了ArrayList接口的底层代码 LinkedList其实就是一个表接着一个表我们只需要把上一个节点的指针域指向下一个节点的数据域这样往复。
ArrayList和 LinkedList的区别
ArrayList的底层是由动态数组组成的 ,动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高,但是其删除的能力相对来说较差
LinkedList的底层是由双链表组成的,优点是地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址。相比ArrayList查询能力比较有优势。
查询效率肯定是ArrayList快,因为ArrayList是根据集合下标查询,LinkedList需要遍历。