欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java基礎(chǔ)之不簡單的數(shù)組

 更新時(shí)間:2021年09月22日 10:01:05   作者:YXXYX  
數(shù)組(Array)是有序的元素序列。 若將有限個(gè)類型相同的變量的集合命名,那么這個(gè)名稱為數(shù)組名。組成數(shù)組的各個(gè)變量稱為數(shù)組的分量,也稱為數(shù)組的元素,有時(shí)也稱為下標(biāo)變量

引言

相信有過編程基礎(chǔ)的小伙伴都知道數(shù)組這個(gè)數(shù)據(jù)結(jié)構(gòu),它應(yīng)該也是我們第一個(gè)接觸的數(shù)據(jù)結(jié)構(gòu),學(xué)過C或者C++的應(yīng)該知道數(shù)組和指針緊密相關(guān),那么在java里沒有了指針,java里的數(shù)組又有哪些不同的特點(diǎn)呢?下面就來介紹一下java里的數(shù)組;

數(shù)組也是一種類型

數(shù)組里面的數(shù)組元素都是唯一的,這個(gè)大家應(yīng)該都知道,但是因?yàn)閖ava是面向?qū)ο笳Z言,類與類之間又有繼承關(guān)系(C++中同樣擁有),所以有時(shí)候會出現(xiàn)一個(gè)數(shù)組里面出現(xiàn)多種數(shù)據(jù)類型的情況,其實(shí)歸根結(jié)底,數(shù)組元素的類型就是一個(gè),就是那個(gè)父類;

在java中,其實(shí)數(shù)組也是一種數(shù)據(jù)類型,數(shù)組的父類是Object,數(shù)組本身是一種引用類型(基本類型如int,char ,double等)

就比如在java里定義數(shù)組的一種方式 :int[] ,這是定義了一個(gè)整型的數(shù)組,不能把它分開來看,就把int[] 當(dāng)成一種數(shù)據(jù)類型,這樣我們用該類型創(chuàng)建的對象就是數(shù)組,所以int[] 是一種引用類型;

在下面的數(shù)組學(xué)習(xí)中一定要把數(shù)組當(dāng)成引用類型來看,更有助于理解,不要帶著C或者C++的數(shù)組來思考;

數(shù)組特點(diǎn)

下面就簡單規(guī)整一些數(shù)組的幾個(gè)特點(diǎn):

  1. 數(shù)組是一組數(shù)據(jù)的集合
  2. 數(shù)組作為一種引用類型
  3. 數(shù)組元素的類型可以是基本類型(基本類型數(shù)組),也可以是引用類型(引用類型數(shù)組),但同一個(gè)數(shù)組只能是同一種類型
  4. 數(shù)組作為對象,數(shù)組中的元素作為對象的屬性,而且數(shù)組包括一個(gè)成員屬性 length,length 表示數(shù)組的長度
  5. 數(shù)組的長度在數(shù)組對象創(chuàng)建后就確定了,就無法再修改
  6. 數(shù)組元素是有下標(biāo)的,下標(biāo)從 0 開始,也就是第一個(gè)元素的下標(biāo)為 0,依次類推最后一個(gè)元素的下標(biāo)為 n-1,我們可以通過數(shù)組的下標(biāo)來訪問數(shù)組的元素

數(shù)組的聲明和初始化

java其實(shí)支持兩種語法聲明數(shù)組:

type[] myArray;
type myArray[];

