Java中數(shù)組的使用與注意事項詳解(推薦)
一.初始數(shù)組
數(shù)組的概念:數(shù)組就是一個用來存儲相同類型數(shù)據(jù)的一個容器。
為什么要使用數(shù)組?
當我們要存儲大量相同類型的時候,通過配合循環(huán)來使用就會大量減少代碼復(fù)雜程度
數(shù)組的特點:
(1)數(shù)組是一種引用類型.
(2)數(shù)組的長度是固定的.
(3)數(shù)組中每個元素的類型都是相同的.
二.數(shù)組的創(chuàng)建
對于數(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)動態(tài)初始化
int[] arr = new int[5];
在這里對于數(shù)組的初始化,千萬要注意下面這種情況是錯誤的初始化
int[] arr = new int[5]{1,2,3,4,5};
在這里是不能同時初始化兩次,這樣會編譯不通過,出現(xiàn)錯誤。
三.使用數(shù)組時的注意事項
(1)初始化問題
在創(chuàng)建數(shù)組后,如果沒有進行賦初值,Java會默認對數(shù)組進行初始化,這里對于每種類型的初始值都有不同。
| 數(shù)據(jù)類型 | 默認初始值 |
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0 |
| float | 0.0 |
| double | 0.0 |
| char | ‘\u0000' |
| String | null |
| boolean | false |
(2)數(shù)組長度的使用
在Java中,可以直接調(diào)用Java中自帶的方法來求得數(shù)組的長度,使用的方法為
數(shù)組名.length
String[] f= new String[5];
int len = f.length;
System.out.println(len);//5
(3)有關(guān)數(shù)組長度的問題
對于數(shù)組的長度來說,在進行開辟數(shù)組空間的時候就已經(jīng)確定了,但是在數(shù)組長度定義的問題上這里和c/c++有不同的區(qū)別,在Java中可以使用變量來進行數(shù)組的初始化,例如下面的代碼,在Java中是被允許的。
int size = 10; int[] arr = new int[size];
(4)對于數(shù)組的訪問

數(shù)組的索引相當于門牌號,對每一個元素來說都有對應(yīng)的位置,如果要進行訪問就需要使用指定的索引位置來進行訪問

對于數(shù)組的訪問范圍為[0,arr.length),左開右閉的區(qū)間范圍
但是使用這樣的方法來進行訪問數(shù)組中的每一個元素比較麻煩,下來有一種簡單的方法來進行數(shù)組的遍歷與訪問每一個元素
(5)數(shù)組的遍歷
方法1:
使用普通的for循環(huán)來進行來進行訪問每一個元素

方法2:
使用增強的for循環(huán)來進行遍歷數(shù)組的每一個元素,相當于對數(shù)組的拷貝

兩種方法的區(qū)別:
在遍歷數(shù)組的時候,兩種方法是沒有任何區(qū)別的,但是在進行改變數(shù)組元素值的時候方法1就可以直接進行數(shù)組元素的改變,但是方法2對于基本數(shù)據(jù)類型的數(shù)組是沒法來進行改變的。
例題:
給一個數(shù)組的每一個元素都乘以2,這里只能用方法1來進行改變,代碼如下:
//改變數(shù)組中的值
public static void transformArr(int[] arr){
for (int i = 0; i < arr.length; i++) {
arr[i] *=2;
}
}
三.數(shù)組的類型
關(guān)于類型來分,共有兩種類型,一種是基本數(shù)據(jù)類型一種是引用數(shù)據(jù)類型
兩種類型的概念和區(qū)別
基本數(shù)據(jù)類型:基本數(shù)據(jù)類型創(chuàng)建的變量,稱為基本變量,該變量空間中直接存放的是其所對應(yīng)的值。
引用數(shù)據(jù)類型:引用數(shù)據(jù)類型創(chuàng)建的變量,一般稱為對象的引用,其空間中存儲的是對象所在空間的地址。
在Java中,數(shù)組的數(shù)據(jù)類型是引用數(shù)據(jù)類型,那么數(shù)組是如何進行使用和分配空間的,首先我們需要知道jvm的內(nèi)存分布
分布圖如下所示:

