首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中初始化的HashSet数组

Java中初始化的HashSet数组
EN

Stack Overflow用户
提问于 2012-12-11 09:44:58
回答 4查看 3.7K关注 0票数 0

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

代码语言:javascript
运行
复制
  int N = 100;
  HashSet<Integer> []array = new HashSet[N]; 
  for (HashSet<Integer> set:array){
    set = new HashSet<Integer>();
  }

但是数组只包含null。(当HashSet []数组= ....时也会出错。)

但在运行时:

代码语言:javascript
运行
复制
   for(int i = 0; i < N; i++){
      array[i] = new HashSet<Integer>();
   }

平安无事。

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

谢谢

EN

回答 4

Stack Overflow用户

发布于 2012-12-11 09:47:07

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

票数 3
EN

Stack Overflow用户

发布于 2012-12-11 10:28:15

两个'for‘在Java中是不同的,看看java代码&bytecode..示例:

代码语言:javascript
运行
复制
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 :将引用类型值存储到数组。

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

票数 1
EN

Stack Overflow用户

发布于 2012-12-11 09:53:24

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13812350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档