對于這兩種方法,這里就不多介紹了,只是讓大家了解一下,但是,我們需要記住并且使用的只用一種方法,就是第一種,不管是可讀性還是對數(shù)組的理解,第一種都是完勝第二種的,可能剛學(xué)過C或者C++的都會看第二種更親切些,從現(xiàn)在開始,就不要再想第二種了;(C#已經(jīng)不支持第二種語法,并且越來越多語言不再支持該語法);

數(shù)組是一種引用類型的變量,所以當(dāng)它聲名一個(gè)變量時(shí),就只是定義了一個(gè)引用變量(也就是指針),學(xué)過C或者C++的小伙伴一定知道,當(dāng)一個(gè)指針定義出來時(shí)并沒有指向任何有效的內(nèi)存空間,這里也是一樣,這個(gè)引用變量也是沒有指向任何有效空間,所以這時(shí)候的數(shù)組不能使用,需要進(jìn)行初始化操作;
ps:學(xué)過C或者C++的話可以將引用變量和指針相互聯(lián)系思考,學(xué)起來會更加輕松;

下面看看數(shù)組初始化操作,初始化其實(shí)就是給數(shù)組的元素分配內(nèi)存空間(類似C、C++中的動態(tài)內(nèi)存分配),并且為每個(gè)數(shù)組元素賦值;
數(shù)組初始化有兩種方式:

1.靜態(tài)初始化

初始化時(shí)由你自己來顯式的指定每個(gè)數(shù)組元素的初始值,由系統(tǒng)來決定數(shù)組長度;

格式如下:

type[] myArray;
myArray = new type[] {element1, element2, element3, element4};

或者

type[] myArray = {element1, element2, element3, element4};

測試代碼:

public class MyArrayTest02 {
    public static void main (String[] args) {
        //靜態(tài)初始化數(shù)組01
        int[] arr;
        arr = new int[] {0, 1, 2, 3, 4};
        //foreach循環(huán)
        for (int i : arr) {
            System.out.println(i);
        }

        //靜態(tài)初始化數(shù)組02
        Object[] objarr;
        objarr = new String[] {"I", " love", " coding!"};
        //foreach循環(huán)
        for (Object str : objarr) {
            System.out.print(str);
        }
        System.out.print("\n");
    }
}
public class MyArrayTest03 {
    public static void main (String[] args) {
        //靜態(tài)初始化數(shù)組簡化版01
        int[] arr = {0, 1, 2, 3, 4};
        //foreach循環(huán)
        for (int i : arr) {
            System.out.println(i);
        }

        //靜態(tài)初始化數(shù)組02
        Object[] objarr = {"I", " love", " coding!"};
        //foreach循環(huán)
        for (Object str : objarr) {
            System.out.print(str);
        }
        System.out.print("\n");
    }
}

這兩種哪一種都是可以的,第二種相對第一種簡化一些,但是我感覺第一種更好有利于對數(shù)組內(nèi)存空間的理解;

2.動態(tài)初始化

初始化時(shí)你只需要指定數(shù)組長度,系統(tǒng)會自動分配初始值;

格式如下:

type myArray = new type[length];

這里提一下系統(tǒng)自動分配的初始值:

  1. byte,shoet,int,long 初始值是0
  2. float, double初始值是0.0
  3. char 初始值是'\0000'
  4. boolean初始值是false
  5. 所有引用類型初始值是null

測試代碼:

public class MyArrayTest02 {
    public static void main (String[] args) {
        //動態(tài)初始化數(shù)組
        int[] arr = new int[5];
        for (int i = 0; i < arr.length; ++i) {
            arr[i] = i;
        }
        //foreach循環(huán)
        for (var i : arr) {
            System.out.println(i);
        }
     }
}    

數(shù)組和內(nèi)存

java里面雖然沒有了指針,但是java引入了引用的概念,同樣是對內(nèi)存的操作,所以理解好底層的機(jī)制對代碼的編寫和理解尤為重要;
下面的內(nèi)容就是有一些小小的難度了,但是如果提前接觸過指針的概念,對于下面的內(nèi)容,你會發(fā)現(xiàn)許多相似之處;

數(shù)組引用變量是一個(gè)引用,只由引用變量指向了有效內(nèi)存,才能通過數(shù)組變量訪問數(shù)組元素;
同樣,只有通過了數(shù)組的引用變量,才能訪問到數(shù)組中的元素,即數(shù)組對象本身;

重點(diǎn)?。?!
數(shù)組對象存儲在堆中,引用變量存儲在棧中(引用變量是局部變量的情況)
{ 這一點(diǎn)可以類比C語言指針動態(tài)分配內(nèi)存,當(dāng)一個(gè)指針動態(tài)分配了一塊內(nèi)存后,這一塊內(nèi)存存放在堆中,而這個(gè)指針變量存放在棧中,只有通過這個(gè)指針變量才能訪問到分配的動態(tài)內(nèi)存 }

畫個(gè)圖更好理解:

在這里插入圖片描述

給大家來個(gè)案例看看,通過代碼會更好理解:

public class PointTest {
    public static void main (String[] args) {
        int a[] = {1, 2, 3, 4, 5};
        //注意:此時(shí)的b的長度為6
        int[] b = new int[6];

        for (int i : a) System.out.print(i + " ");
        System.out.println();
        for (int i : b) System.out.print(i + " ");
        System.out.println();

        //b指向a所指向的內(nèi)存
        b = a;

        //當(dāng)b指向a所指向的內(nèi)存空間時(shí),b的長度就是a的長度
        System.out.println("b的長度為:" + b.length);
        //此時(shí)b指向的內(nèi)存數(shù)據(jù)為
        for (int i : b) System.out.print(i + " ");
        System.out.println();
        //當(dāng)a的第一個(gè)數(shù)據(jù)改變時(shí),輸出b的第一個(gè)數(shù)據(jù)看看是否改變
        a[0] = 100;
        System.out.println(b[0]);
    }
}

這里解釋一下:
開始定義了兩個(gè)引用變量:a和b,然后系統(tǒng)內(nèi)存就產(chǎn)生了四個(gè)內(nèi)存區(qū),a和b就在棧區(qū),而a和b所指向的數(shù)組本身在堆區(qū);
a引用的數(shù)組對象里面有{1, 2, 3, 4, 5}五個(gè)元素,而b引用的數(shù)據(jù)對象則是系統(tǒng)初始化的,為{0, 0, 0, 0, 0, 0}六個(gè)元素,而當(dāng)b指向a時(shí),此時(shí)的b的數(shù)據(jù)對象就處于沒有任何引用變量引用的情況,而a的數(shù)據(jù)對象此時(shí)被a和b兩個(gè)引用變量所引用,此時(shí)b的長度就是a的長度5,所以當(dāng)a的第一個(gè)數(shù)據(jù)改變時(shí),相當(dāng)于b的第一個(gè)數(shù)據(jù)改變;

總結(jié)一下:
我們看待一個(gè)數(shù)組時(shí),要把數(shù)組看成兩部分,一部分是數(shù)組的引用,即代碼中定義的數(shù)組引用變量(存儲在棧中),另一部分是實(shí)際的數(shù)組對象(存儲在堆中);所以需要用過引用變量來訪問數(shù)組對象;

總結(jié)

在這里我只是簡單的介紹了一下java中的數(shù)組,不要以為掌握了這些就算真正學(xué)會了數(shù)組了,這些只能算作java數(shù)組的一個(gè)入門,你也許能夠?qū)W會使用數(shù)組,但是數(shù)組在內(nèi)存中的運(yùn)行機(jī)制還有很多難以理解的地方,強(qiáng)烈建議提前學(xué)習(xí)一下C語言指針的相關(guān)內(nèi)容,還有指針數(shù)組也最好掌握理解,這些將會幫助你更好的理解數(shù)組在內(nèi)存中的存儲和初始化,理解了這些,你將會對你的程序運(yùn)行機(jī)制有著更準(zhǔn)確的把握!

