1. 程式人生 > 其它 >java---陣列(重點概念)

java---陣列(重點概念)

一、什麼是陣列

  • 程式=演算法+資料結構
  • 資料結構:把資料按照某種特定的結構儲存,設計一個合理的資料是解決問題的關鍵;
  • 陣列:是一種用於儲存多個相同型別資料型別 的儲存模型;
  • 陣列的特定結構:相同型別組成元素集合
  • 通過氧元素的下標進行訪問,切下標從0開始,最大元素下標為[陣列長度-1];

二、陣列的定義:

宣告陣列:

  • 資料型別[] 變數名:int[] arr:定義了一個int型別的陣列,陣列名為arr,推薦使用這種
  • 資料型別 變數名[]:int arr[]:定義了一個int型別的變數,變數名為arr陣列

舉例:

int [] i=new int[5];//長度為5;
含義:
    int:陣列的元素型別必須為int
    i:陣列的名稱
    
new:建立了一個數組物件 5:陣列的長度 1、初始值為int的預設值 2、元素為{0,0,0,0,0}

三、陣列的初始化之動態初始化

1、陣列初始化概述:

  • java中的陣列必須先初始化後,才能使用;
  • 所謂初始化:就是為陣列中的陣列元素分配記憶體空間,併為每個陣列元素賦值

2、陣列初始化方式:

  • 動態初始化
  • 靜態初始化

3、動態初始化

  • 就是初始化時只指定陣列長度,由系統為陣列分配初始值;
  • 格式:
**資料型別[]  變數名 = new 資料型別[陣列長度];**

- int[] arr=new int[3];

4、三種初始化方式:

int[] i=new int
[5];//長度為5;
int[] i=new int[]{0,1,2,3,4};//長度即為元素個數
int[] i={1,2,3,4,5};//直接初始化元素,長度為元素的個數
1、這種寫法只能再宣告時對其初始化不能用於賦值
2、int[] arr;arr={1,2,34,4};編譯錯誤
3、對於陣列的賦值只能對其元素進行賦值,不能對陣列定義直接賦值
4、可以採用第二種方式先用new關鍵字建立空間,再賦值arr=new[]{1,2,34,4}

四、陣列的訪問

陣列變數訪問方式:陣列名

陣列內部儲存的資料的訪問方式:陣列名[索引]

索引是陣列中資料的編導方式

作用:索引用於訪問陣列中的資料使用,陣列名[索引]等同於變數名,是一種特殊的變數名

特徵:

  • 索引從0開始;
  • 索引是連續的;
  • 索引逐一增加,每次加1

1、foreach:

for (型別名 變數名:陣列名或集合名){

​            迴圈體;

}

2、引用型別:

  • 引用型別變數:一段空間,物件的起始地址;
  • 引用型別物件:一段空間,儲存資料;
  • 引用型別變數=new ***();

3、二維陣列:

本質就是一維陣列;

陣列中的元素的型別是一維陣列型別;

變數:型別名[] 變數名;

物件:new  型別名整形表式;

五、記憶體分配:

1、java中記憶體分配:

java程式在執行時,需要在記憶體中分配空間,為了提高運算效率,就對空間進行了不同區域的劃分;

因為每一片區域都有特定的處理資料方式和記憶體管理方式

  • 整形:初始值為0;
  • 浮點數:初始值為0.0;
  • 字元型:空字元;
  • 布林型:初始值為false;
  • 引用資料型別:預設值為null

2、棧記憶體:儲存區域性變數

定義在方法中的變數,例如:arr,使用完畢,立即消失

3、堆記憶體:儲存new出來的內容(實體,物件)

陣列在初始化時,會為儲存空間新增預設值

每一個new出來的東西都有一個地址值,使用完畢,會在垃圾回收器空閒時被回收

