logo

Javaの配列

Javaでは配列 は、共通名で参照される、同様の型の変数のグループです。 Java の配列は、C/C++ の配列とは動作が異なります。以下に、Java 配列に関する重要な点をいくつか示します。

Javaの配列

  • Java では、すべての配列が動的に割り当てられます。 (後述)
  • 配列は、連続したメモリ [連続したメモリ位置] に格納できます。
  • Java では配列はオブジェクトであるため、オブジェクト プロパティを使用して配列の長さを見つけることができます。 長さ 。これは、sizeof を使用して長さを求める C/C++ とは異なります。
  • Java 配列変数は、他の変数と同様に、データ型の後に [] を付けて宣言することもできます。
  • 配列内の変数は順序付けされており、それぞれに 0 から始まるインデックスが付いています。
  • Java 配列は、静的フィールド、ローカル変数、またはメソッド パラメーターとしても使用できます。

配列には、配列の定義に応じて、クラスのプリミティブ (int、char など) およびオブジェクト (または非プリミティブ) 参照を含めることができます。プリミティブ データ型の場合、実際の値は連続したメモリ位置に格納される可能性があります (JVM はこの動作を保証しません)。クラスオブジェクトの場合は、 実際のオブジェクトはヒープセグメントに格納されます

JavaのHelloプログラム

Java 配列



注記: この配列のストレージは、配列の要素にランダムにアクセスするのに役立ちます [ランダム アクセスのサポート]。

配列の作成、初期化、アクセス

1次元配列

1 次元配列宣言の一般的な形式は次のとおりです。

-- type var-name[]; -- type[] var-name;>

配列宣言には、型と名前という 2 つのコンポーネントがあります。 タイプ 配列の要素の型を宣言します。要素タイプによって、配列を構成する各要素のデータ型が決まります。整数の配列と同様に、char、float、double などの他のプリミティブ データ型やユーザー定義のデータ型 (クラスのオブジェクト) の配列を作成することもできます。したがって、配列の要素タイプによって、配列が保持するデータのタイプが決まります。

例:

// both are valid declarations int intArray[]; int[] intArray; // similar to int we can declare // byte , short, boolean, long, float // double, char // an array of references to objects of // the class MyClass (a class created by user) MyClass myClassArray[]; // array of Object Object[] ao, // array of Collection // of unknown type Collection[] ca;>

最初の宣言は int Array が配列変数であることを確立していますが、 実際の配列は存在しません 。これは、この変数 (int Array) が整数型の配列を保持することをコンパイラーに伝えるだけです。 int 配列を実際の整数の物理配列にリンクするには、次を使用して配列を割り当てる必要があります。 新しい それを int 配列に代入します。

Java での配列のインスタンス化

配列が宣言されると、配列の参照のみが作成されます。配列を作成または配列にメモリを割り当てるには、次のような配列を作成します。 新しい 1 次元配列に適用すると、次のようになります。

var-name = new type [size];>

ここ、 タイプ 割り当てられるデータのタイプを指定します。 サイズ 配列内の要素の数を決定し、 変数名 配列にリンクされている配列変数の名前です。使用するには 新しい 配列を割り当てるには、 割り当てる要素のタイプと数を指定する必要があります。

例:

//declaring array int intArray[]; // allocating memory to array intArray = new int[20]; // combining both statements in one int[] intArray = new int[20];>

注記: によって割り当てられた配列内の要素 新しい 自動的に初期化されます ゼロ (数値型の場合)、 間違い (ブール値の場合)、または ヌル (参照タイプの場合)。参照してください Javaのデフォルトの配列値

配列の取得は 2 段階のプロセスです。まず、目的の配列型の変数を宣言する必要があります。次に、new を使用して配列を保持するメモリを割り当て、それを配列変数に割り当てる必要があります。したがって、 Javaで すべての配列は動的に割り当てられます。

Javaの配列リテラル

配列のサイズと配列の変数がすでにわかっている状況では、配列リテラルを使用できます。

// Declaring array literal int[] intArray = new int[]{ 1,2,3,4,5,6,7,8,9,10 };>
  • この配列の長さによって、作成される配列の長さが決まります。
  • Java の最新バージョンでは、新しい int[] 部分を記述する必要はありません。

