JavaSE——List集合及其并发修改异常

List集合的实现类

List集合子类的特点

  • ArrayList集合

    底层是数组结构实现,查询快、增删慢

  • LinkedList集合

    底层是链表结构实现,查询慢、增删快

LinkedList集合的特有功能

  • 特有方法

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

     

    package com.zhao.list;
    
    import java.util.LinkedList;
    
    public class ListDemo1 {
        public static void main(String[] args) {
            //想要使用LinkedList的独有功能不能用多态写法
    
            //LinkedList可以完成队列结构和栈结构(双链表),拥有特有的功能
            //栈:先入后出,后入先出
            //栈中每次添加的元素应该加在开头,像压栈一样把旧的压下去
            LinkedList<String> stack = new LinkedList<>();
    
            //1.添加元素到开头.addFirst() 压栈/入栈
            stack.addFirst("第一个入栈的");
            stack.addFirst("第二个入栈的");
            stack.addFirst("第三个入栈的");
            System.out.println(stack);
            //-->[第三个入栈的, 第二个入栈的, 第一个入栈的]
    
            //2.从此列表中删除并返回第一个元素.removeFirst 出栈/弹栈
            System.out.println(stack.removeFirst());//-->第三个入栈的
            System.out.println(stack.removeFirst());//-->第二个入栈的
            System.out.println(stack.removeFirst());//-->第一个入栈的
            System.out.println(stack);//-->[]
    
            //队列:先入先出,后入后出
            //队列中的元素每次添加应该加在末尾,像排队一样
            //3.添加元素到末尾 .addLast() 入队
            LinkedList<String> queue = new LinkedList<>();
            queue.addLast("排1号的");
            queue.addLast("排2号的");
            queue.addLast("排3号的");
            System.out.println(queue);
            //-->[排1号的, 排2号的, 排3号的]
    
            //出队
            System.out.println(queue.removeFirst());//-->排1号的
            System.out.println(queue.removeFirst());//-->排2号的
            System.out.println(queue.removeFirst());//-->排3号的
            System.out.println(queue);//-->[]
        }
    }

 

删除List集合中的重复元素

package com.zhao.list;

import java.util.ArrayList;
import java.util.Iterator;

public class ListDemo2 {
    public static void main(String[] args) {
        //删除List集合中的重复元素
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        System.out.println(list);//-->[aaa, bbb, bbb, ccc, ddd]

        //删除所有bbb的元素
        /*
        不能用remove删,因为remove只能删相同元素的第一个
        list.remove("bbb");
        System.out.println(list);//-->[aaa, bbb, ccc, ddd]
        */

        //用迭代器删除
        /*Iterator<String> it = list.iterator();
        while (it.hasNext()){
            String ele=it.next();
            if ("bbb".equals(ele)){
                //使用迭代器删除
                it.remove();
            }
        }
        System.out.println(list);//-->[aaa, ccc, ddd]
        */

        //增强for删除
        /*for (String s : list) {
            if ("bbb".equals(s)){
                list.remove("bbb");
            }
        }
        System.out.println(list);*/
        //-->Exception in thread "main" java.util.ConcurrentModificationException
        //报错并发异常 因为list在删除掉第一个bbb的时候集合长度变短了,有可能会跳过接下来的一个元素
        //同理lambda表达式的forEach也不可以边遍历边删除

        //for循环删除
        //不报并发异常,但是会漏删,与之前原因相同
        //但是有解决办法,第一种就是从后往前删


        //第二种,正序进行删除后将i向后减1
        for (int i = 0; i < list.size(); i++) {
            String ele=list.get(i);
            if ("bbb".equals(ele)){
                list.remove("bbb");
                i--;
            }
        }
        System.out.println(list);//-->[aaa, ccc, ddd]

    }
}
posted @   SuzukiHane  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示