1、每個部分數(shù)據(jù)區(qū)的概念:
(1) 程序計數(shù)器 (PC Register): 只是一個很小的空間, 保存下一條執(zhí)行的指令的地址。
(2)虛擬機棧(JVM Stack): 與方法調(diào)用相關(guān)的一些信息,每個方法在執(zhí)行時,都會先創(chuàng)建一個棧幀,棧幀中包含有:局部變量表、操作數(shù)棧、動態(tài)鏈接、返回地址以及其他的一些信息,保存的都是與方法執(zhí)行時相關(guān)的一些信息。比如:局部變量。當方法運行結(jié)束后,棧幀就被銷毀了,即棧幀中保存的數(shù)據(jù)也被銷毀了。
(3)本地方法棧(Native Method Stack): 本地方法棧與虛擬機棧的作用類似. 只不過保存的內(nèi)容是Native方法的局部變量. 在有些版本的 JVM 實現(xiàn)中(例如HotSpot), 本地方法棧和虛擬機棧是一起的。
(4)堆(Heap): JVM所管理的最大內(nèi)存區(qū)域. 使用 new 創(chuàng)建的對象一般在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是隨著程序開始運行時而創(chuàng)建,隨著程序的退出而銷毀,堆中的數(shù)據(jù)只要還有在使用,就不會被銷毀。
(5)方法區(qū)(Method Area): 用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù). 方法編譯出的的字節(jié)碼就是保存在這個區(qū)域。
在數(shù)組這里我們只需要知道虛擬機棧和堆就可以了
2.數(shù)組在JVM當中的使用情況
在這里以使用數(shù)組交換兩個數(shù)來了解數(shù)組在虛擬機是如何運行的
(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)運行結(jié)果:

(3)在虛擬機中的運行步驟
交換前執(zhí)行的結(jié)果:

數(shù)組開辟的空間是在堆中進行開辟,但是在棧中相當于存儲的是數(shù)組的首地址,所以在上面例子中,交換的是引用類型中的值,所以能夠進行交換原來數(shù)組中值。
3.引用類型的注意事項
在使用引用類型數(shù)組的時候我們要注意我們改變的是引用類型中的引用還是引用類型中的內(nèi)容。
在上面的值交換中,我們改變的是引用類型中的內(nèi)容,那么接下來我們舉個例子來說明一下改變引用類型的引用
代碼如下:
改變數(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));
}
}
運行結(jié)果:

我們可以發(fā)現(xiàn),在chaArr()方法中我們改變的值在數(shù)組中沒有發(fā)生變化,這是為什么,這是因為,我們在chaArr()中將a的引用地址進行了改變,之后操作的是新創(chuàng)建的數(shù)組b中的結(jié)果,所以a中的結(jié)果沒有發(fā)生改變,圖示如下:

所以在使用數(shù)組時要注意是否在中間發(fā)生了引用地址的改變。
四.關(guān)于引用類型的返回值
在之前學(xué)過的返回值都是基本數(shù)據(jù)類型中的返回值,在學(xué)過數(shù)組之后,我們知道引用類型也有返回值,接下來我使用返回值來求一個存放斐波那契數(shù)列結(jié)果的數(shù)組,如果所需要的數(shù)組大小<=0,則返回null,否則返回一個數(shù)組。
代碼如下:
public class Demo{
//返回一個斐波納契數(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項的輸出結(jié)果如下:

總結(jié)
到此這篇關(guān)于Java中數(shù)組的使用與注意事項的文章就介紹到這了,更多相關(guān)Java數(shù)組使用與注意內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)組與List之間相互轉(zhuǎn)換的方法詳解
本文是對數(shù)組與List之間相互轉(zhuǎn)換的方法進行了詳細的分析介紹,需要的朋友可以過來參考下。希望對大家有所幫助2013-10-10
Java使用@Autowired注解獲取對象為null的幾種情況及解決方法
這篇文章主要給大家介紹了使用@Autowired注解獲取對象為null的幾種情況以及?解決方法,文中有詳細的代碼示例講解,具有一定的參考價值,需要的朋友可以參考下2023-09-09
Java中ThreadLocal?導(dǎo)致內(nèi)存?OOM?的原因分析
這篇文章主要介紹了Java中ThreadLocal導(dǎo)致內(nèi)存OOM的原因分析,文章基于Java的相關(guān)內(nèi)容展開ThreadLocal導(dǎo)致內(nèi)存OOM的原因分析,需要的小伙v阿布可以參考一下2022-05-05
詳解用maven搭建springboot環(huán)境的方法
本篇文章主要介紹了詳解用maven搭建springboot環(huán)境的方法,這里整理了詳細的代碼,非常具有實用價值,有需要的小伙伴可以參考下2017-08-08
深入理解@component與@Configuration注解
這篇文章主要介紹了深入理解@component與@Configuration注解,從Spring3.0,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內(nèi)部包含有一個或多個被@Bean注解的方法,這些方法將會被掃描,并用于構(gòu)建bean定義,初始化Spring容器,需要的朋友可以參考下2023-11-11
Hibernate環(huán)境搭建與配置方法(Hello world配置文件版)
這篇文章主要介紹了Hibernate環(huán)境搭建與配置方法,這里演示Hello world配置文件版的具體實現(xiàn)步驟與相關(guān)代碼,需要的朋友可以參考下2016-03-03
解決springboot中配置過濾器以及可能出現(xiàn)的問題
這篇文章主要介紹了解決springboot中配置過濾器以及可能出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java Swing實現(xiàn)簡單的體重指數(shù)(BMI)計算器功能示例
這篇文章主要介紹了Java Swing實現(xiàn)簡單的體重指數(shù)(BMI)計算器功能,涉及Java Swing窗口組件布局、響應(yīng)及數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下2017-12-12

