【问题标题】:Using a for loop in Java, do I have to specify not null?在Java中使用for循环,我必须指定不为空吗?
【发布时间】:2013-11-08 04:42:17
【问题描述】:

好吧,我有一个原始的对象数组,因为我无法从数组中删除它们,所以我将对象在数组中的位置更改为 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 的对象?它是什么,我可以使用什么代码?

另外,我怎样才能从原始数组中删除一个对象而不留下一个空对象并实际缩短原始数组的长度?

【问题讨论】:

  • 它将遍历数组中的每个元素,无论它是否为空,因此您需要进行空检查。顺便说一句,这很容易测试。
  • 肯定会遍历所有内容,无论是否为空
  • @user2901402 使用ArrayList 而不是Array 来消除NullPointerException 的可能性,否则在迭代数组时必须检查不为空。您的第二个选项适用于 Array。

标签: java arrays for-loop null


【解决方案1】:

增强 for 循环的工作原理

for (Derp derp : derps){
  derp.herp++;
}

转换为

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

}

你需要有null check on collection,如果你在收集any operation on the elements而不是should have null check on the elements too

由于 Iterator 正在检查元素是否存在,所以如果 null check 不存在,您将得到 NULL POINTER EXCEPTION

这样使用,

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

Take a look here on how the enhanced for loop is implemented

【讨论】:

    【解决方案2】:

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

    您不能简单地从原始数组中删除元素。您可以使用更高级的结构,例如可以删除元素的 ArrayList。以下两个示例是从 List 中删除所有 NULL 值的单行代码。

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

    list.removeAll(Arrays.asList(new Object[]{null})); 
    

    【讨论】:

      【解决方案3】:

      这样更好。

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

      第一个抛出空指针异常。如果任何值为null

      如何从原始数组中删除对象而不留下空对象。

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

      实际上是缩短原始数组的长度吗?

      没有。自我声明时固定。减速后不能改变长度。

      数组早就死了。您最好的选择是List,它的好处是

      • Positional access — 根据元素的数值操作元素 在列表中的位置。这包括诸如 get、set、add、 addAll,然后删除。
      • Search — 在列表中搜索指定对象并返回其 数值位置。搜索方法包括 indexOf 和 lastIndexOf。
      • Iteration — 扩展迭代器语义以利用 列表的顺序性。 listIterator 方法提供了这个 行为。
      • Range-view — sublist 方法执行任意范围操作 在名单上。

      【讨论】:

      • 看看我的回答,单线从列表中删除空值
      【解决方案4】:

      有几种选择:

      1. 您可以像在第二个示例中那样显式检查空值。

      2. 如果按索引快速访问不重要,您可以使用LinkedList。廉价地从链表中删除一个元素。

      3. 如果元素的顺序不重要,请使用Set

      【讨论】:

        【解决方案5】:

        您可以使用ArrayList 代替array。它提供了您尝试使用数组实现的 addremove 等方法。所以更好的方法是用户 ArrayList。

        【讨论】:

          【解决方案6】:

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

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

          如何从原始数组中删除对象而不留下 null 对象并实际缩短原始数组的长度?

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-09-20
            • 1970-01-01
            • 2014-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多