Java—— 集合 List

List集合的特点

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

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

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

List集合的方法

Collection的方法List都继承了,可以使用Collection中的方法

此外,List集合因为有索引,所以多了很多索引操作的方法。

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

注意:

List集合中的上述方法存在重载现象,一个是继承Collection的需要提供的参数是给定的具体对象,另一个是List自己的需要提供的参数是索引,所以出现以下问题。

例如:remove(1),到底是删除泛型是<Integer>集合中的元素1,还是删除1索引上的元素

答:优先调用形参和实参类型一致的方法

代码演示:

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class Test5 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        System.out.println(list);//[1, 2, 3]

        //1是int类型,所以调用形参是int类型的删除指定索引处的元素
        list.remove(1);
        System.out.println(list);//[1, 3]

        //将1变为Integer类型
        Integer i = Integer.valueOf(1);
        //i变量中的1是引用数据类型,所以调用形参是Object类型的删除指定元素
        list.remove(i);
        System.out.println(list);//[3]

    }
}

List集合的遍历方式

除了与Collection相同的迭代器遍历,增强for遍历,lambda遍历外,还有普通for遍历,列表迭代器遍历。

普通for遍历

代码演示

java 复制代码
public class Test6 {
    public static void main(String[] args) {
        //普通for遍历
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        for (int i = 0; i < list.size(); i++) {
            String str = list.get(i);
            System.out.println(str);
        }
        //aaa
        //bbb
        //ccc
    }
}

列表迭代器遍历

说明

列表迭代器ListIterator继承自迭代器Iterator,

获取列表迭代器

|-----------------------------------|---------------------|
| 方法名称 | 说明 |
| ListIterator<E> listIterator () | 返回迭代器对象默认指向当前集合的0索引 |

常用方法

|------------------------|-----------------------------------------------|
| 方法名 | 说明 |
| boolean hasNext () | 正向遍历列表 判断当前位置是否有元素, 有元素返回true,没有元素返回false |
| E next () | 获取当前位置的元素 并将迭代器对象移向下一个位置。 |
| boolean hasPrevious () | 逆向遍历列表 判断当前位置是否有元素, 有元素返回true,没有元素返回false(了解) |
| E previous () | 获取当前位置的元素 并将迭代器对象移向上一个位置。(了解) |
| vold add (E e) | 将指定的元素插入列表 |
| void remove () | 删除获取到的元素 |

代码演示
java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Test6 {
    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        //遍历打印
        ListIterator<String> lit1 = list.listIterator();
        while (lit1.hasNext()) {
            String str = lit1.next();
            System.out.println(str);
        }
        //aaa
        //bbb
        //ccc

        //遍历添加:在aaa的后面添加ddd
        ListIterator<String> lit2 = list.listIterator();
        while (lit2.hasNext()) {
            String s = lit2.next();
            if (s.equals("aaa")) {
                lit2.add("ddd");
            }
        }
        System.out.println(list);//[aaa, ddd, bbb, ccc]

    }
}

ArrayList集合底层原理

底层数据结构是数组,查询快,增删慢
1.利用空参创建的集合,在底层创建一个默认长度为0的数组

2.添加第一个元素时,底层会创建一个新的长度为10的数组

3.存满时,会扩容1.5倍

4.如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准

LinkedList集合底层原理

底层数据结构是双向链表,查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的

因此LinkedList本身多了很多直接操作首尾元素的特有API,所以除了继承自Collection和List中的方法,还有以下方法

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

相关推荐
2601_962071573 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491113 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
淡海水4 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero4 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-5 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
zww89491116 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
kiracrimson6 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
黑马程序员毕设7 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳7 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊7 小时前
归并排序之翻转对(hard)
数据结构·算法