for ループを使用した Java 配列要素へのアクセス

配列内の各要素には、インデックスを介してアクセスします。インデックスは 0 で始まり、(合計配列サイズ)-1 で終わります。配列のすべての要素には、Java for Loop を使用してアクセスできます。

 // accessing the elements of the specified array for (int i = 0; i>

実装:

ジャワ
// Java program to illustrate creating an array // of integers, puts some values in the array, // and prints each value to standard output. class GFG { public static void main(String[] args) { // declares an Array of integers. int[] arr; // allocating memory for 5 integers. arr = new int[5]; // initialize the first elements of the array arr[0] = 10; // initialize the second elements of the array arr[1] = 20; // so on... arr[2] = 30; arr[3] = 40; arr[4] = 50; // accessing the elements of the specified array for (int i = 0; i < arr.length; i++) System.out.println('Element at index ' + i + ' : ' + arr[i]); } }>

出力
Element at index 0 : 10 Element at index 1 : 20 Element at index 2 : 30 Element at index 3 : 40 Element at index 4 : 50>

上記のメソッドの複雑さ:

時間計算量: O(n)
補助スペース: O(1)

次を使用して Java 配列にアクセスすることもできます ループごとに

ネットワークの種類

Java の配列

Java のオブジェクトの配列

オブジェクトの配列は、次の方法でプリミティブ型データ項目の配列と同様に作成されます。

Student[] arr = new Student[5]; //student is a user-defined class>

構文:

-- data type[] arrName; -- datatype arrName[]; -- datatype [] arrName;>

オブジェクトの配列の例

例 1:

以下は、上記のトピックの実装です。

