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};
在這裡是不能同時初始化兩次,這樣會編譯不通過,出現錯誤。
三.使用數組時的註意事項
(1)初始化問題
在創建數組後,如果沒有進行賦初值,Java會默認對數組進行初始化,這裡對於每種類型的初始值都有不同。
數據類型 | 默認初始值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
char | ‘\u0000′ |
String | null |
boolean | false |
(2)數組長度的使用
在Java中,可以直接調用Java中自帶的方法來求得數組的長度,使用的方法為
數組名.length
String[] f= new String[5]; int len = f.length; System.out.println(len);//5
(3)有關數組長度的問題
對於數組的長度來說,在進行開辟數組空間的時候就已經確定瞭,但是在數組長度定義的問題上這裡和c/c++有不同的區別,在Java中可以使用變量來進行數組的初始化,例如下面的代碼,在Java中是被允許的。
int size = 10; int[] arr = new int[size];
(4)對於數組的訪問
數組的索引相當於門牌號,對每一個元素來說都有對應的位置,如果要進行訪問就需要使用指定的索引位置來進行訪問
對於數組的訪問范圍為[0,arr.length),左開右閉的區間范圍
但是使用這樣的方法來進行訪問數組中的每一個元素比較麻煩,下來有一種簡單的方法來進行數組的遍歷與訪問每一個元素
(5)數組的遍歷
方法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、每個部分數據區的概念:
(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): 用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據. 方法編譯出的的字節碼就是保存在這個區域。
在數組這裡我們隻需要知道虛擬機棧和堆就可以瞭
2.數組在JVM當中的使用情況
在這裡以使用數組交換兩個數來瞭解數組在虛擬機是如何運行的
(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)在虛擬機中的運行步驟
交換前執行的結果:
數組開辟的空間是在堆中進行開辟,但是在棧中相當於存儲的是數組的首地址,所以在上面例子中,交換的是引用類型中的值,所以能夠進行交換原來數組中值。
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中數組的使用與註意事項的文章就介紹到這瞭,更多相關Java數組使用與註意內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java中數組的定義與使用
- Java常問面試內容–數組、聲明、初始化、冒泡、多維數組、稀疏數組
- Java打印數組的三種方法整理
- java數組算法例題代碼詳解(冒泡排序,選擇排序,找最大值、最小值,添加、刪除元素等)
- Java基礎語法之二維數組詳解