目次
最近、JAVAアレイの知識を学び、主に4つの側面から簡単に参照できるように研究ノートとしてブログを書きました。(0)アレイが特別なのはなぜですか。(1)配列の概要(2)1次元配列、定義、宣言、初期化、使用、メモリ分析、(3)2次元配列、定義、宣言、初期化、使用、メモリ分析。(4)配列クラスとそのメソッドを使用する場合は、追加、削除、変更、確認を行ってください。配列は、データ構造とアルゴリズムで導入されたバブルソート、最小二分法などのソートアルゴリズムに関連しています。ここでの配列の適用は、配列内のデータの追加、削除、変更、およびチェックのみを導入します。
(ゼロ)配列が特別なのはなぜですか?
JAVAでオブジェクトを保持する方法は他にもたくさんありますが、配列が一意である理由は何ですか?
配列と他のタイプのコンテナには、効率、タイプ、基本タイプを格納する機能の3つの違いがあります。Javaでは、配列はオブジェクトのシーケンスを格納してランダムにアクセスする最も効率的な方法です。配列は単純な線形シーケンスです。要素へのアクセスが非常に高速になりますが、この速度に対して支払われる代償は、配列オブジェクトのサイズが固定されており、そのライフサイクルが不変であるということです。配列がジェネリックスのようなコンテナーよりも優れている理由は、特定の型を保持する配列を作成できるためです。つまり、コンパイラーでチェックして、エラーメッセージの挿入や不適切な型の抽出を防ぐことができます。
では、なぜ配列を定義するのでしょうか。
100個の整数変数を定義します。構造は次のとおりです。
int i1, i2, i3, ... i100;
これらの変数は相互に関連していないため、この定義方法は非常に面倒です。これらの100個の変数の内容を出力する場合は、System.out.println()
ステートメントを作成する100
か、forループを使用して100回出力する必要があります。
実際、配列は関連するタイプの変数のセットを参照し、これらの変数は均一な方法、つまり同じデータタイプのセットで操作できます。このようにして、データを保存してデータの追加、削除を実現します。 、変更、およびチェック。配列自体は参照データ型です。
(1)アレイの概要
配列(配列)は、特定の順序で配置され、名前が付けられた同じタイプの複数のデータのコレクションであり、番号付けによってこれらのデータを統合管理します。配列で一般的に使用される概念には、配列名、添え字、要素、および配列の長さが含まれます。
- 配列自体は参照データ型であり、配列内の要素は、基本データ型や参照データ型を含む任意のデータ型にすることができます。
- 配列オブジェクトを作成すると、メモリ内の連続スペース全体が開きます。配列名は、この連続スペースの最初のアドレスを参照します。
- 配列の長さが決定されると、それを変更することはできません。
- 添え字(またはインデックス)を使用して、指定した位置にある要素を直接呼び出すことができます。これは非常に高速です。
- 配列の分類:次元による:1次元配列、2次元配列、3次元配列、...;要素のデータ型による:基本データ型要素の配列、参照データの配列型要素(つまり、オブジェクトの配列)
配列を宣言するには、静的初期化と静的初期化の2つの方法があります。
配列の静的初期化:
- データ型[]配列名=
new
データ型[] {要素1、要素2、要素3、...};などint [] sa = new int [] {1,2.3};
配列の動的初期化:
- 配列を宣言して開きます。
- データ型[]配列名=
new
データ型[長さ]; int [] a = new int [5]など。 - データ型配列名[] =
new
データ型[長さ]; int a [] = new int [4]など。
- データ型[]配列名=
次に、配列がスペースを開くときに、次の操作を使用できます。
- 配列へのアクセスは、インデックス、つまりa [2]などの「配列名[インデックス]」によって完了します。配列のインデックスは
0
最初から始まり、インデックスの範囲は0
〜配列の長さ-1
、たとえば3
、スペースの配列が開かれているため、使用できます。インデックスは次のとおりです。0,1,2、この時点でアクセスが配列のインデックス範囲を超えると、java.lang.ArrayIndexOutOfBoundsException
例外メッセージが生成されます。 - 配列が動的初期化を使用してスペースを開く場合、配列内の各要素は、配列の対応するデータ型のデフォルト値であり、各データ型には独自のデフォルト値があります。
- 配列自体は順序集合操作であるため、配列の内容の操作はループモードで行われることがよくあります。配列は限られたデータセットであるため、
for
ループを使用する必要があります 。 Java
配列名.LENGTH:によって達成ダイナミックアレイの長さであって
public class ArrayDemo {
public static void main(String args[]) {
int data[] = new int[3]; /*开辟了一个长度为3的数组*/
data[0] = 10; // 第一个元素
data[1] = 20; // 第二个元素
data[2] = 30; // 第三个元素
for(int x = 0; x < data.length; x++) {
System.out.println(data[x]); //通过循环控制索引
}
}
}
/*
输出结果为
10
20
30
*/
(2)一次元配列
1次元配列は、同じデータ型で構成されるデータのコレクションです。次の図に示すように、1次元データで構成されています。
(1)声明
1次元配列を宣言するには、var []型またはtype [] var型、たとえばint a [];またはint [] a;の2つの方法があります。
(2)初期化
初期化には、動的初期化と静的初期化の2つの方法があります。
- 動的初期化:配列宣言の操作と配列要素へのスペースの割り当ておよび割り当ては別々に実行されます
- 静的初期化:配列を定義するときは、スペースを割り当て、配列要素に値を割り当てます。
(3)参考
- new演算子を定義して使用し、スペースを割り当てた後、配列内の各要素を参照できます。
- 配列要素の参照方法:配列名[配列要素の添え字]
- 配列要素のインデックスは、整数定数または整数式にすることができます。a [3]、b [i]、c [6 * i]など。
- 配列要素の添え字は0から始まります;長さnの配列の有効な添え字値の範囲:0 —> n-1;たとえば、int a [] = new int [3];参照できる配列要素a [0]、a [1]、a [2]です
- 各配列には、その長さを示す属性の長さがあります。次に例を示します。a.lengthは、配列の長さを示しますa(要素の数)
- 配列が初期化されると、その長さは不変になります
(4)デフォルトの初期化値
配列は参照型であり、その要素はクラスのメンバー変数と同等です。したがって、配列にスペースが割り当てられると、その中の各要素はメンバー変数と同じ方法で暗黙的に初期化されます。次のプログラムでは、a [3]のデフォルトの初期化アドレスは0です。
public class Test {
public static void main(String argv[]){
int a[]= new int[5];
System.out.println(a[3]); //a[3]的默认值为0
}
}
一般的に、他のデータ型のデフォルト値は次のとおりです:
(5)メモリ分析
Javaのjvmメモリの簡略図は次のとおりです。
次に、次のプログラムの場合、実行中のプロセスは次のとおりです。
package strings;
/**
* Created with IntelliJ IDEA.
* User: yongping Li
* Date: 2020/11/14
* Time: 15:10
* Description: No Description
*/
public class Test{
public static void main(String args[]){
int[] s;
s = new int[10];
for ( int i=0; i<10; i++ ) {
s[i] =2*i+1;
System.out.println(s[i]);
}
}
}
at int [] s; at s = new int [10]; at s [i] = 2 * i + 1;:
次のプログラムの場合、そのメモリ分析は次のとおりです。
public class ArrayDemo {
public static void main(String args[]) {
int data[] = null;
data = new int[3]; //开辟一个长度为3的数组
int temp[] = null; //声明对象
data[0] = 10;
data[1] = 20;
data[2] = 30;
temp = data; //int temp[] = data;
temp[0] = 99;
for(int i = 0; i < temp.length; i++) {
System.out.println(data[i]);
}
}
}
メモリ分析:
int[] arr1 = new int[4];
arr1[0] = 10;
arr1[2] = 20;
String[] arr2 = new String[3];
arr2[1] = “刘杰”;
arr2 = new String[5];
メモリ分析:
int[] arr = new int[]{1,2,3};
String[] arr1 = new String[4];
arr1[1] = “刘德华”;
arr1[2] = “张学友”;
arr1 = new String[3];
sysout(arr1[1]);//null
メモリ分析:
1次元配列プログラムのコード例:
package arrays;//: arrays/ArrayOptions.java
// Initialization & re-assignment of arrays.
import java.util.*;
public class ArrayOptions {
public static void main(String[] args) {
// Arrays of objects:
BerylliumSphere[] a; // Local uninitialized variable
BerylliumSphere[] b = new BerylliumSphere[5];
// The references inside the array are
// automatically initialized to null:
System.out.println("b: " + Arrays.toString(b));
BerylliumSphere[] c = new BerylliumSphere[4];
for(int i = 0; i < c.length; i++)
if(c[i] == null) // Can test for null reference
c[i] = new BerylliumSphere();
// Aggregate initialization:
BerylliumSphere[] d = { new BerylliumSphere(),
new BerylliumSphere(), new BerylliumSphere()
};
// Dynamic aggregate initialization:
a = new BerylliumSphere[]{
new BerylliumSphere(), new BerylliumSphere(),
};
// (Trailing comma is optional in both cases)
System.out.println("a.length = " + a.length);
System.out.println("b.length = " + b.length);
System.out.println("c.length = " + c.length);
System.out.println("d.length = " + d.length);
a = d;
System.out.println("a.length = " + a.length);
// Arrays of primitives:
int[] e; // Null reference
int[] f = new int[5];
// The primitives inside the array are
// automatically initialized to zero:
System.out.println("f: " + Arrays.toString(f));
int[] g = new int[4];
for(int i = 0; i < g.length; i++)
g[i] = i*i;
int[] h = { 11, 47, 93 };
// Compile error: variable e not initialized:
//!print("e.length = " + e.length);
System.out.println("f.length = " + f.length);
System.out.println("g.length = " + g.length);
System.out.println("h.length = " + h.length);
e = h;
System.out.println("e.length = " + e.length);
e = new int[]{ 1, 2 };
System.out.println("e.length = " + e.length);
}
} /* Output:
b: [null, null, null, null, null]
a.length = 2
b.length = 5
c.length = 4
d.length = 3
a.length = 3
f: [0, 0, 0, 0, 0]
f.length = 5
g.length = 4
h.length = 3
e.length = 3
e.length = 2
*///:~
操作の結果は次のとおりです。
(3)2次元配列
次の図に示すように、1次元配列はデータの行と見なすことができます。
以下に示すように、2次元配列はリストと見なすことができます。
したがって、2次元配列は、2つの1次元配列の組み合わせと見なすことができます。
(1)宣言と初期化
2次元配列の初期化:
- 配列の動的初期化:データ型オブジェクト配列[] [] =新しいデータ型[行数] [列数];
- 配列の静的初期化:データ型オブジェクト配列[] [] =新しいデータ型[行数] [列数] { {値、値、…}、{値、値、…}、…};
(2)メモリ分析
JAVAの各次元の配列モデルを理解する