記事の配列を改善するJava(1)

 

目次

(ゼロ)配列が特別なのはなぜですか?

(1)アレイの概要

(2)一次元配列

(3)2次元配列

JAVAの各次元の配列モデルを理解する


最近、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の各次元の配列モデルを理解する

 

 

おすすめ

転載: blog.csdn.net/weixin_41792162/article/details/109692597