最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引言

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

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

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

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

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

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

數(shù)組特點

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

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

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

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

type[] myArray;
type myArray[];

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

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

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

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

初始化時由你自己來顯式的指定每個數(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ù)組長度,系統(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)存的操作,所以理解好底層的機制對代碼的編寫和理解尤為重要;
下面的內(nèi)容就是有一些小小的難度了,但是如果提前接觸過指針的概念,對于下面的內(nèi)容,你會發(fā)現(xiàn)許多相似之處;

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

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

畫個圖更好理解:

在這里插入圖片描述

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

public class PointTest {
    public static void main (String[] args) {
        int a[] = {1, 2, 3, 4, 5};
        //注意:此時的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;

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

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

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

總結(jié)

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

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

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

相關(guān)文章

  • java字符串日期類Date和Calendar相互轉(zhuǎn)化及相關(guān)常用方法

    java字符串日期類Date和Calendar相互轉(zhuǎn)化及相關(guān)常用方法

    Java語言的Calendar(日歷),Date(日期),和DateFormat(日期格式)組成了Java標準的一個基本但是非常重要的部分,下面這篇文章主要給大家介紹了關(guān)于java字符串日期類Date和Calendar相互轉(zhuǎn)化及相關(guān)常用方法的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • ElasticSearch學習之多條件組合查詢驗證及示例分析

    ElasticSearch學習之多條件組合查詢驗證及示例分析

    這篇文章主要為大家介紹了ElasticSearch 多條件組合查詢驗證及示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • SpringBoot實現(xiàn)跨域的幾種常用方式總結(jié)

    SpringBoot實現(xiàn)跨域的幾種常用方式總結(jié)

    跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源,或者涉及到兩個不同域名的資源之間的交互,由于同源策略(Same Origin Policy)的限制,瀏覽器不允許跨域請求,本文小編給大家分享了SpringBoot實現(xiàn)跨域的幾種常用方式,需要的朋友可以參考下
    2023-09-09
  • Java Builder Pattern建造者模式詳解及實例

    Java Builder Pattern建造者模式詳解及實例

    這篇文章主要介紹了Java Builder Pattern建造者模式詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Java中String類的常用方法總結(jié)

    Java中String類的常用方法總結(jié)

    java.lang.String?類代表字符串。Java程序中所有的字符串文字(例如"abc"?)都可以被看作是實現(xiàn)此類的實例。本文主要為大家介紹了String類的常用方法,需要的可以參考一下
    2022-11-11
  • java面試常見問題之Hibernate總結(jié)

    java面試常見問題之Hibernate總結(jié)

    這篇文章主要介紹了在java面試過程中hibernate比較常見的問題,包括Hibernate的檢索方式,Hibernate中對象的狀態(tài),Hibernate的3種檢索策略是什么,Session的find()方法以及Query接口的區(qū)別等方面問題的總結(jié),需要的朋友可以參考下
    2015-07-07
  • 一文帶你深入了解Java的自動拆裝箱

    一文帶你深入了解Java的自動拆裝箱

    Java推出了對于基本數(shù)據(jù)類型的對應的對象,將基本數(shù)據(jù)類型轉(zhuǎn)換為對象就稱為裝箱,反之則是拆箱,本文主要為大家介紹了Java自動拆裝箱的原理與應用,需要的可以參考下
    2023-11-11
  • springboot?實現(xiàn)動態(tài)刷新配置的詳細過程

    springboot?實現(xiàn)動態(tài)刷新配置的詳細過程

    這篇文章主要介紹了springboot實現(xiàn)動態(tài)刷新配置,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Java volatile關(guān)鍵字原理剖析與實例講解

    Java volatile關(guān)鍵字原理剖析與實例講解

    volatile是Java提供的一種輕量級的同步機制,Java?語言包含兩種內(nèi)在的同步機制:同步塊(或方法)和?volatile?變量,本文將詳細為大家總結(jié)Java volatile關(guān)鍵字,通過詳細的代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • SpringBoot?@RestControllerAdvice注解對返回值統(tǒng)一封裝的處理方法

    SpringBoot?@RestControllerAdvice注解對返回值統(tǒng)一封裝的處理方法

    這篇文章主要介紹了SpringBoot?@RestControllerAdvice注解對返回值統(tǒng)一封裝,使用@RestControllerAdvice對響應進行增強,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09

最新評論

乐昌市| 福泉市| 永善县| 晋城| 扬州市| 大悟县| 鲁山县| 金门县| 台州市| 家居| 夏河县| 诏安县| 阿瓦提县| 黑水县| 太仓市| 玛多县| 修武县| 华安县| 临夏市| 凤台县| 右玉县| 天柱县| 丰镇市| 青神县| 临漳县| 武冈市| 策勒县| 九江市| 西乌珠穆沁旗| 慈溪市| 盐亭县| 平陆县| 于都县| 广南县| 大名县| 凌云县| 肇源县| 安化县| 南充市| 紫阳县| 桂平市|