8

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

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

4

6 回答 6

6

这个更好。

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

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

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

一旦内存分配给数组中的那个元素,你至少可以做它null

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

不,它在自我声明时是固定的。减速后你不能改变长度。

阵列很久以前就死了。您最好的选择List

  • Positional access— 根据元素在列表中的数字位置操作元素。这包括 get、set、add、addAll 和 remove 等方法。
  • Search— 在列表中搜索指定对象并返回其数字位置。搜索方法包括 indexOf 和 lastIndexOf。
  • Iteration— 扩展迭代器语义以利用列表的顺序特性。listIterator 方法提供了这种行为。
  • Range-view— sublist 方法对列表执行任意范围操作。
于 2013-10-29T06:33:44.207 回答
5

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

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

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

或者

list.removeAll(Arrays.asList(new Object[]{null})); 
于 2013-10-29T06:42:52.267 回答
1

有几种选择:

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

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

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

于 2013-10-29T06:36:21.357 回答
0

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

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

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

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

于 2013-10-29T06:34:14.057 回答
0

您可以使用ArrayList而不是array. 它提供了您尝试使用数组实现的方法addremove所以更好的方法是使用 ArrayList。

于 2013-10-29T06:34:18.350 回答
0

增强的 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

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

像这样使用它,

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

在这里看看增强的 for 循环是如何实现的

于 2013-10-29T06:36:11.687 回答