Java中初始化的哈希集数组
初始化哈希集数组时遇到问题Java中初始化的哈希集数组,java,collections,initialization,Java,Collections,Initialization,初始化哈希集数组时遇到问题 int N = 100; HashSet<Integer> []array = new HashSet[N]; for (HashSet<Integer> set:array){ set = new HashSet<Integer>(); } int N=100; HashSet[]数组=新的HashSet[N]; for(哈希集:数组){ set=新的HashSet(); } 但是数组只包含null。
int N = 100;
HashSet<Integer> []array = new HashSet[N];
for (HashSet<Integer> set:array){
set = new HashSet<Integer>();
}
int N=100;
HashSet[]数组=新的HashSet[N];
for(哈希集:数组){
set=新的HashSet();
}
但是数组只包含null。(当HashSet[]数组=…]时也会出错)
但在运行时:
for(int i = 0; i < N; i++){
array[i] = new HashSet<Integer>();
}
for(int i=0;i
一切都很好
为什么第一个代码不起作用?是我的错吗
谢谢您从未实际将初始化实例分配给数组的元素。相反,您使用分配给循环中新对象的变量在数组元素上迭代,这样就永远不会使用。在这种情况下,增强的for…each语法不合适,请改用传统的for循环。您从未实际将初始化实例分配给数组元素。相反,您使用分配给循环中新对象的变量在数组元素上迭代,这样就永远不会使用。在这种情况下,增强型for…每个语法都不合适,请使用传统的for循环。增强型for循环不使用数组(以及集合)中的实际实例,而是将它们复制到循环控制变量中 对于非空值,这应该不是问题,因为它们指向同一个对象。出现的问题是,如果值为空,并且将值重新分配给控制变量,则不会更改实际值。因此,在这种情况下,始终对循环使用常规的
原语类型的数组也是如此,因为对它们进行处理和更改复制的变量不会影响原始变量。增强的for loop
不使用数组(以及集合)中的实际实例,而是将它们复制到循环控制变量中
对于非空值,这应该不是问题,因为它们指向同一个对象。出现的问题是,如果值为空,并且将值重新分配给控制变量,则不会更改实际值。因此,在这种情况下,始终对循环使用常规的
原语类型的数组也是如此,因为对它们进行处理并更改复制的变量不会影响原始变量。两个“for”在Java中是不同的,请查看Java代码和字节码。。
例如:
公共类T{
公共静态void main(字符串[]args){
字符串[]数据=新字符串[10];
系统输出打印(“”);
for(字符串str:data){
str=“1”;
}
系统输出打印(“”);
for(int i=0;ijavac-classpath.T.java)
$>javap-ct
从“T.java”编译而来
公共类T扩展了java.lang.Object{
公共T();
代码:
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:bipush 10
2:anewarray#2;//类java/lang/String
5:astore_1
6:getstatic#3;//字段java/lang/System.out:Ljava/io/PrintStream;
9:ldc#4;//字符串
11:invokevirtual#5;//方法java/io/PrintStream.print:(Ljava/lang/String;)V
14:aload_1
15:astore_2
16:aload_2
17:排列长度
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;//字符串1
36:astore 5
38:iinc 4,1
41:goto 22
44:getstatic#3;//字段java/lang/System.out:Ljava/io/PrintStream;
47:ldc#4;//字符串
49:invokevirtual#5;//方法java/io/PrintStream.print:(Ljava/lang/String;)V
52:iconst_0
53:istore_2
54:iload_2
55:aload_1
56:排列长度
57:if_icmpge 71
60:aload_1
61:iload_2
62:ldc#6;//字符串1
64:aastore
65:iinc 2,1
68:goto 54
71:返回
}
从第25-44行和第57-71行:
aload:从局部变量检索对象引用并将其推送到操作数堆栈上。
aaload:从对象数组中检索对象引用并将其放置在堆栈上
astore:将对象或引用存储到局部变量。
aastore:将引用类型值存储到数组
因此,首先不能存储数组,没有使用初始化数组。两个“for”在Java中不同,请查看Java代码和字节码。。
例如:
公共类T{
公共静态void main(字符串[]args){
字符串[]数据=新字符串[10];
系统输出打印(“”);
for(字符串str:data){
str=“1”;
}
系统输出打印(“”);
for(int i=0;ijavac-classpath.T.java)
$>javap-ct
从“T.java”编译而来
公共类T扩展了java.lang.Object{
公共T();
代码:
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:bipush 10
2:anewarray#2;//类java/lang/String
5:astore_1
6:getstatic#3;//字段java/lang/System.out:Ljava/io/PrintStream;
9:ldc#4;//字符串
11:invokevirtual#5;//方法java/io/PrintStream.print:(Ljava/lang/String;)V
14:aload_1
15:astore_2
16:aload_2
17:排列长度
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;//字符串1
36:astore 5
38:iinc 4,1
41:goto 22
44:getstatic#3;//字段java/lang/System.out:Ljava/io/PrintStream;
47:ldc#4;//字符串
49:invokevirtual#5;//方法java/io/PrintStream.print:(Ljava/lang/String;)V
52:iconst_0
53:istore_2
54:iload_2
55:aload_1
56:排列长度
57:if_icmpge 71
60:aload_1
61:
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
}