1. 程式人生 > 其它 >Java學習筆記(七):陣列

Java學習筆記(七):陣列

為什麼需要陣列?

有時候需要儲存或處理一系列資料,陣列就可以充當這樣的角色,它在記憶體中是相連的資料,並且在棧中的引用只有一個,如果不用陣列,那資料就得一個一個定義一個一個宣告,浪費記憶體空間,顯然不合理。

什麼是陣列?

陣列可以存放多個同一型別的資料。陣列也是一種資料型別,是引用型別。 即:數(資料)組(一組)就是一組資料

Java的陣列要求所有的陣列元素具有相同的資料型別。因此,在一個數組中,陣列元素的型別是唯一的,即一個數組裡只能儲存一種資料型別的資料,而不能儲存多種資料型別的資料

陣列本身是一個引用資料型別,陣列記憶體儲的型別可以是基本型別 也可以是引用型別

總結:

①陣列是一個引用資料型別

②陣列是在堆記憶體中的一串連續的地址存在

③陣列在初始化時必須指定長度

⑤堆記憶體的陣列長度一旦確定 不能再次發生改變

⑥棧記憶體的變數中儲存的是陣列的地址引用

⑦陣列內部儲存的型別可以是基本的 也可一是引用

陣列的特點:

(1)陣列是一個物件,是一種引用資料型別。可以表示一組資料的集合。
(2)陣列只能儲存一種型別的資料。
(3)陣列可以使用 new 關鍵字 進行初始化。
(4)陣列中的每一個數據稱為 元素 element。元素是在堆記憶體中分配的。而且是連續分配的。
(5)陣列的每一個元素都有一個序號,專業的稱謂:下標、索引、角標。下標是從0開始的、升序的、連續的、0序的。
(6)陣列有一個屬性:長度的屬性,表示陣列中元素的個數 該屬性是 int 型別。 通過 陣列名.length 來訪問該屬性。
(7)陣列中元素的下標的取值範圍是:[0~length-1]。
(8)通過new 關鍵字 在堆記憶體中元素被分配空間之後。每個元素被jvm 賦予預設值。
預設值規則:整數:0 浮點數:0.0 char:’\u0000’ boolean:false 引用資料型別:null。
(9)陣列的每個元素通過 陣列名[下標] 來訪問。每個元素都是一個變數。和變數的用法一致。
(10)陣列變數、陣列引用 儲存的是 陣列的實際元素的在堆記憶體中的"首地址"。
(11)[ ] 代表的是 陣列這種型別。
(12)求下標是 n 的元素的地址:首地址+元素位元組數*n。 陣列根據下標訪問元素的效率非常快。(隨機訪問)。
(13)陣列的長度可以是 0,但是不能是 負數。
(14)陣列的長度一旦確定,就不能更改了。陣列是定長的。

陣列的宣告和建立:

1.首先必須宣告陣列變數,才能在程式中使用陣列。

資料型別[] 變數名;//強烈建議用這種命名

資料型別 變數名[];//只要知道就可以,c、c++是這種寫法,要區分開來

2.Java語言使用new操作符來建立陣列,語法如下:

dataType[] arrayRefVar = new dataType[arraySize];

3.陣列的元素是通過索引訪問的,陣列索引從0開始

4.獲取陣列長度的方法:arrays.length

//宣告一個數組
int[] nums;
//建立一個數組
nums = new int[10];
//給陣列元素中賦值
nums[0]=1;
nums[1]=2;
nums[
2]=3; nums[3]=4; System.out.println(nums.length);

陣列快速入門(案例分析)

/*
它們的體重分別是 3kg,5kg,1kg,3.4kg,2kg,50kg 。 
請問這六隻雞的總體重是多少?平均體重是多少?

*/

public class Array01 {


//編寫一個 main 方法
public static void main(String[] args) {


// double hen1 = 3;
// double hen2 = 5;
// double hen3 = 1;
// double hen4 = 3.4;
// double hen5 = 2;
// double hen6 = 50;
// double totalWeight = hen1 + hen2 + hen3 + hen4 + hen5 + hen6;
// double avgWeight = totalWeight / 6;
// System.out.println("總體重=" + totalWeight + "平均體重=" + avgWeight);


//比如,我們可以用陣列來解決上一個問題 => 體驗
//
//定義一個數組
//解讀
//1. double[]  表示 是 double 型別的陣列, 陣列名 hens
//2. {3, 5, 1, 3.4, 2, 50} 表示陣列的值/元素,依次表示陣列的
//    第幾個元素
//
double[] hens = {3, 5, 1, 3.4, 2, 50, 7.8, 88.8,1.1,5.6,100};


//遍歷陣列得到陣列的所有元素的和, 使用 for
//解讀
//1.  我們可以通過 hens[下標] 來訪問陣列的元素
//    下標是從 0  開始編號的比如第一個元素就是 hens[0]
//    第 2 個元素就是 hens[1]    , 依次類推
//2.  通過 for 就可以迴圈的訪問 陣列的元素/值
//3.  使用一個變數 totalWeight  將各個元素累積
System.out.println("===使用陣列解決===");
//提示: 可以通過 陣列名.length 得到陣列的大小/長度
//System.out.println("陣列的長度=" + hens.length); 
double totalWeight = 0;
    for( int i = 0; i < hens.length; i++) {
//System.out.println("第" + (i+1) + "個元素的值=" + hens[i]); 

        totalWeight += hens[i];
}    


System.out.println("總體重=" + totalWeight + "平均體重=" + (totalWeight / hens.length) );






}
}

陣列的使用

使用方式 1-動態初始化:

動態初始化:初始化時程式設計師只指定陣列長度,由系統為陣列元素分配初始值

