有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用迭代器从包含null的列表中删除元素

List<Integer> list = new ArrayList<>();
list.add(12);
list.add(null);
list.add(22);
list.add(32);

System.out.println(list);

Iterator<Integer> iterator = list.iterator();

while(iterator.hasNext()){
        Integer a = iterator.next();
        System.out.print(a+" ");

        if(a.equals(32)){  
        iterator.remove();
        }
    }

O/p

[12, null, 22, 32]
12 null Exception in thread "main" java.lang.NullPointerException
at javed.collection.Collecting.main(Collecting.java:57)

尝试从包含null的列表中删除任何元素都会导致NullPointerException。 但可以很容易地从不包含null的列表中删除元素。 我比较整数和空值是不是做错了

如果我们不能从包含null的列表中删除元素,那么为什么他们允许我们在列表中添加null,这有什么用呢


共 (6) 个答案

  1. # 1 楼答案

    如果对null变量调用任何方法,就会得到一个NullPointerException。这意味着如果anull,并且您尝试调用a.equals(32),它将NPE

    只需输入以下内容,即可对变量进行空检查:

    if (a!=null && a==32) {
        //whatever
    }
    

    另一方面,您不必手动迭代列表以从中删除特定元素。有一种方法可以帮你做到这一点:

    list.remove(Integer.valueOf(32));
    
  2. # 2 楼答案

    此行将从列表中删除所有空值

        list.removeAll(Collections.singleton(null));
    
  3. # 3 楼答案

    你可以这样做:

    if (a != null && a == 32) {
        iterator.remove();
    }
    

    但这并不是一个好习惯,因为a的隐含框/debox

    最快的方法是:

    Iterator<Integer> iterator = list.iterator();
    Integer matcher = 32;
    while(iterator.hasNext()){
        Integer a = iterator.next();
        System.out.print(a+" ");
    
        if(matcher.equals(a)){  
            iterator.remove();
        }
    }
    
  4. # 4 楼答案

    你绝对可以从一个包含空引用的列表中删除-你不能对空引用调用equals。问题在于:

    if(a.equals(32))
    

    如果anull,那么NullPointerException将失败。关于这一点,没有具体的清单。在看不到列表或迭代器的情况下,您可以获得完全相同的行为:

    Integer a = null;
    if (a.equals(32)) // Bang!
        ...
    

    最简单的修复方法是检查空值:

    if (a != null && a == 32)
    

    (现在的比较是使用拆箱,而不是在每次迭代中装箱32次——这仍然很便宜,但在我看来不那么可读。)

    或者以一个装箱的Integer值开头:

    Integer valueToRemove = 32;
    while(iterator.hasNext()){
        Integer a = iterator.next();
        System.out.print(a+" ");
    
        if(valueToRemove.equals(a)) {
            iterator.remove();
        }
    }
    
  5. # 5 楼答案

    您应该添加一个空检查:

    if(a != null && a.equals(32)) {
        iterator.remove();
    }
    

    您还可以使用^{}为您执行空检查:

    if(Objects.equals(a, 32)) {
    
  6. # 6 楼答案

    将条件语句更改为:

    if(a.equals(32)){  
       iterator.remove();
    }
    

    致:

    Integer toCheck = 32;
    if(toCheck.equals(a)){  
        iterator.remove();
    }
    

    避免可能的空引用