在Java中使用for循环,是否必须指定NOTNULL?

在Java中使用for循环,是否必须指定NOTNULL?,java,arrays,for-loop,null,Java,Arrays,For Loop,Null,我有一个基本的对象数组,因为我不能从数组中删除它们,所以我将对象在数组中的位置改为null。但是,如果我想通过以下方式迭代数组中的每个对象: for (Derp derp : derps){ derp.herp++; } 我必须这样做吗 for (Derp derp : derps){ if (derp != null){ derp.herp++; } } 还是我第一次做就好了?for循环“知道”它只需要迭代Derp对象,而不必迭代null对象,因为我

我有一个基本的对象数组,因为我不能从数组中删除它们,所以我将对象在数组中的位置改为null。但是,如果我想通过以下方式迭代数组中的每个对象:

for (Derp derp : derps){
     derp.herp++;
}
我必须这样做吗

for (Derp derp : derps){
     if (derp != null){
     derp.herp++;
     }
}
还是我第一次做就好了?for循环“知道”它只需要迭代Derp对象,而不必迭代null对象,因为我已经将它声明为Derp对象了吗?或者它只是将其视为一个Derp对象,因为我说过它将是,当它尝试迭代非Derp对象时会导致错误?还是null仍然是一个Derp对象,只是一个null对象?它是什么,我可以使用什么代码

或者,如何从基元数组中删除对象而不保留空对象并实际缩短基元数组的长度?

这样更好

for (Derp derp : derps){
     if (derp != null){
     derp.herp++;
     }
}
第一个抛出null指针异常。如果任何值为
null

如何从基元数组中删除对象而不保留空对象

一旦将内存分配给数组中的该元素,您至少可以将其设置为
null

实际上缩短了基元数组的长度

不。它在声明自身时是固定的。减速后不能更改长度

我很久以前就死了。你最好的选择是哪一个有

  • 位置访问
    -根据元素的数值操作元素 在列表中的位置。这包括get、set、add、, 添加所有,然后删除
  • Search
    -在列表中搜索指定对象并返回其 数字位置。搜索方法包括indexOf和lastIndexOf
  • 迭代
    -扩展迭代器语义以利用 列表的顺序性质。listIterator方法提供了这一点 行为
  • 范围视图
    -子列表方法执行任意范围操作 在名单上

使用第二种方法更好,因为如果数组中存在
null
值,您将得到
NullPointerException
。问题是,当遇到
null
时,
derp
对象将具有
null
引用,因为它是一个对象

for (Derp derp : derps){
     if (derp != null){
         derp.herp++;
     }
}

如何从基元数组中删除对象而不保留空值 对象并实际缩短基元数组的长度


它根本不是一个基本数组。它是一个
Derp
数组。默认情况下,数组中的所有索引都将具有
null
引用,除非手动初始化每个索引。因此,一旦分配了阵列内存,就无法减小大小,因为阵列本质上是静态的。如果希望动态增长/收缩,则需要使用
ArrayList

可以使用
ArrayList
而不是
array
。它提供了一些方法,如
add
remove
,您正试图使用数组来实现这些方法。所以更好的方法是使用ArrayList。

增强for循环的工作原理 皈依

for(Iterator<Derp> i = derps.iterator(); i.hasNext(); ) {
  Derp element = i.next();

}

有几种选择:

  • 您可以像在第二个示例中那样显式检查null

  • 如果按索引快速访问不重要,可以使用
    链接列表
    。以廉价方式从链接列表中删除元素

  • 如果元素的顺序不重要,请使用
    集合


  • Null是一个有效的列表项,因此您需要检查它

    不能简单地从基元数组中删除元素。您可以使用更高级的结构,如ArrayList,其中可以删除元素。以下两个示例是从列表中删除所有空值的一行程序

    list.removeAll(Collections.singleton(null));
    


    它将迭代数组中的每个元素,不管它是否为null,因此需要进行null检查。顺便说一句,这很容易测试。当然,不管是null还是not@user2901402使用
    ArrayList
    而不是
    Array
    来消除
    NullPointerException
    的可能性,否则在迭代数组时必须检查notnull。第二个选项适用于数组。请看我的答案,一行代码可以从列表中删除空值
    if(derps != null){
      for (Derp derp : derps){
        if(derp != null)
          derp.herp++;
      }
    }
    
    list.removeAll(Collections.singleton(null));
    
    list.removeAll(Arrays.asList(new Object[]{null}));