1

Java では、常に配列を使用してオブジェクト参照を格納できます。次に、オブジェクトを格納するために自動的に拡張可能な ArrayList または HashTable があります。しかし、自動拡張可能なオブジェクト参照の配列を持つネイティブな方法を知っている人はいますか?

編集: 私が言いたいのは、Java API に、オブジェクトへの参照を格納する機能 (ただし、XXXList や HashTable のような実際のオブジェクトを格納しない) と自動拡張機能を備えたクラスがあるかどうかを知りたいということです。

4

8 に答える 8

5

Java 配列は、定義上、固定サイズです。自動拡張が必要な​​場合は、XXXList クラスを使用します。

編集 - 質問が少し明確になりました

私が Java を学び始めたとき (C および C++ のバックグラウンドを持っていた)、おそらくこれが最初につまずいた原因の 1 つです。うまくいけば、私はいくつかの光を当てることができます.

C++ とは異なり、Java のオブジェクト配列はオブジェクトを格納しませ。オブジェクト参照を格納します。

C++ で、次のようなものを宣言したとします。

String myStrings[10];

10 個の String オブジェクトを取得します。この時点で、println(myStrings[5].length); のようなことを行うことは完全に合法です。- '0' を取得します - String の既定のコンストラクターは、長さ 0 の空の文字列を作成します。

Java では、新しい配列を作成すると、10 個の String 参照を保持できる空のコンテナーが取得されます。だから呼び出し:

String[] myStrings = new String[10];
println(myStringsp[5].length);

実際には String 参照を配列にまだ配置していないため、null ポインター例外がスローされます。

C++ のバックグラウンドを持っている場合は、new String[10] を C++ の new (String *)[10] と同等と考えてください。

したがって、それを念頭に置いて、ArrayListがオブジェクトの自動拡張配列のソリューションである理由はかなり明確なはずです(実際、ArrayList は単純な配列を使用して実装され、必要に応じて新しい拡張配列を割り当て、拡張アルゴリズムが組み込まれています)。コンテンツを古いものから新しいものにコピーします)。

実際には、配列を使用する状況は比較的少数です。コンテナ (ArrayList や BTree に似たもの) を作成している場合、または低レベルのバイト操作を大量に行っている場合に便利ですが、ほとんどの開発が発生するレベルでは Collections クラスの 1 つを使用します。が圧倒的に好ましい技術です。

于 2008-10-28T02:49:43.773 に答える
4

Collection を実装するすべてのクラスは展開可能で、参照のみを保存します。オブジェクトを保存せず、データ空間に作成し、それらへの参照のみを操作して、参照なしでスコープから外れるまで続けます。

オブジェクトへの参照を 2 つ以上のコレクションに入れることができます。それが、ソートされたハッシュテーブルなどを持つ方法です...

于 2008-10-28T07:19:44.243 に答える
1

「ネイティブ」とはどういう意味ですか? オブジェクトの展開可能なリストが必要な場合は、ArrayList を使用できます。List コレクションには、配列と同様の機能を提供するインデックスによってリスト内のオブジェクトにアクセスできる get(index) メソッドがあります。内部的には、ArrayList は配列で実装され、ArrayList は自動的に展開を処理します。

于 2008-10-28T02:54:16.090 に答える
1

Sun Web ページのArray Java Tutorialsから直接:

-> 配列は、1 つの型の固定数の値を保持するコンテナー オブジェクトです。

配列のサイズは作成時に宣言されるため、後で展開する方法は実際にはありません。特定のサイズの配列を宣言する全体的な目的は、プログラムの実行時に使用される可能性が高いだけのメモリを割り当てることです。あなたができることは、元のサイズに基づく関数である2番目の配列を宣言し、元の要素をすべてコピーしてから、必要な新しい要素を追加することです(ただし、これはあまり「自動」ではありません:)) . それ以外の場合は、あなたと他の数人が述べたように、List Collections が最も効率的な方法です。

于 2008-10-28T03:08:55.700 に答える
1

Java では、すべてのオブジェクト変数が参照です。そう

Foo myFoo = new Foo();
Foo anotherFoo = myFoo;

両方の変数が、2 つの別々のコピーではなく、同じオブジェクトを参照していることを意味します。同様に、オブジェクトを に配置するCollectionと、オブジェクトへの参照のみが格納されます。したがって、ArrayListまたは同様の使用は、自動的に拡張するストレージを作成する正しい方法です。

于 2008-10-28T10:43:40.993 に答える
0

それがあなたが探しているものである場合、私が知っていることを行う一流の言語構造はありません。

于 2008-10-28T02:46:03.670 に答える
0

あまり効率的ではありませんが、配列に追加するだけであれば、Apache Commons ArrayUtils.add()を使用できます。追加の要素を含む元の配列のコピーを返します。

于 2008-10-28T03:04:03.760 に答える
-5

JavaScript でコードを記述できる場合は、はい、それを行うことができます。JavaScript 配列はスパース配列です。好きなように拡張します。

あなたは書ける

[0] = 4;
[1000] = 434;
[888] = "文字列";

于 2008-10-28T02:48:27.567 に答える