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集合选择
 
