Java由淺入深學(xué)習(xí)數(shù)組的使用
一、前言
學(xué)習(xí)概述:前八天我們學(xué)習(xí)了語法基礎(chǔ)、運算符與表達(dá)式、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu),今天主要學(xué)習(xí)數(shù)組的定義、相關(guān)的屬性方法、數(shù)組存儲的內(nèi)存圖、常見錯誤
學(xué)習(xí)目標(biāo):掌握數(shù)組的兩種定義方法、相關(guān)屬性、了解內(nèi)存原理、錯誤解決
二、數(shù)組的定義
1.概述
假如有一個班同學(xué)的成績需要存儲,該使用什么方法呢?
像我們之前學(xué)習(xí)的,可以定義多個變量存儲不同的成績。但是要有1000多個學(xué)生,那么到定義1000多個變量嗎?當(dāng)然不行,這就需要用到我們的數(shù)組了。
2.靜態(tài)初始化數(shù)組
特點:定義數(shù)組的時候直接給數(shù)組賦值,由系統(tǒng)決定數(shù)組長度
通用格式:
數(shù)據(jù)類型[] 數(shù)組名 = { 元素1,元素2 ,元素3,… };
例如:
int [] array= {1,2,3,4,5};
double[] scores = {88.5, 99.5, 59.5};
3.動態(tài)初始化數(shù)組
特點:定義數(shù)組時確了定元素的類型和數(shù)組的長度,之后存入數(shù)據(jù)
通用格式:
數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[長度];
例如:
int [] array= new int[5];
double[] scores = new double[3];
默認(rèn)值:
數(shù)據(jù)類型 | 具體定義類型 | 默認(rèn)值 |
基本類型 | byte、short、char、int、long | 0 |
float、double | 0.0 | |
boolean | false | |
引用類型 | 類、接口、數(shù)組、String | null |
4.總結(jié)
- 數(shù)組適合同種類型的大量數(shù)據(jù)
- 靜態(tài)初始化適合知道了元素值
- 動態(tài)初始化適合不清楚存入哪些數(shù)據(jù)
三、數(shù)組的屬性
1.訪問
一般訪問數(shù)組的方式為:
數(shù)組名稱[索引]
例題:
//靜態(tài)初始化數(shù)組 int [] array= {1,2,3,4,5}; System.out.println(array[0]);//輸出 1 System.out.println(array[1]);//輸出 2 System.out.println(array[3]);//輸出 4
2.長度
長度可以直接調(diào)用length得到數(shù)組的長度。
例題:
//靜態(tài)初始化數(shù)組 int [] array= {1,2,3,4,5}; System.out.println(array.length);//調(diào)用方法,輸出長度 5 //最大索引array.length-1
3.遍歷
遍歷就是一個一個數(shù)組元素的訪問,主要應(yīng)用在搜索、數(shù)據(jù)統(tǒng)計......
我們之前學(xué)了循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu),下面通過for循環(huán)遍歷一個數(shù)組
例題:
給定元素 {10,8,9,4,5,6,8,71,2,3,9,99},用靜態(tài)數(shù)組存儲并輸出數(shù)組中大于5的元素?
編碼實現(xiàn):
//靜態(tài)初始化數(shù)組 int [] array= {10,8,9,4,5,6,8,71,2,3,9,99}; for(int i=0;i<array.length;i++) { if(array[i]>5) System.out.println(array[i]); }
輸出結(jié)果:
10 8 9 6 8 71 9 99
四、內(nèi)存圖
- Java在程序運行時,需要在內(nèi)存中分配空間,對空間進(jìn)行了不同區(qū)域的劃分。
- 棧內(nèi)存:存儲局部變量,使用完畢立即消失
- 堆內(nèi)存:存儲new 出來的內(nèi)容(對象、實體),地址使用完畢在垃圾回收器空閑時回收
1.單數(shù)組內(nèi)存圖
下面的創(chuàng)建數(shù)組代碼,實現(xiàn)它的內(nèi)存關(guān)系圖
編碼實現(xiàn):
//動態(tài)初始化數(shù)組 int [] arr=new int[3]; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); //修改值 arr[0]=100; arr[2]=200; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]);
輸出結(jié)果:
[I@15db9742
0
0
0
[I@15db9742
100
0
200
原理講解:
- 動態(tài)初始化先在堆內(nèi)存生成一個new 一個arr地址值,具體看編譯器的結(jié)果,這里假設(shè)001。由于動態(tài)初始化,所以每個元素都有一個初始值,具體可以看上面的表。我們輸出元素,先訪問數(shù)組名地址,到堆內(nèi)存下標(biāo),再輸出元素值。
- 修改數(shù)組值,歷程和查看相同,只不過多了一步修改的過程,如下圖:
2.多數(shù)組內(nèi)存圖
多個數(shù)組和單數(shù)組內(nèi)存使用原理相同,這里我就不過多講述了。
3.數(shù)組指向相同內(nèi)存
假如我們把兩個數(shù)組的地址值改為相同,修改后的結(jié)果該是如何,如下面的代碼。
編碼實現(xiàn):
//動態(tài)初始化數(shù)組 int [] arr=new int[3]; arr[0]=100; arr[1]=200; arr[2]=300; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); int [] arr2=arr; arr2[0]=111; arr2[1]=222; arr2[2]=333; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr2); System.out.println(arr2[0]);
輸出結(jié)果:
[I@15db9742
100
200
300
[I@15db9742
111
[I@15db9742
111
原理講解:
第一個數(shù)組在堆內(nèi)存的地址為001,第二個數(shù)組也為001,所以修改第二個數(shù)組的值,其實都是同一個數(shù)組內(nèi)存。第一個數(shù)組的值也會隨著改變,結(jié)果如下:
五、常見問題
1.索引越界
//靜態(tài)初始化數(shù)組 int [] array= {1,2,3}; System.out.println(array[3]);
- 上面的代碼運行之后,會出現(xiàn)下面的報錯異常:
- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
- 解釋:我們靜態(tài)化初始數(shù)組給了3個數(shù)字,最大索引為2,當(dāng)我們訪問3時,就會報錯
2.空指針異常
//動態(tài)初始化數(shù)組 int [] array= new int[3]; array=null; System.out.println(array[0]);
- 上面的代碼運行之后,會出現(xiàn)下面的報錯異常:
- Exception in thread "main" java.lang.NullPointerException
- 解釋:我們將數(shù)組置為null,導(dǎo)致訪問的數(shù)組不指向堆內(nèi)存的數(shù)據(jù)
到此這篇關(guān)于Java由淺入深學(xué)習(xí)數(shù)組的使用的文章就介紹到這了,更多相關(guān)Java數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot利用自定義注解實現(xiàn)隱私數(shù)據(jù)脫敏(加密顯示)的解決方案
這兩天在整改等保測出的問題,里面有一個“用戶信息泄露”的風(fēng)險項(就是后臺系統(tǒng)里用戶的一些隱私數(shù)據(jù)直接明文顯示了),其實指的就是要做數(shù)據(jù)脫敏,本文給大家介紹了SpringBoot利用自定義注解實現(xiàn)隱私數(shù)據(jù)脫敏(加密顯示)的解決方案,需要的朋友可以參考下2023-11-11springMVC 用戶登錄權(quán)限驗證實現(xiàn)過程解析
這篇文章主要介紹了springMVC 用戶登錄權(quán)限驗證實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11統(tǒng)一建模語言_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了統(tǒng)一建模語言的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-06-06解決執(zhí)行Junit單元測試報錯java.lang.ClassNotFoundException問題
這篇文章主要介紹了解決執(zhí)行Junit單元測試報錯java.lang.ClassNotFoundException問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11