[JAVA基础] 简单又不简单的数组
引言
相信有過編程基礎的小伙伴都知道數組這個數據結構,它應該也是我們第一個接觸的數據結構,學過C或者C++的應該知道數組和指針緊密相關,那么在java里沒有了指針,java里的數組又有哪些不同的特點呢?下面就來介紹一下java里的數組;
數組也是一種類型
數組里面的數組元素都是唯一的,這個大家應該都知道,但是因為java是面向對象語言,類與類之間又有繼承關系(C++中同樣擁有),所以有時候會出現一個數組里面出現多種數據類型的情況,其實歸根結底,數組元素的類型就是一個,就是那個父類;
在java中,其實數組也是一種數據類型,數組的父類是Object,數組本身是一種引用類型(基本類型如int,char ,double等)
就比如在java里定義數組的一種方式 :int[] ,這是定義了一個整型的數組,不能把它分開來看,就把int[] 當成一種數據類型,這樣我們用該類型創建的對象就是數組,所以int[] 是一種引用類型;
在下面的數組學習中一定要把數組當成引用類型來看,更有助于理解,不要帶著C或者C++的數組來思考;
數組特點
下面就簡單規整一些數組的幾個特點:
數組的聲明和初始化
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語言指針動態分配內存,當一個指針動態分配了一塊內存后,這一塊內存存放在堆中,而這個指針變量存放在棧中,只有通過這個指針變量才能訪問到分配的動態內存 }
畫個圖更好理解:
給大家來個案例看看,通過代碼會更好理解:
這里解釋一下:
開始定義了兩個引用變量: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基础] 简单又不简单的数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UML实践详细经典教程
- 下一篇: Java中的static———静态变量