ジャワ
import java.io.*; class GFG { public static void main (String[] args) { int [] arr=new int [4]; // 4 is the size of arr System.out.println('Array Size:'+arr.length); } }>

出力
Array Size:4>

Student 配列には、それぞれが Student クラスのサイズの 5 つのメモリ スペースが含まれており、そこに 5 つの Student オブジェクトのアドレスを格納できます。 Student オブジェクトは Student クラスのコンストラクターを使用してインスタンス化する必要があり、その参照は次の方法で配列要素に割り当てる必要があります。

例 2:

以下は、上記のトピックの実装です。

ジャワ
// Java program to illustrate creating // an array of objects class Student { public int roll_no; public String name; Student(int roll_no, String name) { this.roll_no = roll_no; this.name = name; } } // Elements of the array are objects of a class Student. public class GFG { public static void main(String[] args) { // declares an Array of Students Student[] arr; // allocating memory for 5 objects of type Student. arr = new Student[5]; // initialize the first elements of the array arr[0] = new Student(1, 'aman'); // initialize the second elements of the array arr[1] = new Student(2, 'vaibhav'); // so on... arr[2] = new Student(3, 'shikar'); arr[3] = new Student(4, 'dharmesh'); arr[4] = new Student(5, 'mohit'); // accessing the elements of the specified array for (int i = 0; i < arr.length; i++) System.out.println('Element at ' + i + ' : ' + arr[i].roll_no + ' ' + arr[i].name); } }>

出力
Element at 0 : 1 aman Element at 1 : 2 vaibhav Element at 2 : 3 shikar Element at 3 : 4 dharmesh Element at 4 : 5 mohit>

上記のメソッドの複雑さ:

時間計算量: O(n)
補助スペース : O(1)

例 3

オブジェクトの配列も次のように作成されます。

ジャワ
// Java program to illustrate creating // an array of objects class Student { public String name; Student(String name) { this.name = name; } @Override public String toString(){ return name; } } // Elements of the array are objects of a class Student. public class GFG { public static void main (String[] args) { // declares an Array and initializing the elements of the array Student[] myStudents = new Student[]{new Student('Dharma'),new Student('sanvi'),new Student('Rupa'),new Student('Ajay')}; // accessing the elements of the specified array for(Student m:myStudents){ System.out.println(m); } } }>

出力
Dharma sanvi Rupa Ajay>

配列サイズを超えた要素にアクセスしようとするとどうなるでしょうか?

JVM がスローする ArrayIndexOutOfBoundsException 配列が不正なインデックスでアクセスされたことを示します。インデックスは負であるか、配列のサイズ以上です。

以下のコードは、配列サイズを超えた要素にアクセスしようとした場合に何が起こるかを示しています。

ジャワ
// Code for showing error 'ArrayIndexOutOfBoundsException' public class GFG { public static void main(String[] args) { int[] arr = new int[4]; arr[0] = 10; arr[1] = 20; arr[2] = 30; arr[3] = 40; System.out.println( 'Trying to access element outside the size of array'); System.out.println(arr[5]); } }>

出力

Trying to access element outside the size of array Exception in thread 'main' java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4 at GFG.main(GFG.java:13)>

例 (配列の反復):

ジャワ
public class GFG { public static void main(String[] args) { int[] arr = new int[2]; arr[0] = 10; arr[1] = 20; for (int i = 0; i < arr.length; i++) System.out.println(arr[i]); } }>

出力
10 20>

上記のメソッドの複雑さ:

時間計算量: O(n)、 ここで、n は配列のサイズです。
補助スペース: O(1) 余分なスペースが必要ないため。

Java の多次元配列

多次元配列は 配列の配列 配列の各要素は他の配列の参照を保持します。これらは次のようにも知られています ギザギザの配列 。多次元配列は、次元ごとに 1 セットの大括弧 ([]) を追加することによって作成されます。

Java多次元配列の構文

Java 多次元配列を宣言するには、次に示す 2 つの方法があります。

-- datatype [][] arrayrefvariable; -- datatype arrayrefvariable[][];>

例:

ジャワ
// Java Program to demonstrate // Java Multidimensional Array import java.io.*; // Driver class class GFG { public static void main(String[] args) { // Syntax int[][] arr = new int[3][3]; // 3 row and 3 column // Number of Rows System.out.println('Number of Rows:'+ arr.length); // Number of Columns System.out.println('Number of Columns:'+ arr[0].length); } }>

出力
Number of Rows:3 Number of Columns:3>


多次元配列

int を 2 倍にする

多次元配列の宣言

int[][] intArray = new int[10][20]; //a 2D array or matrix int[][][] intArray = new int[10][20][10]; //a 3D array>

Java での多次元配列の例

例 1:

上記のメソッドの実装を以下に示します。

ジャワ
// Java Program to Multidimensional Array // Driver Class public class multiDimensional { // main function public static void main(String args[]) { // declaring and initializing 2D array int arr[][] = { { 2, 7, 9 }, { 3, 6, 1 }, { 7, 4, 2 } }; // printing 2D array for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) System.out.print(arr[i][j] + ' '); System.out.println(); } } }>

出力
2 7 9 3 6 1 7 4 2>

配列をメソッドに渡す

変数と同様に、配列をメソッドに渡すこともできます。たとえば、以下のプログラムは配列をメソッドに渡します。 配列の値の合計を計算します。

ジャワ
// Java program to demonstrate // passing of array to method public class Test { // Driver method public static void main(String args[]) { int arr[] = { 3, 1, 2, 5, 4 }; // passing array to method m1 sum(arr); } public static void sum(int[] arr) { // getting sum of array values int sum = 0; for (int i = 0; i < arr.length; i++) sum += arr[i]; System.out.println('sum of array values : ' + sum); } }>

出力
sum of array values : 15>

上記のメソッドの複雑さ:

時間計算量: の上)
補助スペース: ○(1)

メソッドから配列を返す

通常どおり、メソッドは配列を返すこともできます。たとえば、以下のプログラムはメソッドから配列を返します。 m1

ジャワ
// Java program to demonstrate // return of array from method class Test { // Driver method public static void main(String args[]) { int arr[] = m1(); for (int i = 0; i < arr.length; i++) System.out.print(arr[i] + ' '); } public static int[] m1() { // returning array return new int[] { 1, 2, 3 }; } }>

出力
1 2 3>

上記のメソッドの複雑さ:

時間計算量: O(n)
補助スペース : O(1)

配列のクラスオブジェクト

すべての配列には関連付けられた Class オブジェクトがあり、同じコンポーネント タイプを持つ他のすべての配列と共有されます。

ジャワ
// Java program to demonstrate // Class Objects for Arrays class Test { public static void main(String args[]) { int intArray[] = new int[3]; byte byteArray[] = new byte[3]; short shortsArray[] = new short[3]; // array of Strings String[] strArray = new String[3]; System.out.println(intArray.getClass()); System.out.println( intArray.getClass().getSuperclass()); System.out.println(byteArray.getClass()); System.out.println(shortsArray.getClass()); System.out.println(strArray.getClass()); } }>

出力
class [I class java.lang.Object class [B class [S class [Ljava.lang.String;>

上記の方法の説明:

  1. 文字列 [I は、コンポーネント型を持つクラス オブジェクト配列の実行時の型シグネチャです。 整数
  2. 配列型の唯一の直接スーパークラスは次のとおりです。 java.lang.オブジェクト
  3. 文字列 [B は、コンポーネント型を持つクラス オブジェクト配列の実行時の型シグネチャです。 バイト
  4. 文字列 [S は、コンポーネント型を持つクラス オブジェクト配列の実行時の型シグネチャです。 短い
  5. 文字列 [L は、クラスのコンポーネント型を持つクラス オブジェクト配列の実行時型シグネチャです。その後にクラス名が続きます。

Java 配列メンバー

さて、ご存知のとおり、配列はクラスのオブジェクトであり、配列の直接のスーパークラスはクラス Object です。配列型のメンバーはすべて次のとおりです。

  • 公開最終フィールド 長さ 配列のコンポーネントの数が含まれます。長さは正またはゼロの場合があります。
  • すべてのメンバーは Object クラスから継承されます。継承されない唯一の Object メソッドは、 クローン 方法。
  • パブリックメソッド クローン() クラス Object の clone メソッドをオーバーライドし、何もスローしません。 チェックされた例外

配列タイプとそれらに許可される要素タイプ

配列の種類許可される要素タイプ
プリミティブ型配列宣言された型に暗黙的に昇格できる任意の型。
オブジェクト型配列宣言された型オブジェクト、またはその子クラス オブジェクトのいずれか。
抽象クラス型配列その子クラスのオブジェクトは許可されます。
インターフェイス型配列その実装クラス オブジェクトは許可されます。

Java での 1 次元配列のクローン作成

Object[] などの 1 次元配列のクローンを作成すると、参照ではなく元の配列の要素のコピーを含む新しい配列を使用してディープ コピーが実行されます。

ソートされたJava配列

上記のメソッドの実装を以下に示します。

ジャワ
// Java program to demonstrate // cloning of one-dimensional arrays class Test { public static void main(String args[]) { int intArray[] = { 1, 2, 3 }; int cloneArray[] = intArray.clone(); // will print false as deep copy is created // for one-dimensional array System.out.println(intArray == cloneArray); for (int i = 0; i < cloneArray.length; i++) { System.out.print(cloneArray[i] + ' '); } } }>

出力
false 1 2 3>


アレイのクローン

Java での多次元配列のクローン作成

ただし、多次元配列 (Object[][] など) のクローンは浅いコピーです。つまり、各要素配列が元の要素配列への参照を持つ単一の新しい配列のみを作成しますが、サブ配列は共有されました。

ジャワ
// Java program to demonstrate // cloning of multi-dimensional arrays class Test { public static void main(String args[]) { int intArray[][] = { { 1, 2, 3 }, { 4, 5 } }; int cloneArray[][] = intArray.clone(); // will print false System.out.println(intArray == cloneArray); // will print true as shallow copy is created // i.e. sub-arrays are shared System.out.println(intArray[0] == cloneArray[0]); System.out.println(intArray[1] == cloneArray[1]); } }>

出力
false true true>


多次元配列クローン

Java 配列に関するよくある質問

1. 配列のサイズを長く指定できますか?

いいえ、配列のサイズをlongとして指定することはできませんが、intまたはshortとして指定することはできます。

2. Java の配列の直接のスーパークラスはどれですか?

アン 物体 Java の配列の直接のスーパークラスです。

3. Java の配列によって実装されるインターフェイスはどれですか?

すべての配列タイプはインターフェイス Cloneable とインターフェイスを実装します。 java.io.Serializable

4. 配列のサイズを変更できますか?

配列のサイズは(初期化されると)変更できません。ただし、別の配列を指すように配列参照を作成することはできます。

このトピックの関連記事