Java基础之List

一、List介绍

List是集合体系中较为重要的接口,它具有单列存储的特点,即一次只能添加一个元素。它具有三大特点:
可重复:当存入相同数据时,可以有重复的数据存入,这是因为List集合有带索引的方法,可以通过索引值不同来辨别那些相同的数据。
存取顺序一致:存入数据的顺序与输出数据的顺序一定一致。
有带索引的方法:可以直接通过索引得到相应数据,可以直接使用普通for循环来遍历集合。

接下来我们将结合代码来具体学习List相关知识。

二、List常用方法 List应知应会

List作为接口,它最常用的实现类是ArrayList和LinkedList,作为接口它抽取了所有实现类的共有方法,所有实现List接口的实现类均可使用这些方法。例如ArrayList和LinkedList均可使用如下共有方法。

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

2.1 调用add()方法增添数据(可指定位置添加)

具体实现类为ArrayList的List

public static void main(String[] args) {
    
    
        //创建一个数据类型为Integer的List对象,并指明其实现类为ArrayList
        List<Integer> list=new ArrayList<>();
        //调用add()方法增添数据
        list.add(15);
        list.add(17);
        list.add(19);
        list.add(20);
        //调用add()方法向指定位置插入元素
        list.add(1,16);
        list.add(3,18);
        //普通输出
        System.out.println(list);
    }

运行结果:
在这里插入图片描述


具体实现类为LinkedList的List

public static void main(String[] args) {
    
    
        //创建一个数据类型为Integer的List对象,并指明其实现类为LinkedList
        List<Integer> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add(15);
        list.add(17);
        list.add(19);
        list.add(20);
        //调用add()方法向指定位置插入元素
        list.add(1,16);
        list.add(3,18);
        //普通输出
        System.out.println(list);
    }

运行结果:
在这里插入图片描述


2.2 调用remove()方法删除指定位置元素并返回被删除元素

接下来我们就以实现类为LinkedList的List来具体举例

public static void main(String[] args) {
    
    
        //创建一个数据类型为Integer的List对象,并指明其实现类为LinkedList
        List<Integer> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add(15);
        list.add(16);
        list.add(17);
        list.add(18);
        list.add(18);
        list.add(19);
        list.add(20);
        //调用remove()方法删除指定位置元素并返回被删除元素
        Integer remove = list.remove(3);
        System.out.println("被删除的元素为:"+remove);
        //普通输出
        System.out.println(list);
    }

