これは配列であることがわかります
ブロガーのホームページzoro-1 で、
私が以前大連で撮った美しい風景を紹介します。
配列の基本概念
配列を使用する理由
クラス内の人の成績を記録するなど、複数のデータを保存したい場合、記録する変数をたくさん作成し続けることができますか。答えは「はい」ですが、データが多すぎる場合、複数の変数を作成するのは非常に面倒です。この時点では配列を使用します
配列の概念
配列: 同じ型の要素の集合とみなすことができます。メモリ内の連続した空間です
アレイの特徴
- 配列に格納されている要素は同じ型です
- 配列の空間が連結される
- 各空間には独自の番号があり、実際にはその位置の番号は配列の添字である 0 になります。
配列の初期化方法
定義方法:
T[] 数组名 = new T[N];
T:表示数组中存放元素的类型
T[]:表示数组的类型
N:表示数组的长度
例:
int[] array1 = new int[10]; // 创建一个可以容纳10个int类型元素的数组 double[] array2 = new double[5]; // 创建一个可以容纳5个double类型元素的数组 String[] array3 = new double[3]; // 创建一个可以容纳3个字符串元素的数组
配列の初期化は静的初期化と動的初期化に分けられます。
1. 動的初期化
動的初期化: 配列を作成するときに、配列内の要素の数を直接指定します
。 構文形式:
int[] array = new int[10];
2. 静的初期化
静的初期化: 配列を作成するとき、データ要素の数は直接指定されませんが、特定のデータの内容は直接指定されます。
構文形式:
T[] 数组名称 = {
data1, data2, data3, ..., datan};
int[] array1 = new int[]{
0,1,2,3,4,5,6,7,8,9};
double[] array2 = new double[]{
1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = new String[]{
"hell", "Java", "!!!"};
予防
1. 静的初期化では配列の長さは指定されませんが、コンパイラはコンパイル中に {} の要素の数に応じて配列の長さを決定します。
2. 静的初期化中、{} 内のデータ型は [] より前のデータ型と一致している必要があります。
3. 静的初期化は、後ろの新しい T[] を省略して省略できます。
静的初期化と動的初期化のステップは 2 つのステップに分けることもできますが、形式を省略することはできません
nt[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{
10, 20, 30};
// 注意省略格式不可以拆分, 否则编译失败
// int[] array3;
// array3 = {1, 2, 3};
配列が初期化されていない場合、配列内の要素にはデフォルト値が設定されます。
配列の使用
配列要素にアクセスする
配列はメモリ上の連続した空間です。空間の番号は 0 から始まり、順番に増加します。この番号は配列の添字と呼ばれ、配列は添字を通じて任意の位置の要素にアクセスできます。
コードデモ
int[]array = new int[]{
10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
// 也可以通过[]对数组中的元素进行修改
array[0] = 100;
System.out.println(array[0]);
予防:
- 配列は連続したメモリ空間であるため、ランダム アクセス、つまり添字アクセスを通じて配列内の任意の位置の要素に迅速にアクセスできます。
- 添字は 0 から始まり、[0, N) の間に N は含まれません。N は要素の数であり、制限を超えることはできません。それ以外の場合は、添字の範囲外の例外が報告されます。
配列を走査するいくつかの方法
1. 直接印刷 (望ましくない)
public class Text1 {
public static void main(String[] args) {
int[] arr={
1,2,3,4,5};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);
}
}
印刷結果:
2. ループ印刷用(判定条件がある場合に推奨)
public class Text1 {
public static void main(String[] args) {
int[] arr={
1,2,3,4,5};
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
印刷結果:
3. String に変換して印刷します (配列の内容を単に印刷する場合に推奨)
import java.util.Arrays;
public class Text1 {
public static void main(String[] args) {
int[] arr={
1,2,3,4,5};
System.out.println(Arrays.toString(arr));
}
}
印刷結果:
4. for ループの強化
注: 括弧の左側には、右側に配列ストレージのデータ型、右側に配列名が書き込まれます。これは、配列の要素を右側の x に代入して出力するのと同じです。
public class Text1 {
public static void main(String[] args) {
int[] arr={
1,2,3,4,5};
for (int x:arr){
System.out.print(x+" ");
}
}
}
印刷結果:
配列は参照データ型です
JVMメモリ分散
- プログラムの実行時にコードをメモリにロードする必要がある
- プログラムの実行によって生成された中間データはメモリに保存される必要があります
- プログラム内の定数も保存する必要があります
- 一部のデータは長期間保存する必要があり、一部のデータはメソッドの実行後に破棄されます。
メモリに保存されたデータがむやみに保存されると、メモリ管理が非常に面倒になってしまいます。
たとえば、この図は左から右に比較されている
ため、JVM はさまざまな機能に従って使用されるメモリも分割します。
ここではヒープと仮想マシン スタックのみに注目します。これについては後続の JVM で詳しく説明します。
基本データ型と参照データ型の違い
違い:
- 基本データ型によって作成された変数は基本変数と呼ばれ、対応する値は変数空間に直接格納されます。
- リファレンスデータ型で作成される変数は一般にオブジェクトのリファレンスと呼ばれ、その空間にはオブジェクトが配置されている空間のアドレスが格納されます。
public static void func() {
int a = 10;
int b = 20;
int[] arr = new int[]{
1,2,3};
}
上記のコードでは、a、b、および arr はすべて関数内の変数であるため、それらの領域は main メソッドに対応するスタック フレームに割り当てられます。a と b は組み込み型の変数であるため、その空間に格納されるのは、変数に対して初期化された値です。array は配列型の参照変数であり、内部に格納される内容は、単純にヒープ空間内の配列の先頭アドレスとして理解できます。
上図からわかるように、参照変数はオブジェクトそのものを直接格納するのではなく、単純にヒープ領域内のオブジェクトの開始アドレスを格納すると理解できます。このアドレスを通じて、参照変数を使用してオブジェクトを操作できます。C 言語のポインターに少し似ていますが、Java での参照はポインター操作よりも単純です。
nullを認識する
Null は Java では「null 参照」、つまりオブジェクトを指さない参照を意味します。
int[] arr = null;System.out.println(arr[0]);
null の役割は、C 言語の NULL (ヌル ポインタ) に似ており、無効なメモリ位置を意味します。したがって、このメモリに対して読み取りまたは書き込み操作を実行することはできません。読み取りまたは書き込みを試行すると、NullPointerException がスローされます。 。
アレイのアプリケーションシナリオ
セーブデータ
public class Text1 {
public static void main(String[] args) {
int[] arr={
1,2,3,4,5};
}
}
関数パラメータとして
import java.util.Arrays;
public class Text1 {
public static void main(String[] args) {
int[] arr = {
5, 6, 4, 2};
sort(arr);
System.out.println(Arrays.toString(arr));
}
static void sort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}
いわゆる「参照」は本質的にアドレスを格納するだけです。Java は配列を参照型として設定します。このようにして、後続の配列パラメータの受け渡しは、実際には配列のアドレスを関数パラメータに渡すだけです。これにより、配列のコピー全体 (配列は比較的長い場合があるため、コピーのオーバーヘッドが非常に大きくなります)。
関数の戻り値として
import java.util.Arrays;
public class Text1 {
public static void main(String[] args) {
int[] arr = {
5, 6, 4, 2};
int[] arr2=sort(arr);
System.out.println(Arrays.toString(arr2));
}
static int[] sort(int[] arr1) {
int[] arr=arr1;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
}
関数の戻り値として、sort 関数では、まず arr1 を指す arr の参照を作成し、次に arr を操作し、arr を返して配列で受け取ります。
配列関連のコンテンツについては、次の章を聞いてください。これを見た後、ブロガーに 3 つのリンクを与えるとよいでしょう。続けて聞きたい場合は、ブロガーをフォローすることもできます。皆さん、一緒に強くなりましょう!!!!