日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

[JAVA基础] 简单又不简单的数组

發布時間:2025/3/21 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [JAVA基础] 简单又不简单的数组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

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

數組也是一種類型

數組里面的數組元素都是唯一的,這個大家應該都知道,但是因為java是面向對象語言,類與類之間又有繼承關系(C++中同樣擁有),所以有時候會出現一個數組里面出現多種數據類型的情況,其實歸根結底,數組元素的類型就是一個,就是那個父類;

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

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

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

數組特點

下面就簡單規整一些數組的幾個特點:

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

    java其實支持兩種語法聲明數組:

    type[] myArray; type myArray[];

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

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

    下面看看數組初始化操作,初始化其實就是給數組的元素分配內存空間(類似C、C++中的動態內存分配),并且為每個數組元素賦值;
    數組初始化有兩種方式:
    1,靜態初始化
    初始化時由你自己來顯式的指定每個數組元素的初始值,由系統來決定數組長度;

    格式如下:

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

    或者

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

    測試代碼:

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

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

    2,動態初始化
    初始化時你只需要指定數組長度,系統會自動分配初始值;

    格式如下:

    type myArray = new type[length];

    這里提一下系統自動分配的初始值:

    • byte,shoet,int,long 初始值是0
    • float, double初始值是0.0
    • char 初始值是’\0000’
    • boolean初始值是false
    • 所有引用類型初始值是null

    測試代碼:

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

    數組和內存

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

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

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

    畫個圖更好理解:

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

    public class PointTest {public static void main (String[] args) {int a[] = {1, 2, 3, 4, 5};//注意:此時的b的長度為6int[] 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所指向的內存b = a;//當b指向a所指向的內存空間時,b的長度就是a的長度System.out.println("b的長度為:" + b.length);//此時b指向的內存數據為for (int i : b) System.out.print(i + " ");System.out.println();//當a的第一個數據改變時,輸出b的第一個數據看看是否改變a[0] = 100;System.out.println(b[0]);} }

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

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

    總結

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

    ps:內容如果有問題歡迎交流!!

    總結

    以上是生活随笔為你收集整理的[JAVA基础] 简单又不简单的数组的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。