私たちが Java (および他の言語) のデータ構造の研究に初めて触れるのは、配列を通してです。 Java では、配列はクラス、オブジェクト、オブジェクトの子です (すべてのクラスが同様です)。ただし、言語に関しては特別扱いの授業です。
一般的なクラスやオブジェクトとは異なり、配列の構文とその処理はコンパイラーと JVM (Java 仮想マシン) によって直接管理されます。これには、配列の割り当て、操作、アクセスの方法が含まれます。このクラスはソース コード内に直接見つかりません。
Java は、配列をこの特別なクラスのインスタンスとして自動的に扱います。
以下のコードを実行すると、次の出力が表示されます:
public class Main { public static void main(String[] args) { int[] intArray = new int[5]; System.out.println(intArray.getClass().getName()); System.out.println(intArray.getClass().getSuperclass()); } }
[私は
クラス java.lang.Object
このクラス名「[I」は、自動的に生成された単なるシンボリック名であり、JVM は整数の配列 (int[]) を表すために使用します。各タイプには独自のシンボル名があります:
括弧「[」は寸法を示します。 1 次元配列は [ で表され、2 次元配列は [[ で表され、3 次元配列は [[[... などで表されます。
配列を宣言して初期化するには、オブジェクトのデータ型とサイズを指定することが重要です。
int[] intArray = new int[5]; //array de tamanho 5 char[] charArray = new char[]{'a', 'b', 'c'}; //o compilador entende que é um array de tamanho 3 double[] doubleArray = {1.2, 1.3, 1.4, 1.5}; //o compilador entende que é um array de tamanho 4
Java では、型の代わりに変数名に角括弧を入れることができます (例: int intArray[] = new int[5])。ただし、これは慣例から逸脱するためお勧めできません。
配列内に格納されたデータは、JVM によって「連続して」、つまり順番にメモリに割り当てることができます。データにアクセスするにはインデックスが使用され、Java では配列の最初のインデックスは常に 0 になります。
たとえば、上記の charArray の文字「a」にアクセスするには、charArray[0] で検索する必要があります。文字「b」は charArray[1] にあり、文字「c」は charArray[2] にあります。配列内に存在しないインデックスにアクセスしようとすると、「IndexOutOfBounce」エラーが発生します。たとえば、charArray[3] の値にアクセスしようとするとします。
配列のサイズは、宣言で一度定義されると変更できません。 charArray に 3 つの要素があると宣言した場合、それ以上の要素は含まれません。 「はい」が少なく、「いいえ」が多くなります。
そして、補足です。配列内の値が入力されていない場合は、配列の型と同じデフォルト値が想定されます。たとえば、整数配列では、空の値は 0 で埋められます。ブール配列では、false が埋められます。 null を含む文字列配列内。
サイズと同様に、配列の型も変更できません。ただし、同じ型のサブタイプであれば、異なる型の配列をコピーすることは可能です。混乱しますよね?例が役に立ちます。Integer と Double は Number のサブタイプです。それで...
Integer[] integerArray = {1, 2, 3}; Number[] numberArray = intgerArray;
このコードはコンパイラによって受け入れられます。ただし、注意が必要です。ここでこれを行うと、コンパイル エラーが生成されます:
numberArray[0] = 1.2;
これは、integerArray とnumberArray が同じメモリ空間を指しているためです。 numberArray は最初の要素として double をサポートしていますが、integerArray はサポートしていないため、numberArray はインデックス値 0 を変更することを「許可されていません」。
配列は常に同じ型のデータを格納でき、プリミティブとオブジェクトを受け入れます。配列が整数で構成されている場合、char、double、float、String は受け入れられません。整数値のみを受け入れます。
配列自体は (特殊ではありますが) クラスであるため、ヒープに保存されます。このようにして、配列にはメモリ アドレスが格納され、そのメモリ アドレスには配列に入力された値が含まれます。
プリミティブ配列は値を直接保存するために連続したメモリ ブロックを割り当てますが、オブジェクト配列はメモリ内の別の場所にあるオブジェクトへの参照 (ポインタ) を保存します。
これは、プリミティブ型の配列 (int[] など) とオブジェクトの配列 (String[] など) の両方がヒープに格納されることを意味します。プリミティブ型の配列の場合、配列要素の値も配列自体に連続してヒープに直接格納されます。オブジェクト配列の場合、これらの参照が指すオブジェクトはヒープ上の異なる場所に割り当てることができます。
すべての配列クラスには長さとクローン作成メソッドがあります。最初の関数は配列のサイズを返し、2 番目の関数は配列のコピーを別の配列 (この場合は同じメモリ アドレスへのポインター) に作成します。
ただし、配列には Object クラス (Java のすべてのクラスと同様) の子として、toString、equals、および hashCode というスーパークラス メソッドもあります。
しかし、実際にはバックグラウンドで配列を使用することが最も頻繁に行われます。配列は高性能ですが、その要素を反復するのははるかに複雑で、プログラマの作業をはるかに簡素化する配列の上に抽象化を行うクラスがあります。
これは Arrays クラス (大文字) の場合です。基本的に配列を標準 Java クラスにパッケージ化し、データを操作するための実装が非常に簡単な一連のメソッドを提供します。 Arrays クラスには、もう 1 つの強力な利点があります。動的割り当てで動作するため、コレクションの処理が容易になります。結局のところ、必要な配列の正確なサイズがわかることはほとんどありません。 Arrays クラスは、プログラマがより大きなサイズの新しい配列 (小文字を含む) を作成したり、突然小さくなりすぎた以前の配列からデータをコピーしたりすることなく、オンデマンドでコレクションのサイズを拡張できます。
配列は、List、Stack、Queue などのクラスの基礎でもあります (これらは基本的にラップであり、データを処理するための非常に優れたメソッドが含まれています)。
String が char 配列を抽象化するクラスであると考えたことはありますか?
以上がarray[]: JVM 自体によって内部的に管理される特別なクラスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。