java arrays用法 - 奇怪的數組返回類型




array宣告 add (6)

有沒有人看到這樣的方法簽名之後放置的數組[]

public static String mySplit(String s)[] {
    return s.split(",");
}

public static void main(String... args) {
    String[] words = mySplit("a,b,c,d,e");
    System.out.println(Arrays.toString(words));
}

版畫

[a, b, c, d, e]

在過去,奇怪的符號一直是“C”兼容性,但我不會想像有人用C寫這個。

有誰知道為什麼這甚至被允許?

我正在使用Java 7更新10,以防萬一。

這在Java 6中也是如此http://ideone.com/91rZV1

順便說一句,這不會編譯,我也不會期望它

public static <T> List mySplit(String s)<T> {
    return Collections.emptyList();
}

Answers

是的,這是允許的,

同樣的原因:

String[] myArray;

相當於

String myArray[];

好問題; 當我實現一個Java解析器時,我記得在這一點上被JLS語法困惑了。

為了擴大John的答案,以下是發生了什麼事情:

有(至少)5個地方,這很重要:

  • 方法類型簽名
  • 局部變量聲明
  • 現場聲明
  • 形式參數
  • for -loops

以下是語法摘錄,重點介紹方法聲明:

MethodOrFieldDecl:
    Type Identifier MethodOrFieldRest

MethodOrFieldRest:  
    FieldDeclaratorsRest ;
    MethodDeclaratorRest

MethodDeclaratorRest:
    FormalParameters {[]} [throws QualifiedIdentifierList] (Block | ;)

Type:
    BasicType {[]}
    ReferenceType  {[]}

(警告:閱讀語法很困難,因為正方形和大括號有時是文字,有時是元字符。)

這表明[]可以出現在Type規則下,也可以作為MethodDeclaratorRest規則的一部分出現。 在兩個地方都是可選的。


我相信它只是告訴Java返回類型是一個Strings數組,就像聲明一樣

static String[] mySplit(String s) {...

類似於聲明變量:

String myStringArray[];

相當於

String[] myStringArray;

就像是

  String[] a; 

是相同的

  String a[];

方法返回類型的語法同樣適用

  public static String mySplit(String s)[] {

是相同的

  public static String[] mySplit(String s) {

但我認為我從來沒有見過你在高效代碼中提到的版本。


我認為它的原因相同,下面的變量聲明都是等價的

String[] array
String array[]

這是C開發人員所做的事情,因此它被包括在內以幫助他們。


這是 保持相同數組 (“可變”) 的最快工作實現

Array.prototype.clear = function() {
  while (this.length) {
    this.pop();
  }
};

FYI Map定義了clear()所以對於Array也有clear()似乎是合乎邏輯的。

或者作為Underscore.js mixin

_.mixin({
  clearArray: function(array) {
    while (array.length) {
      array.pop();
    }
  }
});

或者一個簡單的功能:

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}

TypeScript版本:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

FYI它不能簡化為while (array.pop()) :測試將失敗。

以及隨之而來的測試:

describe('Array', () => {
  it('should clear the array', () => {
    let array = [1, 2, 3, 4, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);

    // Even with undefined or null inside
    array = [1, undefined, 3, null, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

這裡更新的jsPerf: http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152 //jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152





java arrays syntax declaration