1. まえがき
学習の概要: 最初の 8 日間では、文法、演算子と式、ループ構造、分岐構造の基礎を学び、今日は主に配列の定義とそれに関連するものを学びます。属性メソッド、配列ストレージ メモリ図、よくある間違い
学習目標: 配列の 2 つの定義方法、関連するプロパティをマスターし、メモリの原理を理解し、エラー解決を理解する
2. 配列の定義
1 .概要
##クラスメートの成績を保存する必要がある場合、どのような方法を使用する必要がありますか?
前に学んだように、複数の変数を定義してさまざまな成績を保存できます。しかし、学生が 1,000 人以上いる場合、1,000 個を超える変数を定義するのはどうでしょうか?もちろんそうではありません。これには配列を使用する必要があります。
2. 配列の静的初期化
特徴: 配列定義時に値を直接代入し、システムが配列の長さを決定します
一般的な形式:
データ型 [] 配列名 = { 要素 1, 要素 2, 要素 3,... };例:
int [] array= {1,2,3, 4,5};
double[] スコア = {88.5, 99.5, 59.5};
3. 配列を動的に初期化する
機能: 要素の型を決定する配列を定義するときの配列の長さ、およびデータの保存
一般形式:
データ型[]配列名=新しいデータ型[長さ];例:
int [] array= new int [5];
double[] スコア = new double[3];
デフォルト値:
データ型 | 特定の定義型 | デフォルト値 |
基本型 | ##byte 、short、char、int、long
0 |
|
float、double
0.0 |
|
ブール値
#false |
| 参照型
クラス、インターフェイス、配列、文字列 |
null |
|
4. 概要
##3. 配列属性1. アクセス一般アクセス 配列の形式は次のとおりです:
配列名[インデックス]
質問例: //静态初始化数组
int [] array= {1,2,3,4,5};
System.out.println(array[0]);//输出 1
System.out.println(array[1]);//输出 2
System.out.println(array[3]);//输出 4
ログイン後にコピー
2. 長さ長さを直接呼び出すことができます。 length は配列の長さを取得します。 質問例: //静态初始化数组
int [] array= {1,2,3,4,5};
System.out.println(array.length);//调用方法,输出长度 5
//最大索引array.length-1
ログイン後にコピー
3. トラバーサルトラバーサルは配列要素に 1 つずつアクセスし、主に検索やデータ統計に使用されます...ループ構造と分岐構造については前に学習しました。for ループを通じて配列を走査しましょう質問例:与えられた要素 {10,8,9,4,5,6,8 ,71,2,3,9,99}、静的配列を使用して、5 より大きい要素を配列に格納および出力しますか? エンコード実装: //静态初始化数组
int [] array= {10,8,9,4,5,6,8,71,2,3,9,99};
for(int i=0;i<array.length;i++)
{
if(array[i]>5)
System.out.println(array[i]);
}
ログイン後にコピー
出力結果: 10 8 9 6 8 71 9 99
IV. メモリマップ#Java がプログラムを実行するときは、メモリ内に領域を割り当て、その領域をさまざまな領域に分割する必要があります。 スタック メモリ: ローカル変数を保存し、使用後すぐに消えます。 ヒープ メモリ: コンテンツ (オブジェクト、エンティティ) と新しい変数のアドレスを保存します。使用後、ガベージ コレクターがアイドル状態のときにリサイクルします。 1. 単一配列メモリ グラフ
配列を作成する次のコードは、そのメモリ関係グラフを実装します
エンコード実装:
//动态初始化数组
int [] arr=new int[3];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//修改值
arr[0]=100;
arr[2]=200;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
ログイン後にコピー
出力結果:
[I@15db974200
0
[I@15db9742
] 100
0
200
原理の説明:
動的初期化では、まず、ヒープメモリ arr アドレス値は、コンパイラの結果に応じて、ここでは 001 とします。動的初期化のため、各要素には初期値が設定されており、詳細は上表を参照してください。要素を出力するときは、まず配列名アドレスにアクセスし、ヒープ メモリの添字に移動して、要素の値を出力します。 配列値を変更するプロセスは、以下に示すように、変更プロセスにもう 1 つのステップがあることを除いて、表示する場合と同じです。 ##2. 複数の配列メモリの図
複数の配列と単一の配列メモリを使用する原理は同じです。ここでは詳細には触れません。
3. 配列は同じメモリを指します
2 つの配列のアドレス値を同じになるように変更すると、変更された結果は次のようになります。次のコード。 エンコード実装: //动态初始化数组
int [] arr=new int[3];
arr[0]=100;
arr[1]=200;
arr[2]=300;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
int [] arr2=arr;
arr2[0]=111;
arr2[1]=222;
arr2[2]=333;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr2);
System.out.println(arr2[0]);
ログイン後にコピー
出力結果: [I@15db9742
100200
300[I@ 15db9742111
[I@15db9742
111
原理の説明:
##最初の配列はヒープ メモリ内にありますのアドレスは 001 で、2 番目の配列も 001 であるため、2 番目の配列の値を変更することは、実際には同じ配列メモリになります。それに応じて最初の配列の値も変更され、結果は次のようになります: 5. よくある質問1. インデックスが範囲外です//静态初始化数组
int [] array= {1,2,3};
System.out.println(array[3]);
ログイン後にコピー
上記のコードを実行すると、次のエラー例外が表示されます:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException : 3 説明: 配列を静的に初期化し、3 つの数値を与えました。最大インデックスは 2 です。3 にアクセスすると、エラーが報告されます。
2. Null ポインター例外 //动态初始化数组
int [] array= new int[3];
array=null;
System.out.println(array[0]);
ログイン後にコピー
上記のコードを実行すると、次のエラー例外が表示されます:
スレッド "main" java.lang.NullPointerException での例外 説明: 配列を null に設定したため、アクセスされた配列がヒープ メモリ内のデータを指さなくなりました
以上がJava配列の使用方法の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。