溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中數(shù)組定義和使用實(shí)例分析

發(fā)布時(shí)間:2022-07-11 13:45:40 來(lái)源:億速云 閱讀:101 作者:iii 欄目:編程語(yǔ)言

這篇“Java中數(shù)組定義和使用實(shí)例分析”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Java中數(shù)組定義和使用實(shí)例分析”文章吧。

Java中數(shù)組定義和使用實(shí)例分析

一維數(shù)組

Java語(yǔ)言中的數(shù)組是一種引用數(shù)據(jù)類型;不屬于基本數(shù)據(jù)類型;數(shù)組的父類是Object。
數(shù)組實(shí)際上是一個(gè)容器,可以同時(shí)容納多個(gè)元素。(數(shù)組是一個(gè)數(shù)據(jù)的集合)
    數(shù)組:字面意思是“一組數(shù)據(jù)”
數(shù)組當(dāng)中可以存儲(chǔ)“基本數(shù)據(jù)類型”的數(shù)據(jù),也可以存儲(chǔ)“引用數(shù)據(jù)類型”的數(shù)據(jù)。
數(shù)組因?yàn)槭且妙愋停詳?shù)組對(duì)象是堆內(nèi)存當(dāng)中。(數(shù)組是存儲(chǔ)在堆當(dāng)中的)
數(shù)組當(dāng)中如果存儲(chǔ)的是“java對(duì)象”的話,實(shí)際上存儲(chǔ)的是對(duì)象的“引用(內(nèi)存地址)”,數(shù)組中不能直接存儲(chǔ)java對(duì)象(存它的地址)。

Java中數(shù)組定義和使用實(shí)例分析

數(shù)組一旦創(chuàng)建,在java中規(guī)定,長(zhǎng)度不可變。(數(shù)組長(zhǎng)度不可變)
數(shù)組的分類:一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組...(一維數(shù)組較多,二維數(shù)組偶爾使用!)
所有的數(shù)組對(duì)象都有l(wèi)ength屬性(java自帶的),用來(lái)獲取數(shù)組中元素的個(gè)數(shù)。
java中的數(shù)組要求數(shù)組中元素的類型統(tǒng)一。比如int類型數(shù)組只能存儲(chǔ)int類型,Person類型數(shù)組只能存儲(chǔ)Person類型。例如:超市購(gòu)物,購(gòu)物袋中只能裝蘋果,不能同時(shí)裝蘋果和橘子。(數(shù)組中存儲(chǔ)的元素類型統(tǒng)一)
數(shù)組在內(nèi)存方面存儲(chǔ)的時(shí)候,數(shù)組中的元素內(nèi)存地址(存儲(chǔ)的每一個(gè)元素都是有規(guī)則的挨著排列的)是連續(xù)的。內(nèi)存地址連續(xù)。這是數(shù)組存儲(chǔ)元素的特點(diǎn)(特色)。數(shù)組實(shí)際上是一種簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。
所有的數(shù)組都是拿“第一個(gè)小方框的內(nèi)存地址”作為整個(gè)數(shù)組對(duì)象的內(nèi)存地址。(數(shù)組中首元素的內(nèi)存地址作為整個(gè)數(shù)組對(duì)象的內(nèi)存地址。)
數(shù)組中每一個(gè)元素都是有下標(biāo)的,下標(biāo)從0開(kāi)始,以1遞增。最后一個(gè)元素的下標(biāo)是:length - 1;下標(biāo)非常重要,因?yàn)槲覀儗?duì)數(shù)組中元素進(jìn)行“存取”的時(shí)候,都需要通過(guò)下標(biāo)來(lái)進(jìn)行。
數(shù)組這種數(shù)據(jù)結(jié)構(gòu)的優(yōu)點(diǎn)和缺點(diǎn)是什么?
       優(yōu)點(diǎn):查詢/查找/檢索某個(gè)下標(biāo)上的元素時(shí)效率極高??梢哉f(shuō)是查詢效率最高的一個(gè)數(shù)據(jù)結(jié)構(gòu)。為什么檢索效率高?
  第一:每一個(gè)元素的內(nèi)存地址在空間存儲(chǔ)上是連續(xù)的。
  第二:每一個(gè)元素類型相同,所以占用空間大小一樣。
  第三:知道第一個(gè)元素內(nèi)存地址,知道每一個(gè)元素占用空間的大小,又知道下標(biāo),所以通過(guò)一個(gè)數(shù)學(xué)表達(dá)式就可以計(jì)算出某個(gè)下標(biāo)上元素的內(nèi)存地址。直接通過(guò)內(nèi)存地址定位元素,所以數(shù)組的檢索效率是最高的。數(shù)組中存儲(chǔ)100個(gè)元素,或者存儲(chǔ)100萬(wàn)個(gè)元素,在元素查詢/檢索方面,效率是相同的,因?yàn)閿?shù)組中元素查找的時(shí)候不會(huì)一個(gè)一個(gè)找,是通過(guò)數(shù)學(xué)表達(dá)式計(jì)算出來(lái)的。(算出一個(gè)內(nèi)存地址,直接定位的。)
       缺點(diǎn)
            第一:為了保證數(shù)組中每個(gè)元素的內(nèi)存地址連續(xù),所以在數(shù)組上隨機(jī)刪除或者增加元素的時(shí)候,效率較低,因?yàn)殡S機(jī)增刪元素會(huì)涉及到后面元素統(tǒng)一向前或者向后位移的操作。
            第二:數(shù)組不能存儲(chǔ)大數(shù)據(jù)量,為什么?因?yàn)楹茈y在內(nèi)存空間上找到一塊特別大的連續(xù)的內(nèi)存空間。對(duì)于數(shù)組中最后一個(gè)元素的增刪,是沒(méi)有效率影響的。