运行结果:(从运行结果中我们看到调用remove()方法删除18之后,后面元素的位置会左移,这为我们未来删除数据时注意索引的位置,防止漏删
在这里插入图片描述


2.3 调用set()方法修改指定位置元素并返回初始数据

public static void main(String[] args) {
    
    
        //创建一个数据类型为Integer的List对象,并指明其实现类为LinkedList
        List<Integer> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add(15);
        list.add(17);
        list.add(19);
        list.add(20);
        //调用add()方法向指定位置插入元素
        list.add(1,16);
        list.add(3,18);
        //调用set()方法修改指定位置元素并返回初始数据
        Integer set = list.set(3, 188);
        System.out.println(set);
    }

运行结果:
在这里插入图片描述


2.4 调用get()方法返回指定位置元素

public static void main(String[] args) {
    
    
        //创建一个数据类型为Integer的List对象,并指明其实现类为LinkedList
        List<Integer> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add(15);
        list.add(17);
        list.add(19);
        list.add(20);
        //调用add()方法向指定位置插入元素
        list.add(1,16);
        list.add(3,18);
        //调用get()方法返回指定位置元素
        Integer integer = list.get(1);
        System.out.println(integer);
    }

运行结果:
在这里插入图片描述


三、List可重复特点

我们增添两个aoao和两个daidai数据

public static void main(String[] args) {
    
    
        //创建一个数据类型为String的List对象,并指明其实现类为LinkedList
        List<String> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add("aoao");
        list.add("aoao");
        list.add("daidai");
        list.add("daidai");
        //调用add()方法向指定位置插入元素
        list.add(1,"zhangsan");
        list.add(3,"lisi");
        //普通输出
        System.out.println(list);
    }

运行结果:(我们看到重复的数据同样也会被输出
在这里插入图片描述


四、List存取顺序一致

我们存入数据的顺序是aoao,daidai,bobo,lisi,wangwu,zhangsan

public static void main(String[] args) {
    
    
        //创建一个数据类型为String的List对象,并指明其实现类为LinkedList
        List<String> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add("aoao");
        list.add("daidai");
        list.add("bobo");
        list.add("lisi");
        list.add("wangwu");
        list.add("zhangsan");
        //普通输出
        System.out.println(list);
    }

运行结果:
在这里插入图片描述


五、List有带索引的方法

因为List有带索引的方法,因此可以直接通过索引得到相应数据,可以使用普通for循环,普通输出语句,forEach语句和Iterator迭代器来遍历集合。

5.1 普通输出语句输出List集合

public static void main(String[] args) {
    
    
        //创建一个数据类型为String的List对象,并指明其实现类为LinkedList
        List<String> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add("aoao");
        list.add("daidai");
        list.add("bobo");
        list.add("lisi");
        list.add("wangwu");
        list.add("zhangsan");
        //普通输出
        System.out.println(list);
    }

运行结果:
在这里插入图片描述


5.2 普通for循环输出List集合

public static void main(String[] args) {
    
    
        //创建一个数据类型为String的List对象,并指明其实现类为LinkedList
        List<String> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add("aoao");
        list.add("daidai");
        list.add("bobo");
        list.add("lisi");
        list.add("wangwu");
        list.add("zhangsan");
        //普通for循环输出List集合
        for (int i = 0; i < list.size(); i++) {
    
    
            System.out.println(list.get(i));
        }
    }

运行结果:
在这里插入图片描述


5.3 forEach语句输出List集合

public static void main(String[] args) {
    
    
        //创建一个数据类型为String的List对象,并指明其实现类为LinkedList
        List<String> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add("aoao");
        list.add("daidai");
        list.add("bobo");
        list.add("lisi");
        list.add("wangwu");
        list.add("zhangsan");
        //forEach语句输出List集合
        //s即为list遍历的结果,String即为list的数据类型
        for (String s : list) {
    
    
            System.out.println(s);
        }
    }

运行结果:
在这里插入图片描述


5.4 Iterator迭代器输出List集合

public static void main(String[] args) {
    
    
        //创建一个数据类型为String的List对象,并指明其实现类为LinkedList
        List<String> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add("aoao");
        list.add("daidai");
        list.add("bobo");
        list.add("lisi");
        list.add("wangwu");
        list.add("zhangsan");
        //Iterator迭代器输出List集合
        Iterator<String> iterator=list.iterator();
        //iterator.hasNext()的作用即为判断当前位置是否存在元素,若存在则返回true,否则返回false
        while(iterator.hasNext()){
    
    
            //iterator.next()的作用即为获取当前位置元素,并指向下一位置以便hashNext判断
            System.out.println(iterator.next());
        }
    }

运行结果:
在这里插入图片描述


六、List删除指定值的数据

6.1 删除指定值的数据漏删数据 常见问题

public static void main(String[] args) {
    
    
        //创建一个数据类型为Integer的List对象,并指明其实现类为LinkedList
        List<Integer> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add(15);
        list.add(18);
        list.add(18);
        list.add(16);
        list.add(17);
        list.add(18);
        list.add(19);
        list.add(20);
        list.add(18);
        //List删除值为18的元素
        for (int i = 0; i < list.size(); i++) {
    
    
            if(list.get(i).equals(18)){
    
    
                list.remove(i);
            }
        }
        //普通输出
        System.out.println(list);
    }

运行结果:(我们发现仍然有一个18未被删除
在这里插入图片描述

原因:当我们删除某一元素后,之前此元素之后的所有数据会左移,那么如果第二个与此元素相等的元素,于此元素并排,它就会左移至此元素的位置,而我们的指针之后会加1,因此会跳过它。文字难以理解?没关系,上图解!!!

首先我们插入集合数据元素的顺序如下:
请添加图片描述


当我们删除第一个18之后,集合变为如下图:(我们不难得出结论当我们删除List集合中的某一数据时,集合会自动缩容。被删除的元素之后的元素会发生左移,即我们删除18之后之前索引为2值为18的元素左移后,变为索引为1值为18
请添加图片描述


但是此时我们的i索引指向的是2,因此在之后的遍历中会跳过一个18,发生漏删现象

请添加图片描述


6.2 漏删数据解决办法

当我们删除一个数据后,为了防止漏删,索引i也应跟着左移,即i-1

public static void main(String[] args) {
    
    
        //创建一个数据类型为Integer的List对象,并指明其实现类为LinkedList
        List<Integer> list=new LinkedList<>();
        //调用add()方法增添数据
        list.add(15);
        list.add(18);
        list.add(18);
        list.add(16);
        list.add(17);
        list.add(18);
        list.add(19);
        list.add(20);
        list.add(18);
        //List删除值为18的元素
        for (int i = 0; i < list.size(); i++) {
    
    
            if(list.get(i).equals(18)){
    
    
                list.remove(i);
                //之所以i要减一,是因为当我们删除第一个18后,之前第一个18之后的所有数据会左移,那么第二个18就会左移至第一个18的位置,如果我们的i不减1,那么就会跳过第二个18而不删除它
                i=i-1;
            }
        }
        //普通输出
        System.out.println(list);
    }

运行结果:
在这里插入图片描述


OK!!!List介绍结束!!!

猜你喜欢

转载自blog.csdn.net/qq_45344586/article/details/130028976