6.List系列集合


一、List集合特点、特有API

List系列集合特点

● ArrayList、LinkedList:有序、可重复、有索引

● 有序:存储和取出的元素顺序一致

● 有索引:可以通过索引操作元素

● 可重复:存储的元素可以重复

List的实现类的底层原理

ArrayList底层基于数组实现:根据索引定位元素,增删相对

LinkedList底层基于双链表实现:查询元素,增删首尾元素是非常的。

LIst集合特有方法

List集合因为支持索引,所以多了很多索引操作的独特API,其他Collection的功能List也都继承了。

方法名称 说明
void add(int index, E element) 在此集合中的指定位置插入指定的元素
E remove(int index) 删除指定索引处的元素,返回被删除的元素
E set(int index, E element) 修改指定索引的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素

代码示例1】创建一个ArrayList集合对象 add(int index, E element)

public class ListDemo01 {
    public static void main(String[] args){
      // 1.创建一个ArrayList集合对象
        List list = new ArrayList<>();
        list.add("Java");
        list.add("Java");
        list.add("MySQL");
        list.add("MySQL");
        System.out.println(list);
    }
}

运行结果:

[Java, Java, MySQL, MySQL]

代码示例2】在某个索引位置插入元素 set(int index, E element)

// 2.在某个索引位置插入元素
list.add(2,"HTML");
System.out.println(list);

运行结果:

[Java, Java, HTML, MySQL, MySQL]

代码示例3】根据索引删除元素,返回被删除的元素

// 3.根据索引删除元素,返回被删除的元素
System.out.println(list.remove(2));
System.out.println(list);

运行结果:

HTML
[Java, Java, MySQL, MySQL]

代码示例4】根据索引获取元素

System.out.println(list.get(2));  // MySQL

代码示例5】修改索引位置的元素

// 5.修改索引位置的元素
list.set(1,"高斯林");
System.out.println(list);

 运行结果:

[Java, 高斯林, MySQL, MySQL]

示例代码6】清空

list.clear();   //[]

二、List集合的遍历方式小结

List集合的遍历方式有几种?

① 迭代器

② 增强for循环

③ Lambda表达式

④ For循环(因为List集合存在索引)

代码示例

public class ListDemo02 {
    public static void main(String[] args){
        List lists = new ArrayList<>();
        lists.add("java1");
        lists.add("java2");
        lists.add("java3");
        System.out.println(lists);

        // 1.for循环
        System.out.println("---------------------------");
        for(int i=0; i it = lists.iterator();
        while(it.hasNext()){
            String ele = it.next();
            System.out.print(ele + " ");
        }

        // 3.foreach
        System.out.println("\n---------------------------");
        for(String ele : lists){
            System.out.print(ele + " ");
        }

        // 4.JDK 1.8开始之后的Lambda表达式
        System.out.println("\n---------------------------");
        lists.forEach(s -> {
            System.out.print(s + " ");
        });
    }
}

运行结果:

[java1, java2, java3]
---------------------------
java1 java2 java3 
---------------------------
java1 java2 java3 
---------------------------
java1 java2 java3 
---------------------------
java1 java2 java3 

三、ArrayList集合的底层原理

ArrayList集合底层原理

第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。

List list = new ArrayList<>();
list.add("a");

四、LinkedList集合的底层原理

LinkedList的特点

底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首位操作的API。

LinkedList集合的特有功能

方法名称 说明
public void addFirst (E e) 在该列表开头插入指定的元素
public void addLast (E e) 将指定的元素追加到此列表的末尾
public E getFirst ( ) 返回此列表中的第一个元素
public E getLast ( ) 返回此列表中的最后一个元素
public E removeFirst ( ) 从此列表中删除并返回第一个元素
public E removeLast ( ) 从此列表中删除并返回最后一个元素

LinkedList可以完成队列结构,和栈结构(双链表)

【代码示例1】栈

public class ListDemo03 {
    public static void main(String[] args) {
        // 栈
        LinkedList stack = new LinkedList<>();
        // 压栈,入栈
        stack.addFirst("第1颗子弹");
        stack.addFirst("第2颗子弹");
        stack.addFirst("第3颗子弹");
        stack.addFirst("第4颗子弹");
        System.out.println(stack);
        // 出栈,弹栈
        System.out.println("---------------------");
        System.out.println(stack.getFirst());    // 第4颗子弹
        System.out.println(stack);
        System.out.println("---------------------");

        System.out.println(stack.removeFirst());
        System.out.println(stack.removeFirst());
        System.out.println(stack.removeFirst());
        System.out.println(stack);
    }
}

运行结果:

[第4颗子弹, 第3颗子弹, 第2颗子弹, 第1颗子弹]
---------------------
第4颗子弹
[第4颗子弹, 第3颗子弹, 第2颗子弹, 第1颗子弹]
---------------------
第4颗子弹
第3颗子弹
第2颗子弹
[第1颗子弹]

【代码示例2】队列

public class ListDemo03 {
    public static void main(String[] args) {
        // 队列
        LinkedList queue = new LinkedList<>();
        // 入队
        queue.addLast("1号");
        queue.addLast("2号");
        queue.addLast("3号");
        queue.addLast("4号");
        System.out.println(queue);
        // 出队
        System.out.println("---------------------");
        System.out.println(queue.getFirst());
        System.out.println(queue);
        System.out.println("---------------------");

        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue);
    }
}

运行结果:

[1号, 2号, 3号, 4号]
---------------------
1号
[1号, 2号, 3号, 4号]
---------------------
1号
2号
3号
[4号]