怎么聲明/定義一個(gè)一維數(shù)組?
      語(yǔ)法格式:

int[] array1;
double[] array2;
boolean[] array3;
String[] array4;
Object[] array5;

怎么初始化一個(gè)一維數(shù)組呢?
        包括兩種方式:靜態(tài)初始化一維數(shù)組,動(dòng)態(tài)初始化一維數(shù)組。
        (1)靜態(tài)初始化語(yǔ)法格式:
            int[] array = {100, 2100, 300, 55};
        (2)動(dòng)態(tài)初始化語(yǔ)法格式:
            int[] array = new int[5];

這里的5表示數(shù)組的元素個(gè)數(shù)。
            初始化一個(gè)5個(gè)長(zhǎng)度的int類型數(shù)組,每個(gè)元素默認(rèn)值0
            再例如:String[] names = new String[6];

初始化6個(gè)長(zhǎng)度的String類型數(shù)組,每個(gè)元素默認(rèn)值null。

什么時(shí)候使用靜態(tài)數(shù)組初始化?什么時(shí)候使用動(dòng)態(tài)數(shù)組初始化?

(1)創(chuàng)鍵數(shù)組的時(shí)候,確定數(shù)組中存儲(chǔ)哪些具體的元素時(shí),采用靜態(tài)初始化方式

(2)創(chuàng)鍵數(shù)組的時(shí)候,不確定將來(lái)存儲(chǔ)哪些數(shù)據(jù),可以采用動(dòng)態(tài)初始化的方式,預(yù)先分配內(nèi)存空間

package com.bjpowernode.javase.array;

public class ArrayTest01 {
    public static void main(String[] args) {
    //1.靜態(tài)初始化
       int[] a1 = {1,3,5,7,9};
        //所有的數(shù)組對(duì)象都有l(wèi)ength屬性,而不是方法!
        System.out.println("數(shù)組元素的個(gè)數(shù)是:"+a1.length);
        //取第一個(gè)元素
        System.out.println(a1[0]);
        //取最后一個(gè)元素
        System.out.println(a1[a1.length-1]);
        //改數(shù)據(jù)
        a1[a1.length-1] = 0;
        //遍歷數(shù)據(jù)
        for(int i=0;i< a1.length;i++){
            System.out.println(a1[i]);
        }
        //數(shù)據(jù)下標(biāo)越界異常,例如:訪問(wèn)下面為6的數(shù)據(jù)元素
        //System.out.println(a1[6]);// ArrayIndexOutOfBoundsException


    //2.動(dòng)態(tài)初始化
        int[] a2 = new int[5]; //默認(rèn)值是0
        for(int i=0;i< a2.length;i++){
            System.out.println(a2[i]);
        }
        //初始化一個(gè)Object類型的數(shù)組,
          //1.采用靜態(tài)初始化方式
        Object o1 = new Object();
        Object o2 = new Object();
        Object o3 = new Object();
        Object[] object = {o1,o2,o3};
        //上面就等價(jià)于:Object[] object = {new Object(),new Object(),new Object()};
        for(int i=0;i<object.length;i++){
            System.out.println(object[i]);// 默認(rèn)調(diào)用toString方法
        }
          //2.采用動(dòng)態(tài)初始化的方式
        Object[] obj = new Object[3];
        for(int i=0;i<obj.length;i++){
            System.out.println(obj[i]);// null null null
        }

        //初始化一個(gè)String類型的數(shù)組
          //1.靜態(tài)初始化
        String[] str1 = {"abc","bcd","cde"};
        for (int i = 0; i < str1.length; i++) {
            System.out.println(str1[i]);
        }
        //2.動(dòng)態(tài)初始化
        String[] str2 = new String[3];
        for (int i = 0; i < str2.length; i++) {
            System.out.println(str2[i]);
        }

    }

}

