专栏名称: 码农小胖哥
技术公众号:码农小胖哥
目录
相关文章推荐
新疆949交通广播  ·  降温10~14℃!气温大起大落!下周寒潮来袭... ·  11 小时前  
女神汇  ·  有一个摆摊卖炸串的男朋友是什么体验? ·  2 天前  
新疆949交通广播  ·  就在今天,新疆正式进入…… ·  3 天前  
新疆949交通广播  ·  本月底开通!进出疆航线+1 ·  3 天前  
51好读  ›  专栏  ›  码农小胖哥

Java Collection 移除元素的几种方式

码农小胖哥  · 掘金  ·  · 2019-12-31 13:18

正文

阅读 0

Java Collection 移除元素的几种方式

1. 前言

操作集合是一个 Java 编程人员几乎每天都在重复的事情。今天我们来研究一下从 Java Collection 中删除元素的方法。我构建了一个简单的集合,我们以此为例子来展开探索。

  List<String> servers = new ArrayList<>();
        servers.add("Felordcn");
        servers.add("Tomcat");
        servers.add("Jetty");
        servers.add("Undertow");
        servers.add("Resin");复制代码

2. for 循环并不一定能从集合中移除元素

让我们使用传统的 foreach 循环移除 F 开头的假服务器,但是你会发现这种操作引发了 ConcurrentModificationException 异常。

 // 错误的示范 千万不要使用
  for (String server : servers) {
    if (server.startsWith("F")) {
        servers.remove(server);
    }
 }复制代码

难道 for 循环就不能移除元素了吗?当然不是!我们如果能确定需要被移除的元素的索引还是可以的。

 // 这种方式是可行
 for (int i = 0; i < servers.size(); i++) {
    if (servers.get(i).startsWith("F")) {
        servers.remove(i);
    }
}复制代码

但是这种方式我目前只演示了 ArrayList ,其它的类型并没有严格测试,留给你自己探索。

3. 迭代器 Iterator 可以删除集合中的元素

在传统方式中我们使用 Iterator 是可以保证删除元素的:

    Iterator<String> iterator = servers.iterator();

        while (iterator.hasNext()) {
            String next = iterator.next();
            if (next.startsWith("F")) {
                iterator.remove();
            }
        }复制代码

4. 遍历删除元素的缺点

  • 我们需要遍历集合的每一个元素并对它们进行断言,哪怕你删除一个元素。
  • 尽管我们可以通过迭代的方式删除特定的元素,但是操作繁琐,根据集合类型的不同有潜在的 ConcurrentModificationException 异常。
  • 根据数据结构的不同,删除元素的时间复杂度也大大不同。比如数组结构的 ArrayList 在删除元素的速度上不如链表结构的 LinkedList

5. 新的集合元素删除操作

Java 8 提供了新的集合操作 API Stream 来帮助我们解决这个问题。我在以前的文章中已经介绍了 Java 8 Stream API ,如果有兴趣可以去看看。







请到「今天看啥」查看全文