Java基盤 - アレイ


アレイは、多くの場合、割り当てと配列要素の抽出された配列要素を含む配列要素の配列要素にインデックスを付けることによってアクセスすることができる最も一般的なプログラミング言語、複数のデータを格納するためのデータ構造です。

知人配列

  • 配列は、参照データ型に属するタイプです。
  • 配列要素のタイプは、データの一つのタイプを格納することができる唯一の配列です。
  • 配列の長さが固定され、単一の初期の配列が完了し、すなわち、空間は、メモリアレイによって占有が固定される、長さが変化していない場合でも、依然として予約領域によって占有されている空配列の要素。

配列の初期化

定義された配列変数

Javaのは、2つの配列構文を定義しサポートしています。

type[] arr;
type arr[];

両方のために、定義により、典型的には変数名を最初の良好セマンティクスがあるので、第二の配列最初の形式を使用して定義され、容易に混乱

初期化

Java配列の初期化は、いわゆる初期化を使用する必要がされた後にのみ、メモリ空間は、アレイの要素のために割り当てられた。そして、各配列要素の初期値を割り当てられます。

静的初期化

オリジナルのプログラマにより、各アレイの初期値は、配列の長さを表示指定は、システムによって決定される
静的初期化構文です。

type[] arr = new type[]{item1, item2, item3,...};

typeデータ型の配列要素は、配列要素のタイプは、必要がありますtype入力するか、子クラスのインスタンス。
また、以下の簡略化され、静的初期化構文があります。

type[] arr = {item1, item2, item3 ...};

動的な初期化

動的な初期化のみ配列の長さを指定し、システムによって指定された各要素の初期値は、動的な初期化構文は次の通りであります:

type[] arr = new type[length];

INT長パラメータのタイプを指定する必要があり、上記の構文、このパラメータは、配列の長さを指定する。
動的な初期化を行う場合の長さの初期値のみがプログラマによって指定され、以下のように、アレイのアレイ素子は、システムによって自動的に割り当てられます

  • 配列要素型は基本型の整数型の値(バイト、ショート、整数、長)である、配列要素は0です。
  • 配列要素型は、浮動小数点型(float型、ダブル)の基本的なタイプ、配列要素の値は0.0です。
  • 配列要素型は文字型(CHAR)、配列要素の値が「\ U0000」での基本型です。
  • 配列要素のタイプは、ブール(Boolean)を基本タイプ、配列の要素の値がfalseです。
  • 配列要素型参照型(クラス、インタフェース、配列)、配列要素値がnullです。

アクセスアレイ

最も一般的な方法は、アレイ素子と割り当て抽出アレイエレメントを含むアレイ・アクセス・アレイ要素です。

リード配列要素の割り当て

int[] arr = {1,2,3};
// 数组取值 通过 arr[index] 访问 
int a = arr[0];
// arr 为{1,3,3}
arr[1] = 3

指定された配列要素のインデックス値へのアクセスは、プログラムのコンパイル時エラーなしで、配列の長さに等しいが、例外ランタイムまたは未満0以上であればjava.lang.ArrayIndexOutOfBoundsException:N(配列境界例外)は、N配列インデックスがアクセスしようとしています。

反復

for 循環

