我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java 如何在list中删除我指定的对象

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java 如何在list中删除我指定的对象

遍历list,删除指定对象的三种方式

1、再定义一个List,用来保存需要删除的对象

修改部分代码:


 List<User> userRemove = new ArrayList<User>();
        //找出要删除的用户
        System.err.println("要删除的用户:");
        for (User result : list)
        {
            if (result.getId() == 1 || result.getId() == 3)
            {
                userRemove.add(result);
                System.err.println("id:" + result.getId() + "\tname:" + result.getName());
            }
        }
        list.removeAll(userRemove);
        //剩下的用户
        System.err.println("剩下的用户:");
        for (User result : list)
        {
            System.err.println("id:" + result.getId() + "\tname:" + result.getName());
        }

2、不用for-each循环,使用倒序循环删除


for(int i=list.size()-1;i>=0;i--)
                {
                    User result = list.get(i);
                    if (result.getId() == 3)
                    {
                        list.remove(result);
                        System.err.println("id: " + result.getId() + "\tname: " + result.getName());
                    }
                }

3、用迭代器删除


Iterator<User> it = list.iterator();
        while (it.hasNext())
        {
            User userObj = it.next();
            if (userObj.getId() == 3)
            {
                it.remove();
            }
        }
        //剩下的用户
        System.err.println("剩下的用户:");
        for (User result : list)
        {
            System.err.println("id:" + result.getId() + "\tname:" + result.getName());
        }

PS: 用for-each遍历 实际上使用的是Iterator迭代器

Iterator的工作机制

Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说Iterator在工作的时候,是不允许被迭代的对象被改变的。

Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。

List、Set等是动态的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。

三种方式 方便以后学习 !

List集合删除元素的正确姿势

在阅读阿里巴巴规约的时候发现有一条规约是关于List的【不要在foreach里面进行元素的remove/add操作,remove请使用Iterator方式】。然后想起以前自己做项目的时候删除某一元素的逻辑报下标越界错误,那时候记得处理是用一新的List进行存储,然后整体从原List移除所有符合规则的元素,现在做一总结。用这个Iterator主要可以避免下标越界或者遍历是漏掉符合规则的下一个数据。

先拉出来正确删除元素的姿势。正确姿势是利用Iterator的remove方法。具体操作如下:


public static void main(String[] args) {
        List<Integer> lists = new ArrayList<Integer>();
        lists.add(1);
        lists.add(2);
        lists.add(3);
        lists.add(4);
        lists.add(5);
        Iterator<Integer> iterator = lists.iterator();
        while (iterator.hasNext()){
            Integer obj = iterator.next();
            if(3==obj || 4==obj){
                iterator.remove();
            }
        }
        System.out.println(lists);
    }

附上自己比较笨的操作方式:


public static void main(String[] args){
            List<Integer> lists = new ArrayList<Integer>();
            List<Integer> listscopy = new ArrayList<>();
            lists.add(1);
            lists.add(2);
            lists.add(3);
            lists.add(4);
            lists.add(5);
            int size = lists.size();
            for (int i = 0; i < lists.size(); i++) {
                if(3==lists.get(i) || 4 == lists.get(i)){
                    listscopy.add(lists.get(i));
                }
            }
            lists.removeAll(listscopy);
            System.out.println(lists);
        }

常用的错误方式有以下三种

第一种方式,多出现下标越界问题。这个主要原因是因为我们在循环遍历时,将我们的长度进行定值确定。而忽略掉在满足条件时,list的长度是减少的。


public static void main(String[] args) {
 List<Integer> lists = new ArrayList<Integer>();
        lists.add(1);
        lists.add(2);
        lists.add(3);
        lists.add(4);
        lists.add(5);
        int size = lists.size();  // 定长设置,会造成元素下标越界,如果将for中变量直接换成lists.size()可以吗?
        for (int i = 0; i < size; i++) {
            if(3==lists.get(i) || 4 == lists.get(i)){
                lists.remove(i); //lists.remove(lists.get(i));
            }
        }
        System.out.println(lists);
 }

第二种方式也就是上面的注释所说,既然会出现下标越界,那我就利用动态的大小不就可以了,但是利用这种方法会产生另外一种情况,就是会忽略掉remove元素后面的一个元素,这个是因为删除符合规则的元素后,list长度减一,而同时后面的元素往前补一位,造成当前i值下对应两个元素。


