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

}