【问题标题】:Need explanation on this Java syntax需要对此 Java 语法的解释
【发布时间】:2012-04-06 22:58:33
【问题描述】:

有人能解释一下下面是做什么的吗?

private HashSet nodes[]; 
nodes = new HashSet[21];

我有点困惑……两者之间的区别

private HashSet nodes = new HashSet;

和以上,特别是在方括号语法方面。这是一个 HashSet 数组吗?因为平时我看惯了

int[] myarray = new int[21];

或者类似的东西。

【问题讨论】:

  • 在 Java 中,您可以声明像 Type foo[] 这样的数组,但更常见的是声明为 Type[] foo 的数组。

标签: java arrays syntax


【解决方案1】:

它们只是替代品 - 不幸的是,它们都是有效的。

哎呀,即使这样也是有效的:

int[] bad [] = null;

相当于

int[][] bad = null;

显然不要这样做:)

来自section 10.2 of the JLS

[] 可以作为类型的一部分出现在声明的开头,或者作为特定变量的声明符的一部分,或者两者兼而有之。

我们不建议在数组变量声明中使用“混合表示法”,因为括号同时出现在类型和声明符中。

基本上,使用将所有类型信息保存在一个位置的表单 - 您习惯使用的表单。这是绝大多数惯用的形式。

【讨论】:

  • 如果你有很长的变量列表,这没什么不好。
  • @trutheality:你什么意思?我认为这两种形式都没有任何好处,这使得像“坏”这样的令人困惑的声明有效。我并不是说数组本身是不幸的——我是说有两种不同的声明方式是不幸的。
  • 您似乎更喜欢int[] array; 表示法。我只是指出能够编写int number1, number2, array1[], array2[], matrix[][]; 形式的声明非常方便。当然,便利性是微不足道的,但它就在那里。尤其是如果你认为允许这两种形式的唯一负面结果是有人可以编写令人困惑的代码,这并不是什么坏事——有人总能找到一种方法来编写令人困惑的代码。
  • @trutheality:哎呀,我绝对会避免这种情况。就个人而言,无论如何,我几乎总是每个声明都有一个变量——这样评论更容易。我认为编写混乱代码的能力是一个很大的缺点。当然,编写令人困惑的代码总是可能,但是一种语言应该尽可能地防止这种情况发生。我想你也不介意写someOtherThread.sleep(1000);
  • 好吧,请记住,当我在这样的列表中声明三个以上的变量时,我会在逗号处缩进和换行,这样您仍然可以轻松地发表评论。我试图使代码既可读又最小化——代码太冗长了。 someOtherThread.sleep(1000);我不喜欢。无法提出当场调用someObject.staticMethod(); 很有用的情况,但我认为允许这样做是有充分理由的。我确实认为在很多情况下使用类似strictly static 修饰符会是一个非常好的主意。
【解决方案2】:
private HashSet nodes = new HashSet;

不是有效的 Java。与 JavaScript 不同,Java 中的 new 运算符始终需要带括号的参数列表。

private HashSet nodes = new HashSet(21);

不同于

private HashSet[] nodes = new HashSet[21];

因为前者构造了一个 HashSet 集合,该集合最初有足够的空间容纳 21 个集合项,而后者是一个 21 空值数组,可以填充对集合的引用。


private HashSet nodes[]; 

声明一个成员变量,它可以引用任何元素类型为HashSet的数组。

nodes = new HashSet[21];

创建一个包含 21 个 HashSet 引用空间的数组并将其分配给该成员变量。

请记住,在 Java 中,与 C 不同,HashSet[21] 不是一种类型,因此您不能通过以下方式在 Java 中为数组分配空间

int[21] myints;

在某些时候你必须通过

创建一个数组
  • new <type>[size],
  • 缩写语法new <type> { element0, element1, element2, ... },
  • 或通过java.lang.reflect.Array.newInstance进行反思。

【讨论】:

    【解决方案3】:

    是的,它是一个HashSets 的数组。

    HashSet nodes[];
    

    一样
    HashSet[] nodes;
    

    只有在使用逗号一次声明一堆变量时,方括号的位置差异才会变得重要:

    HashSet[] alpha, bravo, charlie; // Three arrays of hashsets
    HashSet delta[], echo, foxtrot; // One array (delta) and two hashsets (echo and foxtrot)
    

    【讨论】:

    • 那么就相当于说private HashSet[]节点?
    • 是的。在 Java 中,括号可以出现在任一位置。
    • @varatis,Java 引入了Type[] 语法,以便您可以将整个类型放在一个地方,但也允许 C 样式语法使 C/C++ 程序员更容易学习 Java。
    【解决方案4】:

    在 Java 中,声明

    private HashSet nodes[];
    

    等价于声明

    private HashSet[] nodes;
    

    可以读作“一个 HashSet 数组”或“一个 HashSet 数组”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      相关资源
      最近更新 更多