動(dòng)態(tài)存儲(chǔ)內(nèi)存圖

Java中數(shù)組定義和使用實(shí)例分析

方法的參數(shù)是數(shù)組

當(dāng)傳遞的是一個(gè)數(shù)組,方法也用數(shù)組的形式進(jìn)行接收;這個(gè)數(shù)組可以是靜態(tài)的,也可以是動(dòng)態(tài)創(chuàng)建的;并且我們把方法寫成寫成靜態(tài)的,這樣不需要new對(duì)象就可以調(diào)用!

例1:

package com.bjpowernode.javase.array;

public class ArrayTest02 {
    //也可以采用C++的風(fēng)格,寫成String args[]
    public static void main(String args[]) {
        System.out.println("HelloWorld");
        // 1.方法的參數(shù)傳數(shù)組---靜態(tài)初始化方式
        int[] a = {1,2,3,4,5};
        printArray(a);
        // 2.方法的參數(shù)傳數(shù)組---動(dòng)態(tài)初始化方式
        int[] arr = new int[5];
        printArray(arr);
        //   直接一步完成
        printArray(new int[3]);

    }
    //靜態(tài)方法進(jìn)行打印
    public static void printArray(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

}

例2:(掌握)

(1)一種特殊情況傳遞靜態(tài)數(shù)組;如果直接傳遞一個(gè)靜態(tài)數(shù)組的話,語(yǔ)法必須這樣寫!

(2)我們先看一個(gè)例子:int[] arr = {1,2,3};我們傳遞數(shù)組的參數(shù)時(shí)候,一般就是傳遞數(shù)組名arr,例如:printArray(arr);但是另一種方法就是傳過(guò)去,去掉數(shù)組名arr剩余的組成部分:

int[]{1,2,3},但是要加上new關(guān)鍵字,例如: printArray(new int[]{1,2,3});

package com.bjpowernode.javase.array;

public class ArrayTest03 {
    public static void main(String[] args) {
     //----------1.動(dòng)態(tài)初始化一位數(shù)組(兩種傳參方式)
        //第一種傳參方式
        int[] a1 = new int[5];//默認(rèn)是5個(gè)0
        printArray(a1);
        System.out.println("-------------");
        //第二種傳參方式
        printArray(new int[3]);
        System.out.println("-------------");
     //----------2.靜態(tài)初始化一位數(shù)組(兩種傳參方式)
        //第一種傳參方式
        int[] a2 = {1,2,3};
        printArray(a2);
        System.out.println("-------------");
        //第二種傳參方式----直接傳遞一個(gè)靜態(tài)數(shù)組
        printArray(new int[]{4,5,6});

    }
    //調(diào)用的靜態(tài)方法----靜態(tài)方法比較方便,不需要new對(duì)象
    public static void printArray(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

main方法中的String數(shù)組

(1)對(duì)于main(String[] args);分析一下:誰(shuí)負(fù)責(zé)調(diào)用main方法(JVM)
     JVM調(diào)用main方法的時(shí)候,會(huì)自動(dòng)傳一個(gè)String數(shù)組過(guò)來(lái),長(zhǎng)度為0。

例1:

package com.bjpowernode.javase.array;

public class ArrayTest04 {
    // 這個(gè)方法程序員負(fù)責(zé)寫出來(lái),JVM負(fù)責(zé)調(diào)用。JVM調(diào)用的時(shí)候一定會(huì)傳一個(gè)String數(shù)組過(guò)來(lái)。
    public static void main(String[] args) {
        // JVM默認(rèn)傳遞過(guò)來(lái)的這個(gè)數(shù)組對(duì)象的長(zhǎng)度?默認(rèn)是0
        // 通過(guò)測(cè)試得出:args不是null。
        System.out.println("JVM給傳遞過(guò)來(lái)的String數(shù)組參數(shù),它這個(gè)數(shù)組的長(zhǎng)度是?"
        + args.length); //0

        // 以下這一行代碼表示的含義:數(shù)組對(duì)象創(chuàng)建了,但是數(shù)組中沒(méi)有任何數(shù)據(jù)。就等價(jià)于:
        String[] strs = new String[0]; //動(dòng)態(tài)的方式
        //String[] strs = {}; // 靜態(tài)初始化數(shù)組,里面沒(méi)東西。
        printLength(strs); //調(diào)用printLength靜態(tài)方法

/*
     既然傳過(guò)來(lái)的“String[] args”數(shù)組里什么都沒(méi)有;那么這個(gè)數(shù)組什么時(shí)候里面會(huì)有值呢?
     其實(shí)這個(gè)數(shù)組是留給用戶的,用戶可以在控制臺(tái)上輸入?yún)?shù),這個(gè)參數(shù)自動(dòng)會(huì)被轉(zhuǎn)換為“String[] args”
     例如這樣運(yùn)行程序:java ArrayTest04 abc def xyz;相當(dāng)于在編譯時(shí)進(jìn)行傳參
     那么這個(gè)時(shí)候JVM會(huì)自動(dòng)將“abc def xyz”通過(guò)空格的方式進(jìn)行分離,分離完成之后,自動(dòng)放到“String[] args”數(shù)組當(dāng)中。
     所以main方法上面的String[] args數(shù)組主要是用來(lái)接收用戶輸入?yún)?shù)的。
     把a(bǔ)bc def xyz 轉(zhuǎn)換成字符串?dāng)?shù)組:{"abc","def","xyz"}
*/
        // 遍歷數(shù)組
        for (int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
        //既然是編譯時(shí)進(jìn)行傳參,對(duì)于編譯運(yùn)行一體的IDEA怎么使用呢?
        //Run--->EditConfiguration--->Program Arguments里面進(jìn)行傳參,然后在從后重新運(yùn)行

    }

    public static void printLength(String[] args){
        System.out.println(args.length); // 0
    }
}

例2:

(1)main方法上面的“String[] args”有什么用?

可以用來(lái)模擬一個(gè)登陸系統(tǒng)!請(qǐng)看下面這個(gè)有趣的例題:

package com.bjpowernode.javase.array;
/*
   模擬一個(gè)系統(tǒng),假設(shè)這個(gè)系統(tǒng)要使用,必須輸入用戶名和密碼。
*/
public class ArrayTest05 {
    public static void main(String[] args) {
        //先判斷長(zhǎng)度,是不是兩個(gè)字符串長(zhǎng)度,不是2直接終止程序
        if(args.length != 2){
            System.out.println("請(qǐng)輸入用戶名和密碼");
            return;
        }

        //取出用戶名和密碼
        String username = args[0];
        String password = args[1];
        // 假設(shè)用戶名是admin,密碼是123的時(shí)候表示登錄成功。其它一律失敗。
        // 判斷兩個(gè)字符串是否相等,需要使用equals方法。
        // if(username.equals("admin") && password.equals("123")){ //這樣有可能空指針異常
        // 下面這種編寫方式,也可以避免空該指針異常!
        if("admin".equals(username) && "123".equals(password)){ 
            System.out.println("恭喜你,登錄成功");
            System.out.println("您可以繼續(xù)使用該系統(tǒng)");
        }else{
            System.out.println("賬戶或密碼錯(cuò)誤,請(qǐng)重新輸入");
        }
    }
}

數(shù)組中存儲(chǔ)引用數(shù)據(jù)類型(重點(diǎn))

(1)一維數(shù)組的深入:數(shù)組中存儲(chǔ)的類型為:引用數(shù)據(jù)類型;對(duì)于數(shù)組來(lái)說(shuō),實(shí)際上只能存儲(chǔ)java對(duì)象的“內(nèi)存地址”。數(shù)組中存儲(chǔ)的每個(gè)元素是“引用”。下面這個(gè)例題重點(diǎn)理解!

(2)數(shù)組要求數(shù)組中元素的類型統(tǒng)一;但是也可以存儲(chǔ)它的子類型

package com.bjpowernode.javase.array;
public class ArrayTest06 {
    public static void main(String[] args) {
        //1.靜態(tài)創(chuàng)建一個(gè)Animal類型的數(shù)組
        Animal a1 = new Animal();
        Animal a2 = new Animal();
        Animal[] animals = {a1,a2};

        //對(duì)Animal數(shù)組進(jìn)行遍歷
        for (int i = 0; i < animals.length; i++) {
            //方法1
            /*Animal a = animals[i];
            a.move();*/
            //方法2
            animals[i].move();
        }

        //2.動(dòng)態(tài)初始化一個(gè)長(zhǎng)度為2的animal類型的數(shù)組
        Animal[] ans = new Animal[2];
        ans[0] = new Animal();
        //ans[1] = new Product(); //err,Product和Animals沒(méi)有任何關(guān)系
        //Animal數(shù)組中只能存放Animal類型,不能存放Product類型

        //3.Animal數(shù)組中可以存放Cat類型的數(shù)據(jù),因?yàn)镃at是Animal一個(gè)子類
       ans[1] = new Cat();
        for (int j = 0; j < ans.length; j++) {
            ans[j].move();
        }

        //4.創(chuàng)建一個(gè)Animal類型的數(shù)據(jù),數(shù)組當(dāng)中存儲(chǔ)Cat和Bird
          //4.1靜態(tài)創(chuàng)建
        Cat cat = new Cat();
        Bird bird = new Bird();
        Animal[] anim = {cat,bird};
        for (int i = 0; i < anim.length; i++) {
            //直接調(diào)用子類和父類都有的move()方法
            //anim[i].move();
            
            //這里想要調(diào)用子類Bird里面特有的方法,需要向下轉(zhuǎn)型
            if(anim[i] instanceof Bird){
                Bird b = (Bird)anim[i]; //向下轉(zhuǎn)型
                b.move();
                b.sing(); //調(diào)用子類特有的方法
            }else{
                anim[i].move();
            }

        }


    }
}
//動(dòng)物類
class Animal{
    public void move(){
        System.out.println("Animals move.....");
    }
}
//商品類
class Product{

}

//有一個(gè)貓類繼承動(dòng)物類
class Cat extends Animal{
    public void move(){
        System.out.println("Cat move.....");
    }
}

//有一個(gè)鳥(niǎo)類繼承動(dòng)物類
class Bird extends Animal{
    public void move(){
        System.out.println("Bird move.....");
    }

    //鳥(niǎo)特有的方法
    public void sing(){
        System.out.println("鳥(niǎo)兒在歌唱!");
    }
}

數(shù)組擴(kuò)容和拷貝

在Java開(kāi)發(fā)中,數(shù)組長(zhǎng)度一旦確定不可變,那么數(shù)組滿了,需要擴(kuò)容怎么辦?
(1)java中對(duì)數(shù)組的擴(kuò)容是:先創(chuàng)建一個(gè)大容量的數(shù)組,然后將小容量數(shù)組中的元素一個(gè)個(gè)拷貝到大數(shù)組當(dāng)中,小容量會(huì)被釋放。
(2)結(jié)論:數(shù)組擴(kuò)容效率較低。因?yàn)樯婕暗娇截惖膯?wèn)題。所以在以后的開(kāi)發(fā)中請(qǐng)注意:盡可能少的進(jìn)行數(shù)組的拷貝??梢栽趧?chuàng)建數(shù)組對(duì)象的時(shí)候預(yù)估計(jì)以下多長(zhǎng)合適,最好預(yù)估準(zhǔn)確,這樣可以減少數(shù)組的擴(kuò)容次數(shù)。提高效率。

(3)利用System.arraycopy進(jìn)行拷貝,總共5個(gè)參數(shù);System.arraycopy(源頭數(shù)組,下標(biāo),目的地?cái)?shù)組,下標(biāo),要拷貝的個(gè)數(shù))

