您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Java中數組使用與注意事項有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
數組的概念:數組就是一個用來存儲相同類型數據的一個容器。
為什么要使用數組?
當我們要存儲大量相同類型的時候,通過配合循環來使用就會大量減少代碼復雜程度
數組的特點:
(1)數組是一種引用類型.
(2)數組的長度是固定的.
(3)數組中每個元素的類型都是相同的.
對于數組的創建,這里和c/c++還是有些不同的,這里創建數組的方法共有三種方法,下面就以數組里面元素為int類型,數組大小為5的舉例,如下所示:
(1) 靜態初始化
int[] arr = {1,2,3,4,5}
int[] arr = new int[]{1,2,3,4,5};
(2)動態初始化
int[] arr = new int[5];
在這里對于數組的初始化,千萬要注意下面這種情況是錯誤的初始化
int[] arr = new int[5]{1,2,3,4,5};
在這里是不能同時初始化兩次,這樣會編譯不通過,出現錯誤。
在創建數組后,如果沒有進行賦初值,Java會默認對數組進行初始化,這里對于每種類型的初始值都有不同。
數據類型 | 默認初始值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
char | ‘\u0000' |
String | null |
boolean | false |
在Java中,可以直接調用Java中自帶的方法來求得數組的長度,使用的方法為
數組名.length
String[] f= new String[5]; int len = f.length; System.out.println(len);//5
對于數組的長度來說,在進行開辟數組空間的時候就已經確定了,但是在數組長度定義的問題上這里和c/c++有不同的區別,在Java中可以使用變量來進行數組的初始化,例如下面的代碼,在Java中是被允許的。
int size = 10; int[] arr = new int[size];
數組的索引相當于門牌號,對每一個元素來說都有對應的位置,如果要進行訪問就需要使用指定的索引位置來進行訪問
對于數組的訪問范圍為[0,arr.length),左開右閉的區間范圍
但是使用這樣的方法來進行訪問數組中的每一個元素比較麻煩,下來有一種簡單的方法來進行數組的遍歷與訪問每一個元素
方法1:
使用普通的for循環來進行來進行訪問每一個元素
方法2:
使用增強的for循環來進行遍歷數組的每一個元素,相當于對數組的拷貝
兩種方法的區別:
在遍歷數組的時候,兩種方法是沒有任何區別的,但是在進行改變數組元素值的時候方法1就可以直接進行數組元素的改變,但是方法2對于基本數據類型的數組是沒法來進行改變的。
例題:
給一個數組的每一個元素都乘以2,這里只能用方法1來進行改變,代碼如下:
//改變數組中的值 public static void transformArr(int[] arr){ for (int i = 0; i < arr.length; i++) { arr[i] *=2; } }
關于類型來分,共有兩種類型,一種是基本數據類型一種是引用數據類型
兩種類型的概念和區別
基本數據類型:基本數據類型創建的變量,稱為基本變量,該變量空間中直接存放的是其所對應的值。
引用數據類型:引用數據類型創建的變量,一般稱為對象的引用,其空間中存儲的是對象所在空間的地址。
在Java中,數組的數據類型是引用數據類型,那么數組是如何進行使用和分配空間的,首先我們需要知道jvm的內存分布
分布圖如下所示:
(1) 程序計數器 (PC Register): 只是一個很小的空間, 保存下一條執行的指令的地址。
(2)虛擬機棧(JVM Stack): 與方法調用相關的一些信息,每個方法在執行時,都會先創建一個棧幀,棧幀中包含有:局部變量表、操作數棧、動態鏈接、返回地址以及其他的一些信息,保存的都是與方法執行時相關的一些信息。比如:局部變量。當方法運行結束后,棧幀就被銷毀了,即棧幀中保存的數據也被銷毀了。
(3)本地方法棧(Native Method Stack): 本地方法棧與虛擬機棧的作用類似. 只不過保存的內容是Native方法的局部變量. 在有些版本的 JVM 實現中(例如HotSpot), 本地方法棧和虛擬機棧是一起的。
(4)堆(Heap): JVM所管理的最大內存區域. 使用 new 創建的對象一般在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是隨著程序開始運行時而創建,隨著程序的退出而銷毀,堆中的數據只要還有在使用,就不會被銷毀。
(5)方法區(Method Area): 用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據. 方法編譯出的的字節碼就是保存在這個區域。
在數組這里我們只需要知道虛擬機棧和堆就可以了
在這里以使用數組交換兩個數來了解數組在虛擬機是如何運行的
(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)運行結果:
(3)在虛擬機中的運行步驟
交換前執行的結果:
數組開辟的空間是在堆中進行開辟,但是在棧中相當于存儲的是數組的首地址,所以在上面例子中,交換的是引用類型中的值,所以能夠進行交換原來數組中值。
在使用引用類型數組的時候我們要注意我們改變的是引用類型中的引用還是引用類型中的內容。
在上面的值交換中,我們改變的是引用類型中的內容,那么接下來我們舉個例子來說明一下改變引用類型的引用
代碼如下:
改變數組中的值
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)); } }
運行結果:
我們可以發現,在chaArr()方法中我們改變的值在數組中沒有發生變化,這是為什么,這是因為,我們在chaArr()中將a的引用地址進行了改變,之后操作的是新創建的數組b中的結果,所以a中的結果沒有發生改變,圖示如下:
所以在使用數組時要注意是否在中間發生了引用地址的改變。
在之前學過的返回值都是基本數據類型中的返回值,在學過數組之后,我們知道引用類型也有返回值,接下來我使用返回值來求一個存放斐波那契數列結果的數組,如果所需要的數組大小<=0,則返回null,否則返回一個數組。
代碼如下:
public class Demo{ //返回一個斐波納契數列的數組 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項的輸出結果如下:
關于“Java中數組使用與注意事項有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。