javaの配列の長さは固定されています。 Javaがサイズ0の配列を許可するのはなぜですか?Javaがサイズ0の配列を許可するのはなぜですか?
String[] strings = new String[0];
javaの配列の長さは固定されています。 Javaがサイズ0の配列を許可するのはなぜですか?Javaがサイズ0の配列を許可するのはなぜですか?
String[] strings = new String[0];
これは空であることを示します。私。アイテムがあるかのようにループして結果が得られません。
for(int k = 0; k < strings.length; k++){
// something
}
これにより、確認する必要がなくなります。問題の配列がnull
の場合、例外が発生しますが、この場合は何も行われません。
関数 'test()'があるときに 'test(Object ... objects)'関数を呼び出すのにも便利です – Frithjof
@Frithjof:facepalm: –
時にはそれがヌルゼロよりサイズの配列を返すためにはるかに友好的です。
これは "Null Object"パターンと呼ばれます。 –
C++と同じように、データがないときはよりきれいな処理が可能です。
public String[] getStrings() {
if(foo) {
return null;
} else {
return new String[] {"bar, "baz"};
}
}
String[] strings = getStrings();
if (strings != null) {
for (String s : strings) {
blah(s);
}
}
さて、これと比較:
public String[] getStrings() {
if(foo) {
return new String[0];
} else {
return new String[] {"bar, "baz"};
}
}
// the if block is not necessary anymore
String[] strings = getStrings();
for (String s : strings) {
blah(s);
}
これ(というnull値よりも空の配列を返す)、実際には
は、この(正午の答えの詳細な説明)考えてみましょうJava API設計の世界でのベストプラクティスです。
さらに、Javaでは、リスト(ArrayListなど)を配列に変換することができます。空のリストを空の配列に変換するだけです。
Javaがサイズ1の配列を許可するのはなぜですか?単一の値を配列にラップするのは無駄でしょうか? Javaが2以上のサイズの配列しか許さないのであれば十分ではないでしょうか?
はい、サイズが1の行列の代わりに空の配列と単一のオブジェクトまたはプリミティブの代わりにnull
を渡すことができます。
しかし、このような制限に対していくつかの良い議論があります。私の個人的なトップ引数:
制限が[1..INTEGER.MAX_INT]我々は
追加boudaryチェックの多くを追加する必要があると思います
はサイズに配列を制限するために本当に必要あまりにも複雑ではありませんが、
(Konradsのコメントに同意します)変換ロジックとメソッドは、私たちのコードにオーバーロードします。許可された配列サイズから0(およびおそらく1)を除外してもコストが節約されるわけではありません。追加の労力が必要となり、パフォーマンスに悪影響を及ぼします。
アレイモデルベクトル
配列は、ベクターのための優れたデータモデルである(数学、ないVector
クラス!)。そしてもちろん、数学のベクトルはゼロ次元かもしれません。概念的には存在しないこととは異なる。
追記 - (char-)アレイのための顕著なラッパーはString
クラスです。不変のString
は、空の配列のコンセプトを実現します。空のString(""
)です。
私はあなたの制限引数を信じません。 Java(例えばCとは異なり)は既に負の数をチェックする必要があります。このチェックは、0に対応するように(単純に '> = 0'を'> 0'に)変更することができます。しかし、あなたはもちろん、残りの部分については正しいので、この制限を加えることは意味がありません。 –
ループの反復引数は私の意見では良く見えます: "(int k = 0; k
いいえ、私の意見ではありません。空の文字列(char配列に基づく)は存在しないため、ループ内の空の配列を考慮する必要はありません。この反復引数は非常に実用的な副作用です。その世界では、配列には最低限1つのエントリしかありません。 (または2つの理由:なぜ1つのアイテムに対して配列が必要なのでしょうか?) –
空の配列が非常に便利なところは、nullが許可されていない状況でnullの代わりに使用することです。その1つの可能性のある例は、配列のBlockingQueueです。読書側への入力の終わりを伝えたいとき、あなたは何をしますか? nullを送信するのは明らかな選択肢のようですが、BlockingQueueはnullを受け付けません。フィールドの "boolean last;
"種類のクラス内に配列をラップすることができますが、それは過労です。空の(ゼロサイズの)配列を送信するのが最も合理的な選択肢のようです。
ゼロ長の配列が有用であり得る他の場合:長さ0の配列は、アレイのタイプを渡すために使用することができる
<T> T[ ] toArray(T[ ] a)
: 、リスト内のすべての要素を含む配列を返すことこのメソッドに追加します。例:
ClassA[ ] result = list.toArray(new ClassA[0]);
ゼロ長さの配列は、ゼロ要素を保持するObjectのインスタンスです。
のみ注:「..、あなたは動的配列のサイズを増やすことができますC、とは異なり、」しかし、Cには、あなたは、配列の次元、C++のための同じを変更することはできません。
あなたは言います。
長さゼロの配列が有用な別の場合は、2次元配列をコピーする場合です。私は書くことができる:アレイ内の各配列参照は長さゼロの配列にreferncesが最も効率的であるようにそれらを初期化し、上書きされていることである
public int[][] copyArray(int[][] array){
int[][] newArray = new int[array.length][0];
for(int i=0;i<array.length;i++){
newArray[i] = array[i];
}
return newArray;
を。
代替手段は何ですか? –