1.List接口常用方法
1.代码
package com.sunxiansheng.collection;
import java.util.*;
public class demo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
System.out.println(list);
list.addAll(Arrays.asList(2, 3, 4, 5));
System.out.println(list);
System.out.println("list.get(0) = " + list.get(0));
System.out.println("list.indexOf(1) = " + list.indexOf(1));
list.add(1);
System.out.println(list);
System.out.println("list.lastIndexOf(1) = " + list.lastIndexOf(1));
Integer remove = list.remove(0);
System.out.println("remove = " + remove);
System.out.println("修改前" + list);
Integer set = list.set(0, 0);
System.out.println("set = " + set);
System.out.println("修改后:" + list);
List<Integer> subList = list.subList(0, 2);
System.out.println("subList = " + subList);
}
}
2.结果
2.ArrayList底层机制
1.结论
2.ArrayList底层源码
1.代码
package com.sunxiansheng.collection;
import java.util.*;
public class demo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
list.add(i);
}
for (int i = 11; i <= 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
list.add(null);
}
}
2.debug添加第一个元素
1.进入
2.elementData数组存储ArrayList的数据
3.初始化为空数组
4.首先确保使用size+1来计算最小容量
5.如果elementData为空,最小容量就是10
6.modCount记录当前集合被修改的次数
7.此时最小容量为10,大于数组的长度0,所以扩容
8.扩容-计算旧容量为0
9.扩容-新容量等于旧容量的1.5倍也就是0
10.扩容-如果说新容量小于最小容量,那么就让最小容量为新容量也就是10
11.扩容-将原数组的数据浅拷贝10个到新数组,如果没有元素就使用null填充
12.新元素添加到size的位置上,然后size++
3.debug添加第二个元素
1.首先还是使用size+1来计算最小容量
2.此时由于不是第一次添加,所以最最小容量就是size+1也就是2
3.发现最小容量是小于数组长度的,所以不需要扩容
4.新元素添加到size的位置上,然后size++
4.debug添加第11个元素
1.首先还是根据size+1来计算最小容量
2.返回最小容量为11
3.发现数组长度10,小于最小容量11,所以需要扩容
4.扩容-旧长度为10
5.新长度为10的一点五倍也就是15
6.将原数组调用copyOf方法,复制15个元素到新数组中,没有值的五个元素使用null填充
7.在size+1的位置插入新元素
6.debug添加第16个元素
1.首先还是根据size+1来计算最小容量,返回16
2.发现数组长度15小于最小容量16,则需要扩容
3.旧容量为15
4.新容量是15的一点五倍也就是22
5.数组扩容后将新元素添加到size的位置上,然后size++
7.debug构造器指定大小时的扩容机制
1.代码
package com.sunxiansheng.collection;
import java.util.*;
public class demo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(9);
for (int i = 1; i <= 9; i++) {
list.add(i);
}
list.add(100);
}
}
2.首先根据size+1来计算最小容量为10
3.然后发现数组长度9小于最小容量10,所以进行扩容
4.还是新容量为旧容量的1.5倍也就是9 + 4 = 13
5.数组扩容后将新元素添加到size的位置上,然后size++
3.Vector底层机制
1.结论
2.Vector底层源码
1.Vector和ArrayList比较
2.代码
package com.sunxiansheng.collection;
import java.util.*;
public class demo {
public static void main(String[] args) {
Vector<Integer> vector = new Vector<>();
for (int i = 0; i < 11; i++) {
vector.add(i);
}
}
}
3.debug第一次添加元素
1.初始化容量为10
2.根据elementCount+1也就是最小容量,来判断是否要扩容
3.如果最小容量大于数组长度,则需要进行扩容,所以目前不需要扩容
4.elementCount位置插入新增的元素,然后elementCount++
4.debug第十一次添加元素
1.计算最小容量为10 + 1 = 11
2.最小容量大于数组长度,所以需要扩容
3.旧容量为10
4.新容量为20,相当于两倍扩容
5.扩容为20个元素,后面的使用null补齐
6.扩容完成后,elementCount位置插入新增的元素,然后elementCount++
4.LinkedList底层机制
1.新增第一个元素底层源码
1.代码
package com.sunxiansheng.collection;
import java.util.*;
public class demo {
public static void main(String[] args) {
List<Integer> list = new LinkedList<>();
list.add(1);
System.out.println(list);
}
}
2.debug
1.add方法调用linkLast
2.添加第一个节点
2.新增第二个元素底层源码
1.代码
2.debug
1.添加第二个节点
3.删除元素底层源码
1.代码
package com.sunxiansheng.collection;
import java.util.*;
public class demo {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.remove();
System.out.println(list);
}
}
2.debug
1.调用removeFirst方法
2.首先让f指向第一个节点,f不为空,调用unlinkFirst
3.element指向该元素的值
4.next指向当前元素的下一个元素
5.将当前节点的值置为null
6.将当前元素的下一个next指针指向null
7.让first指向下一个节点
8.让下一个节点的prev指向null
9.将链表的元素个数减一
10.最后返回删除的元素的值
5.List集合选择