Java中數(shù)組的使用與注意事項(xiàng)詳解(推薦)
一.初始數(shù)組
數(shù)組的概念:數(shù)組就是一個(gè)用來(lái)存儲(chǔ)相同類型數(shù)據(jù)的一個(gè)容器。
為什么要使用數(shù)組?
當(dāng)我們要存儲(chǔ)大量相同類型的時(shí)候,通過(guò)配合循環(huán)來(lái)使用就會(huì)大量減少代碼復(fù)雜程度
數(shù)組的特點(diǎn):
(1)數(shù)組是一種引用類型.
(2)數(shù)組的長(zhǎng)度是固定的.
(3)數(shù)組中每個(gè)元素的類型都是相同的.
二.數(shù)組的創(chuàng)建
對(duì)于數(shù)組的創(chuàng)建,這里和c/c++還是有些不同的,這里創(chuàng)建數(shù)組的方法共有三種方法,下面就以數(shù)組里面元素為int類型,數(shù)組大小為5的舉例,如下所示:
(1) 靜態(tài)初始化
int[] arr = {1,2,3,4,5}
int[] arr = new int[]{1,2,3,4,5};
(2)動(dòng)態(tài)初始化
int[] arr = new int[5];
在這里對(duì)于數(shù)組的初始化,千萬(wàn)要注意下面這種情況是錯(cuò)誤的初始化
int[] arr = new int[5]{1,2,3,4,5};
在這里是不能同時(shí)初始化兩次,這樣會(huì)編譯不通過(guò),出現(xiàn)錯(cuò)誤。
三.使用數(shù)組時(shí)的注意事項(xiàng)
(1)初始化問(wèn)題
在創(chuàng)建數(shù)組后,如果沒(méi)有進(jìn)行賦初值,Java會(huì)默認(rèn)對(duì)數(shù)組進(jìn)行初始化,這里對(duì)于每種類型的初始值都有不同。
數(shù)據(jù)類型 | 默認(rèn)初始值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
char | ‘\u0000' |
String | null |
boolean | false |
(2)數(shù)組長(zhǎng)度的使用
在Java中,可以直接調(diào)用Java中自帶的方法來(lái)求得數(shù)組的長(zhǎng)度,使用的方法為
數(shù)組名.length
String[] f= new String[5]; int len = f.length; System.out.println(len);//5
(3)有關(guān)數(shù)組長(zhǎng)度的問(wèn)題
對(duì)于數(shù)組的長(zhǎng)度來(lái)說(shuō),在進(jìn)行開辟數(shù)組空間的時(shí)候就已經(jīng)確定了,但是在數(shù)組長(zhǎng)度定義的問(wèn)題上這里和c/c++有不同的區(qū)別,在Java中可以使用變量來(lái)進(jìn)行數(shù)組的初始化,例如下面的代碼,在Java中是被允許的。
int size = 10; int[] arr = new int[size];
(4)對(duì)于數(shù)組的訪問(wèn)
數(shù)組的索引相當(dāng)于門牌號(hào),對(duì)每一個(gè)元素來(lái)說(shuō)都有對(duì)應(yīng)的位置,如果要進(jìn)行訪問(wèn)就需要使用指定的索引位置來(lái)進(jìn)行訪問(wèn)
對(duì)于數(shù)組的訪問(wèn)范圍為[0,arr.length),左開右閉的區(qū)間范圍
但是使用這樣的方法來(lái)進(jìn)行訪問(wèn)數(shù)組中的每一個(gè)元素比較麻煩,下來(lái)有一種簡(jiǎn)單的方法來(lái)進(jìn)行數(shù)組的遍歷與訪問(wèn)每一個(gè)元素
(5)數(shù)組的遍歷
方法1:
使用普通的for循環(huán)來(lái)進(jìn)行來(lái)進(jìn)行訪問(wèn)每一個(gè)元素
方法2:
使用增強(qiáng)的for循環(huán)來(lái)進(jìn)行遍歷數(shù)組的每一個(gè)元素,相當(dāng)于對(duì)數(shù)組的拷貝
兩種方法的區(qū)別:
在遍歷數(shù)組的時(shí)候,兩種方法是沒(méi)有任何區(qū)別的,但是在進(jìn)行改變數(shù)組元素值的時(shí)候方法1就可以直接進(jìn)行數(shù)組元素的改變,但是方法2對(duì)于基本數(shù)據(jù)類型的數(shù)組是沒(méi)法來(lái)進(jìn)行改變的。
例題:
給一個(gè)數(shù)組的每一個(gè)元素都乘以2,這里只能用方法1來(lái)進(jìn)行改變,代碼如下:
//改變數(shù)組中的值 public static void transformArr(int[] arr){ for (int i = 0; i < arr.length; i++) { arr[i] *=2; } }
三.數(shù)組的類型
關(guān)于類型來(lái)分,共有兩種類型,一種是基本數(shù)據(jù)類型一種是引用數(shù)據(jù)類型
兩種類型的概念和區(qū)別
基本數(shù)據(jù)類型:基本數(shù)據(jù)類型創(chuàng)建的變量,稱為基本變量,該變量空間中直接存放的是其所對(duì)應(yīng)的值。
引用數(shù)據(jù)類型:引用數(shù)據(jù)類型創(chuàng)建的變量,一般稱為對(duì)象的引用,其空間中存儲(chǔ)的是對(duì)象所在空間的地址。
在Java中,數(shù)組的數(shù)據(jù)類型是引用數(shù)據(jù)類型,那么數(shù)組是如何進(jìn)行使用和分配空間的,首先我們需要知道jvm的內(nèi)存分布
分布圖如下所示:
1、每個(gè)部分?jǐn)?shù)據(jù)區(qū)的概念:
(1) 程序計(jì)數(shù)器 (PC Register): 只是一個(gè)很小的空間, 保存下一條執(zhí)行的指令的地址。
(2)虛擬機(jī)棧(JVM Stack): 與方法調(diào)用相關(guān)的一些信息,每個(gè)方法在執(zhí)行時(shí),都會(huì)先創(chuàng)建一個(gè)棧幀,棧幀中包含有:局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、返回地址以及其他的一些信息,保存的都是與方法執(zhí)行時(shí)相關(guān)的一些信息。比如:局部變量。當(dāng)方法運(yùn)行結(jié)束后,棧幀就被銷毀了,即棧幀中保存的數(shù)據(jù)也被銷毀了。
(3)本地方法棧(Native Method Stack): 本地方法棧與虛擬機(jī)棧的作用類似. 只不過(guò)保存的內(nèi)容是Native方法的局部變量. 在有些版本的 JVM 實(shí)現(xiàn)中(例如HotSpot), 本地方法棧和虛擬機(jī)棧是一起的。
(4)堆(Heap): JVM所管理的最大內(nèi)存區(qū)域. 使用 new 創(chuàng)建的對(duì)象一般在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是隨著程序開始運(yùn)行時(shí)而創(chuàng)建,隨著程序的退出而銷毀,堆中的數(shù)據(jù)只要還有在使用,就不會(huì)被銷毀。
(5)方法區(qū)(Method Area): 用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù). 方法編譯出的的字節(jié)碼就是保存在這個(gè)區(qū)域。
在數(shù)組這里我們只需要知道虛擬機(jī)棧和堆就可以了
2.數(shù)組在JVM當(dāng)中的使用情況
在這里以使用數(shù)組交換兩個(gè)數(shù)來(lái)了解數(shù)組在虛擬機(jī)是如何運(yùn)行的
(1)代碼:
public class Demo{ public static void swap(int[] a){ int tmp = a[0]; a[0] = a[1]; a[1] = tmp; } public static void main(String[] args) { int[] arr = {1,2}; System.out.println("-----交換前------"); System.out.println(Arrays.toString(arr)); swap(arr); System.out.println("-----交換后------"); System.out.println(Arrays.toString(arr)); } }
(2)運(yùn)行結(jié)果:
(3)在虛擬機(jī)中的運(yùn)行步驟
交換前執(zhí)行的結(jié)果:
數(shù)組開辟的空間是在堆中進(jìn)行開辟,但是在棧中相當(dāng)于存儲(chǔ)的是數(shù)組的首地址,所以在上面例子中,交換的是引用類型中的值,所以能夠進(jìn)行交換原來(lái)數(shù)組中值。
3.引用類型的注意事項(xiàng)
在使用引用類型數(shù)組的時(shí)候我們要注意我們改變的是引用類型中的引用還是引用類型中的內(nèi)容。
在上面的值交換中,我們改變的是引用類型中的內(nèi)容,那么接下來(lái)我們舉個(gè)例子來(lái)說(shuō)明一下改變引用類型的引用
代碼如下:
改變數(shù)組中的值
public class Demo{ public static void chaArr(int[] a){ int[] b= new int[3]; a = b; a[0]=100; a[1] = 200; } public static void main(String[] args) { int a[] = {10,20}; System.out.println("改變前--------"); System.out.println(Arrays.toString(a)); chaArr(a); System.out.println("改變后--------"); System.out.println(Arrays.toString(a)); } }
運(yùn)行結(jié)果:
我們可以發(fā)現(xiàn),在chaArr()方法中我們改變的值在數(shù)組中沒(méi)有發(fā)生變化,這是為什么,這是因?yàn)?,我們?cè)赾haArr()中將a的引用地址進(jìn)行了改變,之后操作的是新創(chuàng)建的數(shù)組b中的結(jié)果,所以a中的結(jié)果沒(méi)有發(fā)生改變,圖示如下:
所以在使用數(shù)組時(shí)要注意是否在中間發(fā)生了引用地址的改變。
四.關(guān)于引用類型的返回值
在之前學(xué)過(guò)的返回值都是基本數(shù)據(jù)類型中的返回值,在學(xué)過(guò)數(shù)組之后,我們知道引用類型也有返回值,接下來(lái)我使用返回值來(lái)求一個(gè)存放斐波那契數(shù)列結(jié)果的數(shù)組,如果所需要的數(shù)組大小<=0,則返回null,否則返回一個(gè)數(shù)組。
代碼如下:
public class Demo{ //返回一個(gè)斐波納契數(shù)列的數(shù)組 public static int[] fibArr(int n){ if(n<=0){ return null; } int[] fiArr = new int[n]; fiArr[0] = 1; if(n==1){ return fiArr; } fiArr[1] = 1; for(int i=2;i<n;i++){ fiArr[i]=fiArr[i-1]+fiArr[i-2]; } return fiArr; } public static void main(String[] args) { System.out.println(Arrays.toString(fibArr(10))); } }
前10項(xiàng)的輸出結(jié)果如下:
總結(jié)
到此這篇關(guān)于Java中數(shù)組的使用與注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Java數(shù)組使用與注意內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java I/O深入學(xué)習(xí)之File和RandomAccessFile
這篇文章主要介紹了Java I/O深入學(xué)習(xí)之File和RandomAccessFile, I/O系統(tǒng)即輸入/輸出系統(tǒng),對(duì)于一門程序語(yǔ)言來(lái)說(shuō),創(chuàng)建一個(gè)好的輸入/輸出系統(tǒng)并非易事。在充分理解Java I/O系統(tǒng)以便正確地運(yùn)用之前,我們需要學(xué)習(xí)相當(dāng)數(shù)量的類。,需要的朋友可以參考下2019-06-06關(guān)于SpringBoot mysql數(shù)據(jù)庫(kù)時(shí)區(qū)問(wèn)題
在后端開發(fā)過(guò)程中經(jīng)常會(huì)遇到幾個(gè)時(shí)區(qū)設(shè)置問(wèn)題,今天分幾種情況給大家介紹SpringBoot mysql數(shù)據(jù)庫(kù)時(shí)區(qū)問(wèn)題,感興趣的朋友跟隨小編一起看看吧2021-06-06Java實(shí)現(xiàn)驗(yàn)證文件名有效性的方法詳解
在本文中,我們將討論使用?Java?驗(yàn)證一個(gè)給定的字符串是否具有操作系統(tǒng)的有效文件名的不同方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-09-09java拋出異常后,后續(xù)代碼是否繼續(xù)執(zhí)行詳解
這篇文章主要給大家介紹了關(guān)于java拋出異常后,后續(xù)代碼是否繼續(xù)執(zhí)行詳?shù)南嚓P(guān)資料,在Java編程中,異常是當(dāng)程序執(zhí)行時(shí)遇到問(wèn)題時(shí)拋出的一種特殊情況,需要的朋友可以參考下2023-07-07JAVA利用HttpClient進(jìn)行POST請(qǐng)求(HTTPS)實(shí)例
下面小編就為大家?guī)?lái)一篇JAVA利用HttpClient進(jìn)行POST請(qǐng)求(HTTPS)實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起 小編過(guò)來(lái)看看吧2016-11-11Java 模擬數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java 模擬數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02