Java:删除整数型List中的指定数值

郎家岭伯爵 2023年04月23日 669次浏览

前言

对于整数型的 List,如果我们需要删除指定数值的元素应该如何操作呢?

例如有一个如下 List:

List<Integer> list = new ArrayList<>(Arrays.asList(1,2, 3, 4, 5, 6, 7, 8, 9, 10));

我们需要删除元素 5,不是第 5 个元素。

实现

问题解决

List 中提供了 remove() 方法的两个构造方法:一个针对元素值进行删除,另一个针对元素的 Index 进行删除。

但由于本案例中的 List 是整数型的,使用 list.remove(5) 会被识别为移除第 5 个元素:

针对这种场景,我们可以使用如下两种方式解决

  • list.remove(Integer.valueOf(5));
  • list.remove(new Integer(5));

推荐使用第一种方式解决,因为 Integer 把 -128~127 的整数放入了 cache,从 cache 中取得的值不需要创建新的对象。

理论拓展

在 Java 中,Integer 类会将 -128 到 127 之间的整数缓存起来,以便重复使用。这个缓存被称为“整数缓存池”(Integer Cache),它是一个长度为 256 的数组,其中包含了所有可能用到的整数对象。

当创建一个 Integer 对象时,如果它的值在 -128 到 127 的范围内,则会直接从缓存池中获取相应的对象,而不是创建一个新的对象。这样可以节省内存空间,并且提高程序的执行效率。

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // 输出 true

Integer c = 200;
Integer d = 200;
System.out.println(c == d); // 输出 false

在上面的示例中,我们首先创建了两个 Integer 对象 a 和 b,它们的值都为 100。由于 100 在 -128 到 127 的范围内,因此它们引用的是同一个对象,所以 a == b 的结果为 true。

接着,我们创建了两个 Integer 对象 c 和 d,它们的值都为 200。由于 200 不在 -128 到 127 的范围内,因此它们引用的是不同的对象,所以 c == d 的结果为 false。

需要注意的是,由于缓存池中的对象是可变的,因此不应该修改它们的值。如果需要修改一个缓存池中的对象的值,应该先将其复制到一个新的对象中,然后再进行修改。

除了 Integer 类型之外,Java 中的 ByteShortLongCharacterBoolean 类型也有类似的缓存机制。

具体来说,它们都会将 -128 到 127 之间的数缓存起来,以便重复使用。这些缓存被称为“缓存池”(Cache),它们分别对应不同的包装类型。

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // 输出 true

Byte c = 100;
Byte d = 100;
System.out.println(c == d); // 输出 true

Short e = 100;
Short f = 100;
System.out.println(e == f); // 输出 true

Long g = 100L;
Long h = 100L;
System.out.println(g == h); // 输出 true

Character i = 'a';
Character j = 'a';
System.out.println(i == j); // 输出 true

Boolean k = true;
Boolean l = true;
System.out.println(k == l); // 输出 true

总结

本文总结了 Java 中,在整数型 List 中删除指定数值的元素。