java中List元素移除元素的那些坑(下)

简介: 本文主要介绍,java中list集合移除元素的那些坑,今天小编就和大家一起来了解一下吧!

二、解决办法


2.1、采用倒序移除

public static void main(String[] args) {
  List<String> list = new ArrayList<String>();
  list.add("11");
  list.add("11");
  list.add("12");
  list.add("13");
  list.add("14");
  list.add("15");
  list.add("16");
  System.out.println("原始list元素:"+ list.toString());
  CopyOnWriteArrayList<String> copyList = new CopyOnWriteArrayList<>(list);
  //通过下表移除等于11的元素
  for (int i = list.size() - 1; i >= 0; i--) {
    String item = list.get(i);
    if("11".equals(item)) {
      list.remove(i);
    }
  }
  System.out.println("通过下表移除后的list元素:"+ list.toString());
  //通过对象移除等于11的元素
  for (int i = copyList.size() - 1; i >= 0; i--) {
    String item = copyList.get(i);
    if("11".equals(item)) {
      copyList.remove(item);
    }
  }
  System.out.println("通过对象移除后的list元素:"+ list.toString());
}

输出结果:

原始list元素:[11, 11, 12, 13, 14, 15, 16]
通过下表移除后的list元素:[12, 13, 14, 15, 16]
通过对象移除后的list元素:[12, 13, 14, 15, 16]

2.2、fore的解决办法

public static void main(String[] args) {
  List<String> list = new ArrayList<String>();
  list.add("11");
  list.add("11");
  list.add("12");
  list.add("13");
  list.add("14");
  list.add("15");
  list.add("16");
  System.out.println("原始list元素:"+ list.toString());
  CopyOnWriteArrayList<String> copyList = new CopyOnWriteArrayList<>(list);
  //通过对象移除等于11的元素
  for (String item : copyList) {
    if("11".equals(item)) {
      copyList.remove(item);
    }
  }
  System.out.println("通过对象移除后的list元素:"+ copyList.toString());
}

输出结果:

原始list元素:[11, 11, 12, 13, 14, 15, 16]
通过对象移除后的list元素:[12, 13, 14, 15, 16]

2.3、使用迭代器移除

public static void main(String[] args) {
  List<String> list = new ArrayList<String>();
  list.add("11");
  list.add("11");
  list.add("12");
  list.add("13");
  list.add("14");
  list.add("15");
  list.add("16");
  System.out.println("原始list元素:"+ list.toString());
  //通过迭代器移除等于11的元素
  Iterator<String> iterator = list.iterator();
  while(iterator.hasNext()) {
    String item = iterator.next();
    if("11".equals(item)) {
      iterator.remove();
    }
  }
  System.out.println("通过迭代器移除后的list元素:"+ list.toString());
}

输出结果:

原始list元素:[11, 11, 12, 13, 14, 15, 16]
通过迭代器移除后的list元素:[12, 13, 14, 15, 16

2.4、jdk1.8的写法

public static void main(String[] args) {
  List<String> list = new ArrayList<String>();
  list.add("11");
  list.add("11");
  list.add("12");
  list.add("13");
  list.add("14");
  list.add("15");
  list.add("16");
  System.out.println("原始list元素:"+ list.toString());
  //jdk1.8移除等于11的元素
  list.removeIf(item -> "11".equals(item));
  System.out.println("移除后的list元素:"+ list.toString());
}

输出结果:

原始list元素:[11, 11, 12, 13, 14, 15, 16]
通过迭代器移除后的list元素:[12, 13, 14, 15, 16]

是不是好简单,哈哈!


三、总结


如果开发中需要在集合中移除某个元素,如果jdk是1.8的,建议直接使用2.4方法,如果是低版本,那么建议采用迭代器方法,效率高,性能好!


相关文章
|
2月前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
33 2
|
3月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
50 3
|
2月前
|
Java
那些与Java Set擦肩而过的重复元素,都经历了什么?
在Java的世界里,Set如同一位浪漫而坚定的恋人,只对独一无二的元素情有独钟。重复元素虽屡遭拒绝,但通过反思和成长,最终变得独特,赢得了Set的认可。示例代码展示了这一过程,揭示了成长与独特性的浪漫故事。
23 4
|
2月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
2月前
|
存储 算法 Java
为什么Java Set如此“挑剔”,连重复元素都容不下?
在Java的集合框架中,Set是一个独特的接口,它严格要求元素不重复,适用于需要唯一性约束的场景。Set通过内部数据结构(如哈希表或红黑树)和算法(如哈希值和equals()方法)实现这一特性,自动过滤重复元素,简化处理逻辑。示例代码展示了Set如何自动忽略重复元素。
34 1
|
3月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
72 5
|
3月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
57 3
|
3月前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
31 1
|
3月前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
31 2
|
11天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者