簡單的來講動態初始化就是指定長度

執行動態初始化時,程式設計師只需指定陣列長度,即為每個陣列元素指定所需的記憶體空間,系統將負責為這些陣列元素分配初始值。

使用方式 2-動態初始化:

先宣告陣列
語法:資料型別 陣列名[]; 也可以 資料型別[] 陣列名;

int a[];  或者 int[] a;

建立陣列
語法: 陣列名=new 資料型別[大小];

a=new int[10];

使用方式 3-靜態初始化:

靜態初始化:初始化時由程程式設計師顯示指定每個陣列元素的初始值,由系統決定陣列長度

簡單的來講靜態初始化就是指定內容

靜態初始化就是將陣列的元素放到大括號中,元素之間用逗號(,)分隔

陣列使用注意事項和細節:

(1) 陣列是多個相同型別資料的組合,實現對這些資料的統一管理

(2) 陣列中的元素可以是任何資料型別,包括基本型別和引用型別,但是不能混用。

(3) 陣列建立後,如果沒有賦值,有預設值
int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null

(4) 使用陣列的步驟 1. 宣告陣列並開闢空間 2 給陣列各個元素賦值 3 使用陣列

(5) 陣列的下標是從 0 開始的。

(6) 陣列下標必須在指定範圍內使用,否則報:下標越界異常,比如int [] arr=new int[5]; 則有效下標為 0-4

(7) 陣列屬引用型別,陣列型資料是物件(object)

案例分析:

//請求出一個數組 int[]的最大值 {4,-1,9, 10,23},並得到對應的下標
public class ArrayExercise02 {
public static void main(String[] args) {

int[] arr = {4,-1,9,10,23};

int max = arr[0];//假定第一個元素就是最大值 

int maxIndex = 0; 

    for(int i = 1; i < arr.length; i++) {//從下標 1  開始遍歷 arr

        if(max < arr[i]) {//如果 max < 當前元素
            max = arr[i]; //把 max  設定成 當前元素
            maxIndex = i;
            }
        }
//當我們遍歷這個陣列 arr 後 , max 就是真正的最大值,maxIndex 最大值下標

System.out.println("max=" + max + " maxIndex=" + maxIndex);
}
}

陣列拷貝

編寫程式碼 實現陣列拷貝(內容複製)

//將 int[] arr1 = {10,20,30};  拷貝到 arr2 陣列,
//要求資料空間是獨立的. int[] arr1 = {10,20,30};
//建立一個新的陣列 arr2,開闢新的資料空間
public class ArrayCopy {
public static void main(String[] args) {

int[] arr2 = new int[arr1.length];//大小 arr1.length;


    for(int i = 0; i < arr1.length; i++) { //遍歷 arr1 ,把每個元素拷貝到 arr2 對應的元素位置
        arr2[i] = arr1[i];
    }



arr2[0] = 100;//修改 arr2, 不會對 arr1 有影響. 


System.out.println("====arr1 的元素===="); //輸出 arr1
    for(int i = 0; i < arr1.length; i++) {
        System.out.println(arr1[i]);//10,20,30
        }

System.out.println("====arr2 的元素===="); 
    for(int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);//
        }


}
}

陣列反轉

把陣列的元素內容反轉。

//要求:把陣列的元素內容反轉。 
//arr    {11,22,33,44,55,66}    -->{66, 55,44,33,22,11}
public class ArrayReverse {
public static void main(String[] args) {

int[] arr = {11, 22, 33, 44, 55, 66};//定義陣列
int temp = 0;
int len = arr.length; //計算陣列的長度 

    for( int i = 0; i < len / 2; i++) {
            temp = arr[len - 1 - i];//儲存
            arr[len - 1 - i] = arr[i]; 
            arr[i] = temp;
            }


System.out.println("===翻轉後陣列==="); 
    for(int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + "\t");//66,55,44,33,22,11
        }
}
}

陣列新增/擴容/縮減

實現動態的給陣列新增元素效果,實現對陣列擴容。

/* 要求:實現動態的給陣列新增元素效果,實現對陣列擴容。
1.原始陣列使用靜態分配 int[] arr = {1,2,3}
2.增加的元素 4,直接放在陣列的最後 arr = {1,2,3,4}
3.使用者可以通過如下方法來決定是否繼續新增,新增成功,是否繼續?y/n
*/
import java.util.Scanner;
public class ArrayAdd02 {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);

int[] arr = {1,2,3};//初始化陣列

    do {
        int[] arrNew = new int[arr.length + 1];
        //遍歷 arr 陣列,依次將 arr 的元素拷貝到 arrNew 陣列
        
        for(int i = 0; i < arr.length; i++) { 
            arrNew[i] = arr[i];
            }
        
        System.out.println("請輸入你要新增的元素"); 
        int addNum = myScanner.nextInt();
        //把 addNum 賦給 arrNew 最後一個元素
        arrNew[arrNew.length - 1] = addNum;
        //讓 arr 指向 arrNew, 
        arr = arrNew;
        //輸出 arr 看看效果
        System.out.println("====arr 擴容後元素情況===="); 
            
              for(int i = 0; i < arr.length; i++) {
                    System.out.print(arr[i] + "\t");
                        }
        //問使用者是否繼續 
        System.out.println("是否繼續新增 y/n"); 
        char key = myScanner.next().charAt(0);

            if( key == 'n') { //如果輸入 n ,就結束 
                break;    
                }
        }while(true);

System.out.println("你退出了新增...");
}
}

陣列的縮減和新增原理相同就不舉例說明了

本文來自部落格園,作者:我怎麼哭了,轉載請註明原文連結:https://www.cnblogs.com/long99/p/15177252.html