我在初始化HashSet数组时遇到问题
int N = 100;
HashSet<Integer> []array = new HashSet[N];
for (HashSet<Integer> set:array){
set = new HashSet<Integer>();
}
但是数组只包含null。(当HashSet []数组= ....时也会出错。)
但在运行时:
for(int i = 0; i < N; i++){
array[i] = new HashSet<Integer>();
}
平安无事。
为什么第一个代码不起作用?是我的错吗?
谢谢
发布于 2012-12-11 09:47:07
实际上,您从未将初始化的实例分配给数组的元素。相反,您使用分配给循环中的新对象的变量迭代数组的元素,然后再也不会使用它。在这种情况下,增强的for...each语法是不合适的,请改用传统的for循环。
发布于 2012-12-11 10:28:15
两个'for‘在Java中是不同的,看看java代码&bytecode..示例:
public class T{
public static void main(String[] args){
String[] data = new String[10];
System.out.print("");
for(String str:data){
str="1";
}
System.out.print("");
for(int i=0;i<data.length;i++){
data[i]="1";
}
}
}
$>javac -classpath . T.java
$>javap -c T
Compiled from "T.java"
public class T extends java.lang.Object{
public T();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 10
2: anewarray #2; //class java/lang/String
5: astore_1
6: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
9: ldc #4; //String
11: invokevirtual #5; //Method java/io/PrintStream.print:(Ljava/lang/String;)V
14: aload_1
15: astore_2
16: aload_2
17: arraylength
18: istore_3
19: iconst_0
20: istore 4
22: iload 4
24: iload_3
25: if_icmpge 44
28: aload_2
29: iload 4
31: aaload
32: astore 5
34: ldc #6; //String 1
36: astore 5
38: iinc 4, 1
41: goto 22
44: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
47: ldc #4; //String
49: invokevirtual #5; //Method java/io/PrintStream.print:(Ljava/lang/String;)V
52: iconst_0
53: istore_2
54: iload_2
55: aload_1
56: arraylength
57: if_icmpge 71
60: aload_1
61: iload_2
62: ldc #6; //String 1
64: aastore
65: iinc 2, 1
68: goto 54
71: return
}
第25--44行和第57--71行: aload :从局部变量检索对象引用,并将其推送到操作数堆栈上。aaload :从对象数组中检索对象引用并将其放入堆栈。
存储:获取对象或引用存储到局部变量。aastore :将引用类型值存储到数组。
所以,首先不能存储数组,没有使用初始化数组。
发布于 2012-12-11 09:53:24
enhanced for loop
不使用数组(以及集合)中的实际实例,而是将它们复制到循环控制变量中。
对于非空值,这应该不是问题,因为它们指向相同的对象。如果值为null,则会出现问题,并且将值重新分配给控制变量不会更改实际值。因此,在这种情况下,请始终使用常规for
循环。
对于基元类型的数组也是如此,因为复制它们并更改复制的变量不会影响原始变量。
https://stackoverflow.com/questions/13812350
复制相似问题