int[] arr = new int[5];
// 输出 5 个 0
for(int i = 0; i < arr.length; i++){
    System.out.println(arr[i])
}
arr[1] = 1;
arr[2 = 2;
// 输出 0 1 2 0 0
for(int i = 0; i < arr.length; i++){
    System.out.println(arr[i])
}

出力コードは0〜5の最初のサイクル上、デフォルト初期化ARRアレイが実行されるため、配列の要素がint型、ゼロの要素を初期化するために割り当てられたint型アレイシステムです。

foreach循環

:Java5の後、Javaはより単純なループ提供しforeach循环、より便利配列とコレクションをこのループを。

for (type item : array|collection){
    // 
}

使用foreachサイクル注:

int[] arr = {1, 2, 3, 4, 5};
for (int item: arr){
    System.out.println(item);
    item = 0;
    System.out.println(item);
}
System.out.println(arr[0]);

例えば、プログラム出力

1
0
2
0
3
0
4
0
5
0
1

結果は、出力からわかるようにforeach、正しくアレー素子を通過しないで、その結果、アレイ素子サイクルの割り当てを。ための配列要素の値の変化が実際に、ループ内の配列要素を変更しないように同時にforeachループ変数の等価一時変数、それだけ注意を払うので、配列要素の値を保存し、システムに一度配列要素が一時変数に割り当てられますが、これは一時的な変数の配列要素ではありません。: 如果希望改变数组元素的值,则不能使用这种 foreach 循环

アレイの深い理解

JDK Array

で表示JavaソースコードArrayのクラスは、それは見ることができfinal class、次のようである方法であって、
配列

Arrayクラスは基本的getXXおよびsetXX方法、
およびすべてのあるnative方法を用いて、nativeこの方法のキーワードについて、あること、この方法を使用する主な関数であるC/C++私達ができるので、Javaのを呼び出すために、言語、およびDLLとしてコンパイルはそれはクラスではなく、ジャワの一部にローカルコンピュータ実装方法アレイと理解されます。

分散メモリアレイ

アレイは、アレイ素子が配列参照変数のヒープメモリに格納されているスタックメモリ内の参照データ型であり、連続的に格納される。これは、配列の要素への迅速なアクセスのためのものであるためだけ移動指数(算出された内部の物理アドレスは:数组起始地址+index * 元素size大小)非常に高速なO(1)である、アクセスすることができます。

Javaメモリー・モデルでは、オブジェクトがスタックアレイ(ヒープ)メモリに格納されている、変数を配列参照オブジェクトは、以下に示すように、それはメモリ内のスタック(スタック)に格納され、ローカル変数である場合:
分散メモリアレイ

プログラム内の図のメモリアレイ素子のスタックにアクセスする場合にのみ、基本アレイモードアクセスメモリアレイ素子参照変数のスタックであるP [インデックス]の形式により達成することができる。
既存の次のコード

// 定义并静态初始化数组
int[] a = {5, 7, 20};
// 定义数组,使用动态初始化
int[] b = new int[4];
System.out.println("b 数组的长度为: " + b.length);
// 循环输出 a 数组的元素
for (int i = 0, len = a.length; i < len; i++ ){
    System.out.println(a[i]);
}
// 循环输出 b 数组的元素
for (int i = 0, len = b.length; i < len; i++ ){
    System.out.println(b[i]);
}
// 将 a 的值赋给 b,即将 b 的引用指向 a 引用指向的数组
b = a;
// 再次输出 b 数组的长度
System.out.println("b 数组的长度为: " + b.length);

例えば、実行コード最初の出力長さbは4であり、そしてその要素の、Bを出力し、その後、出力長さbは3配列の長さであり、実際には、これは錯覚可変表示されているであろう。
上の例コードメモリ分析:

  1. 、Bのアレイを初期化する、4つのメモリ領域、3の長さによって参照されるオブジェクトのアレイは、アレイの長さをB 4参照される実際のスタック配列オブジェクト参照変数a、bおよびスタックで生成されます。
    分散メモリアレイ

  2. プログラム実行b = a値bを代入するシステムの動作は、アレイのメモリアドレスは、オブジェクトへの参照をBに割り当てられについて、この時点でBはオブジェクトの基準アレイのメモリアドレスです。
    分散メモリアレイ

上記から分かるように、プログラムの実行b = a、任意の長さの前にオブジェクト参照配列bの後に変更されていない、bの値は、配列Bの長さは、配列Aの長さである場合には、基準配列オブジェクトのアドレスを、となります3。

メモリアレイ要素が連続的であることに注意してください、手段

  1. 配列要素がプリミティブ型である場合、その値は、プリミティブ型の配列要素に格納され、それらが行に格納されています
  2. 配列要素がオブジェクトである場合、配列要素が格納されている参考文献は、配列要素が行に格納され、オブジェクト参照は、別の場所であってもよく、及び配列要素は連続していないこと、離れてもよいです。

多次元配列

Javaは、多次元配列の構文サポートを提供するが、アレイの基礎となる操作機構の観点から、何多次元配列は存在しない。
多次元アレイの属性構文を

type[][] arr = new type[length1][length2]

length2それは、動的に作成することができる
二次元アレイは、本質的に各要素は一次元アレイであるアレイである。ようにlength2与えられた値、一次元アレイを初期化する各要素はの長さであるlength2一次元アレイそのメモリモデル:
メモリ分布の二次元アレイ

おすすめ

転載: www.cnblogs.com/41uLove/p/12571808.html