Java基礎(chǔ)之不簡單的數(shù)組
引言
相信有過編程基礎(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):
- 數(shù)組是一組數(shù)據(jù)的集合
- 數(shù)組作為一種引用類型
- 數(shù)組元素的類型可以是基本類型(基本類型數(shù)組),也可以是引用類型(引用類型數(shù)組),但同一個(gè)數(shù)組只能是同一種類型
- 數(shù)組作為對象,數(shù)組中的元素作為對象的屬性,而且數(shù)組包括一個(gè)成員屬性 length,length 表示數(shù)組的長度
- 數(shù)組的長度在數(shù)組對象創(chuàng)建后就確定了,就無法再修改
- 數(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)自動分配的初始值:
- byte,shoet,int,long 初始值是0
- float, double初始值是0.0
- char 初始值是'\0000'
- boolean初始值是false
- 所有引用類型初始值是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 元素操作,這里幫大家整理了相關(guān)資料并附示例代碼,有需要的小伙伴可以參考下2016-08-08Java編程中快速排序算法的實(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坑的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03SpringBoot+Vue項(xiàng)目新手快速入門指南
最近剛剛做了一個(gè)基于vue+springboot的系統(tǒng),于是基于這點(diǎn),對遇到的一些問題進(jìn)行一些配置的匯總,下面這篇文章主要給大家介紹了關(guān)于SpringBoot+Vue項(xiàng)目新手快速入門的相關(guān)資料,需要的朋友可以參考下2022-06-06maven中no main manifest attribute的問題解決
本文主要介紹了maven中no main manifest attribute的問題解決,這個(gè)錯(cuò)誤通常意味著Spring Boot應(yīng)用在啟動時(shí)遇到了問題,下面就來具體介紹一下,感興趣的可以了解一下2024-08-08Java Eclipse進(jìn)行斷點(diǎn)調(diào)試的方法
本篇文章主要介紹了Java Eclipse進(jìn)行斷點(diǎn)調(diào)試的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Intellij 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-08SpringBoot參數(shù)校驗(yàn)Validator框架詳解
Validator框架就是為了解決開發(fā)人員在開發(fā)的時(shí)候少寫代碼,提升開發(fā)效率,Validator專門用來進(jìn)行接口參數(shù)校驗(yàn),今天通過本文給大家介紹SpringBoot參數(shù)校驗(yàn)Validator框架,感興趣的朋友一起看看吧2022-06-06