public static void main(String[] args) {
        List<Integer> lists = new ArrayList<Integer>();
        lists.add(1);
        lists.add(2);
        lists.add(3);
        lists.add(4);
        lists.add(5);
        int size = lists.size();
        for (int i = 0; i < lists.size(); i++) {
            if(3==lists.get(i) || 4 == lists.get(i)){
                lists.remove(i); //lists.remove(lists.get(i));
            }
        }
        System.out.println(lists); // 打印[1, 2, 4, 5] 此时会将4忽略掉
    }

第三种方式是利用增强FOR循环造成的。这种方式会直接给报错:


ERRORInfo:
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
public static void main(String[] args) {
        List<Integer> lists = new ArrayList<Integer>();
        lists.add(1);
        lists.add(2);
        lists.add(3);
        lists.add(4);
        lists.add(5);
       for (Integer i : lists){
           if(3==i || 4==i){
               lists.remove(i);
           }
       }
        System.out.println(lists);
    }

这种情况下。主要是集合遍历是使用Iterator, Iterator是工作在一个独立的线程中,并且拥有一个互斥锁。Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast原则 Iterator 会马上抛出java.util.ConcurrentModificationException 异常。所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java 如何在list中删除我指定的对象

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么在R语言中删除指定变量或对象

这篇文章给大家介绍怎么在R语言中删除指定变量或对象,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、直接删除>a<-c(1,2,3)>rm(a)2、以字符串形式的方式删除>a<-c(1,2,3)>rm(a)3、删除不再
2023-06-14

php如何删除指定k键的键值对

今天小编给大家分享一下php如何删除指定k键的键值对的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。unset函数PHP中可以
2023-07-05

如何使用Python删除ElasticSearch中的指定数据?(Python中如何实现对ElasticSearch中特定数据的删除?)

本文详细介绍了如何使用Python删除ElasticSearch中的特定数据。文章提供了三种方法:delete()方法:直接删除指定文档。delete_by_query()方法:使用查询条件删除匹配的文档。scroll()方法:获取文档迭代器,逐个删除它们。文章还强调了最佳实践、注意事项和代码示例,供读者参考。
如何使用Python删除ElasticSearch中的指定数据?(Python中如何实现对ElasticSearch中特定数据的删除?)
2024-04-02

java中如何判断map集合对象中是否存在指定key

该方法判断Map集合对象中是否包含指定的键名。如果Map集合中包含指定的键名,则返回true,否则返回false。语法:containsKey(Object key)判断方法:首先定义一个map对象,然后通过“put()”方法向集合中添加对象,接着定义一个指定
java中如何判断map集合对象中是否存在指定key
2014-07-07

PHP如何删除数组中的指定值

本篇内容主要讲解“PHP如何删除数组中的指定值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP如何删除数组中的指定值”吧!什么是PHP数组?在PHP中,数组是一种可以存储多个值的数据类型。数
2023-07-05

java如何删除所有出现的指定字符

这篇文章主要介绍了java如何删除所有出现的指定字符,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如何删除所有出现的指定字符?字符串类没有提供 remove() 方法,但提供
2023-06-27

php如何删除数组中的指定的值

今天小编给大家分享一下php如何删除数组中的指定的值的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在PHP中,数组是一种重要
2023-07-05

如何在GridView中删除选定的行

要在GridView中删除选定的行,可以按照以下步骤进行操作:1. 在GridView中设置选择模式为单选或多选模式。可以通过设置`android:choiceMode`属性来实现。例如,将其设置为`"singleChoice"`表示单选模
2023-09-26

python如何删除文件中的指定内容

要删除文件中的指定内容,可以按以下步骤操作:1. 打开文件,读取内容并存储在变量中。2. 使用字符串的 `replace()` 方法,将要删除的内容替换为空字符串。3. 关闭文件。4. 重新打开文件,以写入模式打开。5. 将替换后的内容写入
2023-10-07

c++中vector如何删除指定位置的元素

要删除vector中指定位置的元素,可以使用erase()方法。该方法接受一个迭代器作为参数,指示要删除的元素位置。以下是一个示例代码:#include #include int main() {s
c++中vector如何删除指定位置的元素
2024-03-02

Java中如何对自定义对象集合进行遍历并处理?(在Java中,如何遍历自定义对象的集合并对每个对象进行处理?)

本指南介绍了在Java中遍历自定义对象集合并对其进行处理的四种方法:增强for循环、迭代器、流以及并行流。增强for循环和流适用于小型集合和不需要修改元素的情况,而迭代器则适合需要修改元素或并发处理的场景。并行流可利用多线程提高性能。最佳实践包括考虑集合大小、并发性、元素修改和可读性。
Java中如何对自定义对象集合进行遍历并处理?(在Java中,如何遍历自定义对象的集合并对每个对象进行处理?)
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录