4、陣列記憶體圖(多個數組指向相同)

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@1540e19d
100
200
300
[I@1540e19d
111
[I@1540e19d
111

六、陣列初始化之靜態初始化

  • 靜態初始化:初始化時指定每個陣列元素的初始值,由系統決定陣列長度;
  • 格式:資料型別[] 變數名=new 資料型別[]{資料1,資料2,資料3,........}
  • 簡化格式:資料型別[] 變數名={資料1,資料2,資料3..........}

舉例:

 int[] arr={1,2,3,4};
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
結果:
    [I@1540e19d
1
2
3

七、陣列操作的兩個常見小問題:

1、索引越界:訪問了陣列中不存在的索引對於的元素,造成索引越界問題;

2、空指標異常:訪問了陣列已經不再指向堆記憶體的資料,造成空指標異常。

null:空值,引用資料型別的預設值,表示不指向任何有效物件

 int[] arr=new int[3];
        System.out.println(arr[3]); 

異常:

ArrayIndexOutOfBoundsException:陣列索引越界異常

NullPointerException:空指標異常

int[] arr=new int[3];
//        System.out.println(arr[3]);
        arr=null;
        System.out.println(arr[0]);

八、陣列常見操作:

1、獲取陣列元素的數量(.length):

int[] a=new int[]{4,6,7,8};
int len=a.length;//陣列的length屬性
System.out.println(len);//4

2、通過下標訪問陣列元素:

public class Numberjihe {
    public static void main(String[] args) {
        int[] b = { 4, 6, 9, 8, 7 };// b[0]----b[4]
        // 0,獲取最後一位元素值
        System.out.println(b[b.length - 1]);// 7
        System.out.println("---------");
        // 1、獲取元素下標為奇數的元素
        // 迴圈問題 條件:陣列的長度 變數:第一個元素 改變條件:%2==1
        for (int i = 0; i < b.length; i++) {
            if (i % 2 == 1) {
                System.out.println(b[i]);
            }
        }
        // 2、交換元素下標為2和3的元素位置
        int temp = b[2];
        b[2] = b[3];
        b[3] = temp;
        System.out.println(b[2]);
        System.out.println(b[3]);
    }
}

3、獲取最值:

思路:

1、定義一個變數,用於儲存最大值(或最小值);-------------------int max;

2、取陣列中第一個資料作為變數的初始值;-----------------------------int max=arr[0];

3、與陣列中剩餘的資料逐個比對,每次比對將最大值儲存到變數中;------

for(int x=1;x<arr.length;x++){

if(arr[x]>max){

max=arr[x];

}

}

4、迴圈結束後列印變數的值

System,out.println(max);

九、遍歷陣列元素:

1、基本for迴圈

public class Number3 {
    public static void main(String[] args) {
        int[] a2 = new [] { 3, 6, 7, 9 };
        // 基本for迴圈
        for (int i = 0; i < a2.length; i++) {
            System.out.println(a2[i] + "");
        }
        // jdk1.8提供了增強for迴圈
        for (int i : a2) {
            System.out.println(i + "");

        }
    }
}

2、增強for迴圈

// jdk1.8提供了增強for迴圈
        for (int i : a2) {
            System.out.println(i + "");

        }

十、陣列的複製:

1、System.arrayCopy()方法:

public static void arrayCopy(Object src,int srcPos,Object dest,int desPos,int length)
  • src:元陣列
  • srcPos:原陣列的起始位置
  • dest:目標陣列
  • destPos:目標陣列的起始位置
  • length:複製的長度
int[] c1 = {10,30,65,45}; 
int[] c2 = new int[4]; 
System.arraycopy(c1, 1, c2, 0, 3); System.out.println(Arrays.toString(c2));

如果目標陣列小於需要copy的長度時會報出ArraysIndexOutOfBoundsException

2、Arrays.copyOf()方法:

java.util.Arrays類實現了陣列複製的方法Arrays.copyOf(型別[] src,int length)
  • src:原陣列
  • length:複製的長度
int[] c1 = {10,30,65,45}; 
System.out.println("s:" + c1.length); 
c1 = Arrays.copyOf(c1, 3); System.out.println(Arrays.toString(c1));//擷取 System.out.println("t:" + c1.length);

結論:

  • 當複製的長度小於新陣列,則擷取;
  • 當複製的長度大於新陣列,則擴容;
  • copyof方法使用時原陣列長度變化的原因:
  1. 原陣列長度不變;
  2. 原始碼中可以看出建立一個新陣列使用

 

 十一、陣列的排序:

1、陣列的排序:

  • 排序是最常見的演算法之一;
  • 排序:將陣列元素按照從小到大或者從大到小的順序排列
  • 常見的排序演算法:氣泡排序,選擇排序,插入排序,希爾排序,快速排序,歸併排序等等

2、氣泡排序:

演算法核心:比較相鄰兩個元素,將較大的元素互換

System.out.println("請輸入產生陣列的長度:");
        Scanner scanner = new Scanner(System.in);
        int length = scanner.nextInt();
        System.out.println("請輸入你要產生的陣列元素的範圍:");
        int location = scanner.nextInt();
        int[] arr = new int[length];
        for (int i = 0; i < arr.length; i++) {
            Random random = new Random();
            arr[i] = random.nextInt(location);
        }
        System.out.println("排序前:" + Arrays.toString(arr));
        // 氣泡排序
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[i];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;

                }
            }

        }
        System.out.println("排序後:" + Arrays.toString(arr));
    }
}
  • Arrays.sort()方法

System.out.println("排序前:" + Arrays.toString(arr)); //氣泡排序 
Arrays.sort(arr); 
System.out.println("排序後:" + Arrays.toString(arr));
  • sort()方法原理