Javaの配列
Java では、配列は同じ型の複数の値を格納できるようにする重要な線形データ構造です。
- Java の配列は、Java 配列の他のすべてのオブジェクトと同様に、暗黙的に java.lang.Object クラスから継承するオブジェクトです。これにより、Object で定義されたメソッド (toString()、equals()、hashCode() など) を呼び出すことができます。
- 配列には、配列内の要素の数を提供する組み込みの長さプロパティがあります。
public class Geeks { public static void main ( String [] args ) { // initializing array int [] arr = { 40 55 63 17 22 }; // size of array int n = arr . length ; // traversing array for ( int i = 0 ; i < n ; i ++ ) System . out . print ( arr [ i ] + ' ' ); } }
出力
40 55 63 17 22
配列の主な機能
- プリミティブとオブジェクトを保存します。 Java 配列は、プリミティブ型 (int char boolean など) とオブジェクト (String Integer など) の両方を保持できます。
- 連続したメモリ割り当て プリミティブ型の配列を使用する場合、要素は連続した場所に格納されます。非プリミティブ型の場合、項目の参照は連続した場所に格納されます。
- ゼロベースのインデックス作成: 配列の最初の要素のインデックスは 0 です。
- 固定長: 配列を作成すると、そのサイズは固定されます。それを変えることはできません。
Java でのプリミティブ配列表現
Java での非プリミティブ配列表現 Java での配列の基本操作
1. 配列の宣言
配列宣言の一般的な形式は次のとおりです。
// 方法 1:
int arr[];// 方法 2:
int[] arr;
要素タイプによって、配列を構成する各要素のデータ型が決まります。整数の配列と同様に、char float double などの他のプリミティブ データ型やユーザー定義のデータ型 (クラスのオブジェクト) の配列を作成することもできます。
注記: これは、実際の配列が存在しない配列変数を作成する方法にすぎません。これは、この変数 (int Array) が整数型の配列を保持することをコンパイラーに伝えるだけです。
2. Java での配列の初期化
配列が宣言されると、配列の参照のみが作成されます。 new を使用して、指定されたサイズの配列を割り当てます。
int arr[] = 新しい int[サイズ];
- 配列宣言は通常静的ですが、サイズが定義されていない場合、配列のサイズは動的に変更されます。
- Java では、配列のメモリは常に (ヒープ セグメント上で) 動的に割り当てられます。これは、メモリを静的に割り当てることも動的に割り当てることもできる C/C++ とは異なります。
- new によって割り当てられた配列内の要素は、自動的に 0 (数値型の場合)、false (ブール型の場合)、または null (参照型の場合) に初期化されます。
Javaの配列リテラル
配列のサイズと配列の変数がすでにわかっている状況では、配列リテラルを使用できます。
// 配列リテラルの宣言
int[] arr = 新しい int[]{ 12345678910 };
- この配列の長さによって、作成される配列の長さが決まります。
- Java の最新バージョンでは、新しい int[] 部分を記述する必要はありません。
3. 配列要素を変更する
要素を変更するには、特定のインデックスに新しい値を割り当てます。インデックスは 0 で始まり、(合計配列サイズ)-1 で終わります。
// 最初の要素を 90 に変更します
arr[0] = 90;
4. 配列の長さ
length プロパティを使用して配列の長さを取得できます。
// 配列の長さを取得する
int n = arr.length;
5. すべての配列要素へのアクセスと更新
- 配列のすべての要素には、Java for Loop を使用してアクセスできます。
- 配列内の各要素には、インデックスを介してアクセスします。
すべての配列要素へのアクセスと更新 整数の配列の作成を説明する Java プログラムは、配列にいくつかの値を入れ、各値を標準出力に出力します。
Java class Geeks { public static void main ( String [] args ) { // declares an Array of integers. int [] arr ; // allocating memory for 5 integers. arr = new int [ 5 ] ; // initialize the elements of the array // first to last(fifth) element arr [ 0 ] = 2 ; arr [ 1 ] = 4 ; arr [ 2 ] = 8 ; arr [ 3 ] = 12 ; arr [ 4 ] = 16 ; // 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 : 2 Element at index 1 : 4 Element at index 2 : 8 Element at index 3 : 12 Element at index 4 : 16
Java のオブジェクトの配列
オブジェクトの配列は、プリミティブ型のデータ項目の配列と同様に作成されます。
例 : ここでは、学生クラスを取得し、配列に格納された 5 つの Student オブジェクトを持つ Student の配列を作成します。 Student オブジェクトは Student クラスのコンストラクターを使用してインスタンス化する必要があり、その参照を配列要素に割り当てる必要があります。
class Student { public int roll_no ; public String name ; Student ( int roll_no String name ){ this . roll_no = roll_no ; this . name = name ; } } public class Geeks { public static void main ( String [] args ){ // declares an Array of Student Student [] arr ; // allocating memory for 5 objects of type Student. arr = new Student [ 5 ] ; // initialize the elements of the array arr [ 0 ] = new Student ( 1 'aman' ); arr [ 1 ] = new Student ( 2 'vaibhav' ); 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 } 配列サイズを超えた要素にアクセスしようとするとどうなるでしょうか?
JVM は、配列が不正なインデックスでアクセスされたことを示す ArrayIndexOutOfBoundsException をスローします。インデックスは負であるか、配列のサイズ以上です。
以下のコードは、配列サイズを超えた要素にアクセスしようとした場合に何が起こるかを示しています。
Java public class Geeks { 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 ] ); } }
出力:
配列サイズ外の要素の出力 配列をメソッドに渡す
変数と同様に、配列をメソッドに渡すこともできます。たとえば、以下のプログラムは配列を sum メソッドに渡し、配列の値の合計を計算します。
例:
Java public class Geeks { // 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
説明
- この Java プログラムは、配列をメソッドに渡す方法を示します。
- 整数配列 arr は main メソッドで宣言され、初期化されます。
- sum() メソッドは、arr を引数として呼び出します。
- sum() メソッド内では、for ループを使用してすべての配列要素が追加されます。
- 最終的な合計がコンソールに出力されます。
メソッドから配列を返す
通常どおり、メソッドは配列を返すこともできます。たとえば、以下のプログラムはメソッド m1 から配列を返します。
例:
Java class Geeks { // 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
Java 配列の利点
- 効率的なアクセス: インデックスによる要素へのアクセスは高速で、時間計算量は一定で O(1) です。
- メモリ管理: 配列のサイズは固定されているため、メモリ管理が簡単かつ予測可能になります。
- データ構成: 配列はデータを構造化して整理するのに役立ち、関連する要素の管理が容易になります。
Java 配列の欠点
- 固定サイズ: 配列が作成されるとそのサイズは変更できないため、サイズが過大評価されるとメモリの無駄が発生したり、過小評価されるとストレージが不足したりする可能性があります。
- タイプの均一性: 配列には同じデータ型の要素のみを格納できるため、混合型のデータの場合は追加の処理が必要になる場合があります。
- 挿入と削除: 特に配列の途中で要素を挿入または削除すると、要素を移動する必要があるため、コストがかかる可能性があります。
関連記事
- Javaのギザギザ配列
- Java の For-each ループ
- Javaの配列クラス