ArrayList
ほぼすべてのシナリオで使いやすく、非常に用途が広いように思えます。String[]
入力されたデータを保存するためにaが使用される場合はありますか?そのような場合、に欠点がArrayList
あるはずですが、それは何でしょうか?
頭の中で頭に浮かぶのは、、などのさまざまな方法String
だけです。substring()
split()
編集:StackOverflowの新機能もあります。再投稿であったことをお詫び申し上げます。そして、フォーマットに感謝します。
簡単な答えは、配列を使用せず、常に配列リストを使用することです。これに対する唯一の例外は、使用するメモリの量を絶対に制御する必要がある場合、またはString[]
サポートできる特定のパフォーマンス制約がある場合です。
ただし、一般に、配列はオブジェクト指向言語での操作がひどく、ほとんどの場合同じ理由で、カプセル化を簡単に破ることができます。例えば:
public class ExampleArray {
private final String[] strings;
public ExampleArray(String... strings) { this.strings = strings; }
public String[] getStrings() { return strings; }
}
問題がありますか?ええ、あなたはgetStrings()
このように書く必要があります:
// ...
public String[] getStrings() { return Arrays.copy(strings); }
// ...
そうしないと、一部の呼び出し元がクラスの内部データを取得して変更を開始する可能性があります。これを防ぐ唯一の方法は、発信者が見たいと思うたびにそれをコピーすることです。正しい方法とは対照的に:
public class ExampleList {
private final List<String> strings;
// ...
public List<String> getStrings() { return Collections.unmodifiableList(strings); }
}
これで、データをコピーするのではなく、変更を許可しないAPIの背後にデータを貼り付けるだけです。Immutable*
Guavaクラスを使用する場合は、さらに優れています。
もちろん、String[]
代わりに使用したい状況もあります。たとえば、リストの長さが事前にわかっていて、リストが大きくなる可能性がある場合。
使用の主な欠点はArrayList
、リストが大きくなるにつれて配列を再割り当てする必要があることです。これは自由な操作ではありません。を受け入れるコンストラクターをinitialCapacity
使用して、期待するサイズ(またはそれ以上)になるように事前に割り当てることで、これを軽減できます。
ArrayListは動的に拡張可能なサイズの配列ですが、文字列配列または任意のタイプの配列のサイズは静的です。
明らかに、この動的な拡張機能にはいくらかのコストがかかります。新しいサイズで配列を再割り当てし、要素をコピーします。
次のように、コンパイル時にJava配列を初期化できます。
String data [] = {"a"、 "b"、 "c"};
古いバージョンのJavaには、型安全性のケースもありました。ArrayList要素は元の型にキャストする必要がありましたが、Java配列は型が安全です。
Java配列は言語の一部であり、変更することはできません。ArrayListはJavaAPIの一部です。必要な場合(ただし、お勧めしません)、独自のライブラリに置き換えてArrayListジョブを実装できます。
配列を使用していくつかの値を保持するときに頭に浮かぶ唯一のケースは、次のような可変数の引数を取るメソッドがある場合です。
void doSth(int i, String... strings){
if(strings.length>0){
//some stuff
}
そうでなければ、配列を使用する必要があるときに、意図的に状況を作成することはほとんどありません。
stackoverflowで他の人が尋ねたこれらの質問をチェックしてください: