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

时间:2013-10-29 06:30:39

标签: java arrays for-loop null

好吧,我有一个原始的对象数组,因为我无法从数组中删除它们,所以我改为将数组中对象的位置更改为null。但是,如果我想以下列方式迭代数组中的每个对象:

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

我必须做这样的事吗?

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

或者我的第一种方式会好吗? for循环'知道'它只需要迭代Derp对象,而不是空对象,因为我已经将它声明为Derp对象吗?或者它可能只是将它视为Derp对象,因为我已经说过它会在尝试迭代非Derp对象时导致错误?或者null仍然是一个Derp对象,只有一个为null?它是什么,我可以使用什么代码?

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

6 个答案:

答案 0 :(得分:6)

这样更好。

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

第一个抛出nullpointer exception.if任何值都是null

  

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

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

  

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

没有。在声明自己时它被修复。减速后你无法改变长度。

Arrays很久以前就死了。你最好的选择是List,这有利于

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

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:1)

有几种选择:

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

  2. 如果索引的快速访问不重要,您可以使用LinkedList。以便宜的方式从链接列表中删除元素。

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

答案 3 :(得分:0)

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

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

  

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如何增强循环功能

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