package com.bjpowernode.javase.array;
public class ArrayTest07 {
    public static void main(String[] args) {
        //java中的數(shù)組是怎樣拷貝的呢?System.arraycopy(5個(gè)參數(shù))
        //System.arraycopy(源,下標(biāo),目的地,下標(biāo),個(gè)數(shù))

        //拷貝源---把3、5、7拷貝過(guò)去
        int[] src = {1,3,5,7,9};
        //拷貝目的地---拷貝到下標(biāo)為5的地方
        int[] dest = new int[20];
        //調(diào)用拷貝函數(shù)
        System.arraycopy(src,1,dest,5,3);
        //打印驗(yàn)證
        for (int i = 0; i < dest.length; i++) {
            System.out.println(dest[i]+" ");
        }

        //拷貝引用數(shù)據(jù)類型
        String[] str = {"hello","world"};
        String[] strs = new String[10];
        System.arraycopy(str,0,strs,3,2);
        for (int i = 0; i < strs.length; i++) {
            System.out.println(strs[i]);
        }
        System.out.println("--------------");
        
        //采用動(dòng)態(tài)開(kāi)辟的時(shí)候拷貝的是地址
        Object[] objs = {new Object(),new Object(),new Object()};
        Object[] objects = new Object[5];
        System.arraycopy(objs,0,objects,0,3);
        for (int i = 0; i < objects.length; i++) {
            System.out.println(objects[i]);

        }

    }
}

內(nèi)存圖

Java中數(shù)組定義和使用實(shí)例分析

以上就是關(guān)于“Java中數(shù)組定義和使用實(shí)例分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI