Java基础之LinkedList

一、LinkedList介绍

LinkedList是List接口的一个实现类(LinkedList实现了List的接口),它具有List的特点。LinkedList的底层结构是链表。

在这里插入图片描述

LinkedList并没有其他特点,List的特点即为它的特点:

1、可重复:当存入相同数据时,可以有重复的数据存入,这是因为List集合有带索引的方法,可以通过索引值不同来辨别那些相同的数据。

2、存取顺序一致:存入数据的顺序与输出数据的顺序一定一致。

3、有带索引的方法:可以直接通过索引得到相应数据,可以直接使用普通for循环来遍历集合。

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

二、LinkedList特有方法 LinkedList应知应会

由于LinkedList是List接口和Collection接口的实现类,因此List和Collection所拥有的方法,LinkedList均可使用,在此不再详细讲述。

方法名说明
void addFirst(E e)在集合头部插入数据
void addLast(E e)在集合尾部追加数据
E getFirst()获取集合第一个元素并返回元素值
E getLast()获取集合最后一个元素并返回元素值
E removeFirst()删除集合第一个元素并返回元素值
E removeLast()删除集合最后一个元素并返回元素值

2.1 调用addFirst() 方法在集合头部插入数据

public static void main(String[] args) {
        //创建一个数据类型为String类型的LinkedList对象
        LinkedList<String> linkedList=new LinkedList<>();
        //调用add()方法增添数据
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        //调用addFirst() 方法在集合头部插入数据
        linkedList.addFirst("aa");
        //普通方法输出集合
        System.out.println(linkedList);
    }

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


2.2 调用addLast() 方法在集合尾部追加数据

public static void main(String[] args) {
        //创建一个数据类型为String类型的LinkedList对象
        LinkedList<String> linkedList=new LinkedList<>();
        //调用add()方法增添数据
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        //调用addLast() 方法在集合尾部追加数据
        linkedList.addLast("bb");
        //普通方法输出集合
        System.out.println(linkedList);
    }

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


2.3 调用getFirst() 方法获取集合第一个元素并返回元素值

public static void main(String[] args) {
        //创建一个数据类型为String类型的LinkedList对象
        LinkedList<String> linkedList=new LinkedList<>();
        //调用add()方法增添数据
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        //调用getFirst() 方法获取集合第一个元素并返回元素值
        String first = linkedList.getFirst();
        System.out.println(first);
    }

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


2.4 调用getLast() 方法获取集合最后一个元素并返回元素值

public static void main(String[] args) {
        //创建一个数据类型为String类型的LinkedList对象
        LinkedList<String> linkedList=new LinkedList<>();
        //调用add()方法增添数据
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        //调用getLast() 方法获取集合最后一个元素并返回元素值
        String last = linkedList.getLast();
        System.out.println(last);
    }

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


2.5 调用removeFirst() 方法删除集合第一个元素并返回元素值

public static void main(String[] args) {
        //创建一个数据类型为String类型的LinkedList对象
        LinkedList<String> linkedList=new LinkedList<>();
        //调用add()方法增添数据
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        //调用removeFirst() 方法删除集合第一个元素并返回元素值
        String s = linkedList.removeFirst();
        System.out.println("被删除的第一个元素为:"+s);
        //普通输出
        System.out.println(linkedList);
    }

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


2.6 调用removeLast() 方法删除集合最后一个元素并返回元素值

public static void main(String[] args) {
        //创建一个数据类型为String类型的LinkedList对象
        LinkedList<String> linkedList=new LinkedList<>();
        //调用add()方法增添数据
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        //调用removeLast() 方法删除集合最后一个元素并返回元素值
        String s = linkedList.removeLast();
        System.out.println("被删除的最后一个元素为:"+s);
        //普通输出
        System.out.println(linkedList);
    }

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


三、LinkedList可重复特点

我们添加三个a和三个c数据

public static void main(String[] args) {
        //创建一个数据类型为String类型的LinkedList对象
        LinkedList<String> linkedList=new LinkedList<>();
        //调用add()方法增添数据
        linkedList.add("a");
        linkedList.add("a");
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        linkedList.add("c");
        linkedList.add("c");
        //普通输出
        System.out.println(linkedList);
    }

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


四、LinkedList存取顺序一致

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

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

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


五、LinkedList有带索引方法

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

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

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

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


5.2 普通for循环输出LinkedList集合

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

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


5.3 forEach语句输出LinkedList集合

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

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


5.4 Iterator迭代器输出LinkedList集合

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

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


六、LinkedList删除指定值的数据

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

public static void main(String[] args) {
        //创建一个数据类型为String类型的LinkedList对象
        LinkedList<String> linkedList=new LinkedList<>();
        //调用add()方法增添数据
        linkedList.add("daidai");
        linkedList.add("daidai");
        linkedList.add("aoao");
        linkedList.add("bobo");
        linkedList.add("lisi");
        linkedList.add("wangwu");
        linkedList.add("zhangsan");
        linkedList.add("daidai");
        //LinkedList删除值为daidai的元素
        for (int i = 0; i < linkedList.size(); i++) {
            if(linkedList.get(i).equals("daidai")){
                linkedList.remove(i);
            }
        }
        //普通输出
        System.out.println(linkedList);
    }

运行结果:(我们发现仍然有一个daidai未被删除
在这里插入图片描述
原因:当我们删除某一元素后,之前此元素之后的所有数据会左移,那么如果第二个与此元素相等的元素,于此元素并排,它就会左移至此元素的位置,而我们的指针之后会加1,因此会跳过它。文字难以理解?没关系,上图解!!!

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


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


但是此时我们的i索引指向的是1,因此在之后的遍历中会跳过一个daidai,发生漏删现象
请添加图片描述


6.2 漏删数据解决办法

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

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

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


OK!!!LinkedList介绍结束!!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值