0

我在初始化 HashSet 数组时遇到问题

  int N = 100;
  HashSet<Integer> []array = new HashSet[N]; 
  for (HashSet<Integer> set:array){
    set = new HashSet<Integer>();
  }

但该数组仅包含空值。(当 HashSet []array = .... 时也会出错)

但是当运行时:

   for(int i = 0; i < N; i++){
      array[i] = new HashSet<Integer>();
   }

一切都很好。

为什么第一个代码不起作用?是我的错吗?

谢谢

4

4 回答 4

3

您实际上从未将初始化实例分配给数组的元素。相反,您使用一个变量迭代数组的元素,该变量被分配给循环中的新对象,然后永远不会使用。在这种情况下,增强的 for...each 语法不合适,请改用传统的 for 循环。

于 2012-12-11T01:47:06.507 回答
1

Java 中的两个 'for' 是不同的,请查看 Java 代码和字节码 .. 示例:

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 :从对象数组中检索对象引用并将其放在堆栈上。

astore :将对象或引用存储到局部变量。aastore :将引用类型值存储到数组。

所以,首先不能存储数组,没有使用初始化数组。

于 2012-12-11T02:28:15.110 回答
0

An enhanced for loop, 不使用数组(以及集合)中的实际实例,而是将它们复制到循环控制变量中。

这不应该是非空值的问题,因为它们指向同一个对象。问题出现了,如果值为空,并且将值重新分配给控制变量,不会改变实际值。因此,在这种情况下,请始终使用常规for循环。

对于原始类型的数组也是如此,因为处理它们并更改复制的变量不会影响原始变量。

于 2012-12-11T01:53:23.737 回答
0

只需使用 new Set[n] 而不是 new HashSet[n] 即可使其正常工作

Set<Integer>[] list = new Set[n];
for(int i=0;i<n;i++)
  list[i] = new HashSet<>();
于 2021-11-22T22:51:51.330 回答