ps:內(nèi)容如果有問題歡迎交流??!

到此這篇關(guān)于Java基礎(chǔ)之不簡單的數(shù)組的文章就介紹到這了,更多相關(guān)Java 數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java selenium 常見web UI 元素操作及API使用

    java selenium 常見web UI 元素操作及API使用

    本文主要介紹java selenium 常見web UI 元素操作,這里幫大家整理了相關(guān)資料并附示例代碼,有需要的小伙伴可以參考下
    2016-08-08
  • java實(shí)現(xiàn)服務(wù)器巡查的代碼

    java實(shí)現(xiàn)服務(wù)器巡查的代碼

    接到上級領(lǐng)導(dǎo)任務(wù),需要實(shí)現(xiàn)一個(gè)這樣的需求,一大批服務(wù)器,需要檢查服務(wù)器能否ping通,ssh密碼是否正常,以及檢查服務(wù)器的cpu,內(nèi)存,硬盤占用情況,下面通過java代碼實(shí)現(xiàn)服務(wù)器巡查功能,需要的朋友一起看看吧
    2021-12-12
  • Spring?Boot?Aop執(zhí)行順序深入探究

    Spring?Boot?Aop執(zhí)行順序深入探究

    這篇文章主要為大家介紹了Spring?Boot?Aop執(zhí)行順序深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Java編程中快速排序算法的實(shí)現(xiàn)及相關(guān)算法優(yōu)化

    Java編程中快速排序算法的實(shí)現(xiàn)及相關(guān)算法優(yōu)化

    這篇文章主要介紹了Java編程中快速排序算法的實(shí)現(xiàn)及相關(guān)算法優(yōu)化,快速排序算法的最差時(shí)間復(fù)雜度為(n^2),最優(yōu)時(shí)間復(fù)雜度為(n\log n),存在優(yōu)化的空間,需要的朋友可以參考下
    2016-05-05
  • 使用shardingsphere對SQLServer坑的解決

    使用shardingsphere對SQLServer坑的解決

    本文主要介紹了使用shardingsphere對SQLServer坑的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • SpringBoot+Vue項(xiàng)目新手快速入門指南

    SpringBoot+Vue項(xiàng)目新手快速入門指南

    最近剛剛做了一個(gè)基于vue+springboot的系統(tǒng),于是基于這點(diǎn),對遇到的一些問題進(jìn)行一些配置的匯總,下面這篇文章主要給大家介紹了關(guān)于SpringBoot+Vue項(xiàng)目新手快速入門的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • maven中no main manifest attribute的問題解決

    maven中no main manifest attribute的問題解決

    本文主要介紹了maven中no main manifest attribute的問題解決,這個(gè)錯(cuò)誤通常意味著Spring Boot應(yīng)用在啟動時(shí)遇到了問題,下面就來具體介紹一下,感興趣的可以了解一下
    2024-08-08
  • Java Eclipse進(jìn)行斷點(diǎn)調(diào)試的方法

    Java Eclipse進(jìn)行斷點(diǎn)調(diào)試的方法

    本篇文章主要介紹了Java Eclipse進(jìn)行斷點(diǎn)調(diào)試的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Intellij IDEA導(dǎo)入JAVA項(xiàng)目并啟動(圖文教程)

    Intellij IDEA導(dǎo)入JAVA項(xiàng)目并啟動(圖文教程)

    這篇文章主要介紹了Intellij IDEA導(dǎo)入JAVA項(xiàng)目并啟動,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • SpringBoot參數(shù)校驗(yàn)Validator框架詳解

    SpringBoot參數(shù)校驗(yàn)Validator框架詳解

    Validator框架就是為了解決開發(fā)人員在開發(fā)的時(shí)候少寫代碼,提升開發(fā)效率,Validator專門用來進(jìn)行接口參數(shù)校驗(yàn),今天通過本文給大家介紹SpringBoot參數(shù)校驗(yàn)Validator框架,感興趣的朋友一起看看吧
    2022-06-06

最新評論