Java中的數(shù)組使用詳解及練習
一、數(shù)組的概念與基本要素
1.概念
數(shù)組(array)是一種最簡單的復(fù)合數(shù)據(jù)類型,它是有序數(shù)據(jù)的集合,數(shù)組中的每個元素具有相同的數(shù)據(jù)類型,可以用一個統(tǒng)一的數(shù)組名和不同的下標來確定數(shù)組中唯一的元素。根據(jù)數(shù)組的維度,可以將其分為一維數(shù)組、二維數(shù)組和多維數(shù)組等。
2.基本要素
一個數(shù)組由4個基本元素構(gòu)成:數(shù)組名稱、數(shù)組元素、元素索引、數(shù)據(jù)類型。
數(shù)組的索引就相當于C語言中數(shù)組的下標,關(guān)于數(shù)組的長度可以用數(shù)組名.length求出。
int[] array = {1,2,3}; int sz = arr.length;
3.數(shù)組的定義
關(guān)于數(shù)組的定義,其實有很多種定義方法,接下來,我會給你們介紹幾種定義數(shù)組的方法。
//第一種定義數(shù)組的方法: int[] array1 = {1,2,3};//直接賦值(靜態(tài)初始化) //int[]是數(shù)組的類型,array為數(shù)組名,隨意取名字 //第二種定義數(shù)組的方法: int[] array2 = new int[]{1,2,3,4};//數(shù)組的動態(tài)初始化 //第三種定義數(shù)組的方法: int[] array3 = new int[10];//只是分配了內(nèi)存,但是沒有進行賦值,默認值都是0, //第四種定義數(shù)組的方法: int[] array4; array = new int[]{1,2,3};//一定要為數(shù)組符初值,不然編譯器會報錯,
對于沒有賦初值的數(shù)組,編譯器會自動賦值,以下表格是不同類型的數(shù)組,初值大?。?/p>
類型 | 初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0f |
double | 0.0 |
char | ‘/u0000’ |
boolean | false |
4.注意事項
- 靜態(tài)初始化雖然沒有指定數(shù)組的長度,編譯器在編譯時會根據(jù){}中元素個數(shù)來確定數(shù)組的長度。
- 靜態(tài)初始化時, {}中數(shù)據(jù)類型必須與[]前數(shù)據(jù)類型一致。
- 靜態(tài)初始化可以簡寫,省去后面的new T[]。T可以為任意數(shù)據(jù)類型。
- 如果數(shù)組中存儲元素類型為引用類型,默認值為null。
二、數(shù)組的使用
1.對數(shù)組中的元素進行訪問
數(shù)組在內(nèi)存中是一段連續(xù)的空間,空間的編號都是從0開始的,依次遞增,該編號稱為數(shù)組的下標,數(shù)組可以通過索引訪問其任意位置的元素。
int[] array = {1,2,3,4,5,6,7,8}; System.out.println(array[0]);//1 System.out.println(array[1]);//2 System.out.println(array[2]);//3 System.out.println(array[3]);//4 System.out.println(array[4]);//5 //當然也可以對數(shù)組中的元素進行修改,、 array[0]=111; System.out.println(array[0]);//111
2.注意事項
(1)數(shù)組是一段連續(xù)的內(nèi)存空間,因此支持隨機訪問,即通過下標訪問快速訪問數(shù)組中任意位置的元素。
(2)下標從0開始,介于[0, N)之間不包含N,N為元素個數(shù),不能越界,否則會報出下標越界異常。
所以在訪問數(shù)組元素時一定不要越界?。?!
3.對數(shù)組的遍歷
對于什么是對數(shù)組的遍歷,就是將數(shù)組的元素全都訪問一遍,如將數(shù)組中的全部元素的打印一遍。
第一種數(shù)組遍歷方法:直接打印數(shù)組中的每一個元素
Demo:
int[] array = {1,2,3,4}; System.out.println(array[0]); System.out.println(array[1]); System.out.println(array[2]); System.out.println(array[3]);
本方法對于元素個數(shù)較少的數(shù)組來說可以應(yīng)用,但對于有幾十個元素的數(shù)組來說,太麻煩了,接下來為大家講解第二種方法。
第二種數(shù)組遍歷的方法:采用for循環(huán)打印
Demo:
int[] array = {1,2,3,4}; for(int i = 0;i < array.length;i++) { System.out.print(array[i]); }
第三種數(shù)組遍歷的方法:采用foreach的方式
Demo:
int[] array = {1,2,3,4,5}; for(int x : array) { System.out.print(x+" "); }
foreach的語法格式:冒號右邊寫數(shù)組名,左邊寫由數(shù)組當中數(shù)據(jù)類型定義的變量。
但是foreach也有局限性,如果要求去訪問數(shù)組中的某一個元素的時候,就不能進行訪問,顯然這時的for循環(huán)就占據(jù)了優(yōu)勢。
第四種遍歷數(shù)組的方法:采用專門的工具
Demo:
import java.util.Arrays; int[] array = {1,2,3,4,5}; String ret = Arrays.toString(array);//將數(shù)組轉(zhuǎn)換成字符串,然后返回. System.out.println(ret);
注:要使用Arrays這個工具時要導(dǎo)入其專有的包!
三、數(shù)組在內(nèi)存的存在形式
1.數(shù)組是一種引用變量
基本數(shù)據(jù)類型創(chuàng)建的變量,稱為基本變量,該變量空間中直接存放的是其所對應(yīng)的值;而引用數(shù)據(jù)類型創(chuàng)建的變量,一般稱為對象的引用,其空間中存儲的是對象所在空間的地址,數(shù)組就是一種引用數(shù)據(jù)類型。
int a = 10; int b = 20; int[] array =new int[]{1,2,3,4};
在上述代碼中,a、b、arr,都是方法內(nèi)部的變量,因此其空間都在main方法對應(yīng)的棧幀中分配。a、b是內(nèi)置類型的變量,因此其空間中保存的就是給該變量初始化的值。array是數(shù)組類型的引用變量,其內(nèi)部保存的內(nèi)容可以簡單理解成是數(shù)組在堆空間中的首地址。
從圖中可以看出,引用變量與基本數(shù)據(jù)類型的變量的不同,引用變量不會存儲對象本身,可以簡單理解成存儲的是對象在堆中空間的起始地址。通過該地址,引用變量便可以去操作對象,(但其實這“地址”是經(jīng)過哈希得到的),此前不要求掌握該知識點。
2了解引用變量(數(shù)組)
Demo:
int[] array1 = {1,2,3,4}; System.out.print(Arrays.toString(array1));//打印[1,2,3,4] int[] array2 = array1; array2[1] = 99; System.out.print(Arrays.toString(array1));//打印[1,99,3,4] System.out.print(Arrays.toString(array2));//打印[1,99,3,4]
代碼的解析:
首先創(chuàng)建一個數(shù)組array1,并初始化賦值為1,2,3,4,然后打印數(shù)組array1,接著申請另一款空間,用來創(chuàng)建array2,且array2=array1,說明兩個數(shù)組都指向同一塊空間,修改array2中的第二個元素也就相當于修改了array1中對應(yīng)的元素。
3.注意事項
(1)一個引用不能同時指向多個對象例:
(2)一個對象可以被多個引用所指向例:
(3)
int[] array = 0; /*這種寫法是錯誤的,因為0是一種基本數(shù)據(jù)類型, *而array是一種引用數(shù)據(jù)類型,如果將0改成null就不會錯。 *即代表這個引用不指向任何對象 */
注:null在Java中表示空引用,也就是一個不指向?qū)ο蟮囊?,并不?的意思。
四、數(shù)組的應(yīng)用場景
1.用來保存數(shù)據(jù)
Demo:
int[] array = {1,2,3}; for(int i = 0;i < array.length;i++ ) { System.out.print(array[i]); }
2.數(shù)組作為方法的參數(shù)
Demo:
public class TestDemo { public static void func1 (int[] array1) { array = new int[10]; } public static void func2 (int[] array) { array[0] = 99; } public static void main(String[] args) { int[] array = {1,2,3,4}; func1(array); System.out.println(Arrays.toString(array)); func2(array); System.out.println(Arrays.toString(array)); } }
代碼解釋:對func1方法進行解釋就行,func2同理
形參的指向改變不會影響實參的指向改變!?。?/strong>
3.數(shù)組作為方法的返回值
Demo:
public class TestDemo { public static int[] func() { int[] array = {1,2,3,4}; return array; } public static void main(String[] args) { int[] ret = func(); System.out.println(Arrays.toString(ret)); } }
五、數(shù)組的練習
小伙伴們,也可以直接去寫一下,再過來看示例代碼,增強自己的代碼能力。
1.數(shù)組轉(zhuǎn)成字符串
Demo:
//第一種是利用編譯器自帶的工具 int[] array = {1,2,3}; String ret = Arrays.toString(array); System.out,print(ret); //第二種利用自己寫的方法去解決 public class TestDemo { public static String mytoString(int[] arr) { if(arr == null){ return "null"; } String ret = "["; for(int i=0;i<arr.length;i++) { ret+=arr[i]; if(i!=arr.length-1) { ret+=","; } } ret+="]"; return ret; } public static void main(String[] args) { int[] array = {1,2,3,4,5,6}; String ret = mytoString(array); System.out.println(ret); } //打印結(jié)果為 [1,2,3,4,5,6]
2.數(shù)組的拷貝
本練習還是采用兩種方式,一種是編譯器自帶的,另一種是自己所寫的方法。
下面是錯誤代碼?。?!
/* int[] array1 = {1,2,3}; int[] array2 = array1; */ //這不是對數(shù)組的拷貝,因為沒有產(chǎn)生新的空間
Demo:
//第一種:自己寫的方法 public class TestDemo { public static void main(String[] args) { int[] array1 = {1,2,3,4}; int[] array2 = new int[array1.length]; for(int i=0;i<array1.length;i++) { array2[i]=array1[i]; } System.out.println(Arrays.toString(array1)); System.out.println("復(fù)制之后的數(shù)組為:"); System.out.println(Arrays.toString(array2)); } } //最后輸出為: [1,2,3,4] 復(fù)制之后的數(shù)組為: [1,2,3,4] //第二種編譯器自帶的方法 import java.util.Arrays; int[] array1 = {1,2,3,4}; int[] array2 = Arrays.copyOf(array1,array1.length); System.out.println(Arrays.toString(array1)); System.out.println(Arrays.toString(array2)); //最后輸出為: [1,2,3,4] [1,2,3,4]
顯然自己寫的方法沒有編譯器自帶的工具簡潔,但是不能說有了這些工具就可以不用寫代碼了,自己的能力還是要加強,這些工具只是幫我們減輕了負擔,但是原理還是要自己弄懂。
3.求數(shù)組的平均值
由于這道題比較簡單,本博主直接就給答案咯。
Demo:
public class TestDemo { public static void main(String[] args) { int[] array = {23,45,2,74,86,24}; int sum = 0 ; double ave = 0.0f; for(int i=0; i<array.length;i++) { sum=sum + array[i]; } ave = sum/array.length; System.out.println(ave); } } //最后結(jié)果: 42.0
4.數(shù)組排序(冒泡排序)
算法思路:
- 將數(shù)組中相鄰元素從前往后依次進行比較,如果前一個元素比后一個元素大,則交換,一趟下來后最大元素就在數(shù)組的末尾
- 依次從上上述過程,直到數(shù)組中所有的元素都排列好
Demo:
public class TestDemo { public static void main(String[] args) { int[] array = {23,4,53,1,765,52,356,9,7,2,324}; System.out.println("排序之前的數(shù)組:"); System.out.println(Arrays.toString(array)); for(int j = 1;j<array.length;j++) { for(int i = 0;i<array.length-j;i++) { if(array[i]>array[i+1]) { int tmp = array[i]; //交換數(shù)據(jù) array[i] = array[i+1]; array[i+1] = tmp; } } } System.out.println("排序之后的數(shù)組:"); System.out.println(Arrays.toString(array)); } } //排序之前的數(shù)組: [23, 4, 53, 1, 765, 52, 356, 9, 7, 2, 324] //排序之后的數(shù)組: [1, 2, 4, 7, 9, 23, 52, 53, 324, 356, 765]
5.數(shù)組逆序
題目理解:就是給定一個數(shù)組,將其倒序輸出。
思路:
先定義兩個下標分別指向數(shù)組的第一個元素和最后一個元素,將數(shù)組中的第一個元素和最后一個元素交換位置,然后指向第一個元素的下標進行加加,指向最后一個元素的下標進行減減。
Demo:
public class TestDemo { public static void main(String[] args) { int[] array = {1,2,3,4,5,6}; int left = 0; int right = array.length-1; System.out.println("排序之前的數(shù)組:"); System.out.println(Arrays.toString(array)); while(left<=right) { int tmp = array[left]; array[left] = array[right]; array[right] = tmp; left++; right--; } System.out.println("排序之后的數(shù)組:"); System.out.println(Arrays.toString(array)); } } //運行結(jié)果: 排序之前的數(shù)組: [1, 2, 3, 4, 5, 6] 排序之后的數(shù)組: [6, 5, 4, 3, 2, 1]
六、二維數(shù)組
1.二維數(shù)組的定義
關(guān)于二維數(shù)組的定義有很多種方法,這里咱們介紹最常用的三種。
Demo:
//第一種定義二維數(shù)組的方法:(行數(shù)和列數(shù)都知道的情況) // 數(shù)組類型[][] 數(shù)組名 = new 數(shù)組類型[行數(shù)][列數(shù)]; int[][] arr = new int[2][3];//定義一個3行4列的數(shù)組
//第二種定義數(shù)組的方法:(只知道行數(shù),不知道列數(shù)) // 數(shù)組類型[][] 數(shù)組名 = new 數(shù)組類型[行數(shù)][]; int[][] arr = new int[2][];
//第三種定義二維數(shù)組的方法:(知道具體的數(shù)據(jù)) // 數(shù)據(jù)類型[][] 數(shù)組名 = {{第0行初始值},{第1行初始值},···,{第n行初始值}}; int[][] arr = {{1,2},{3,4,5},{6,7,8,9}};
以上就是關(guān)于二維數(shù)組最常見的定義方法?。?!
2.二維數(shù)組的打印
二維數(shù)組本質(zhì)上也就是一維數(shù)組, 只不過每個元素又是一個一維數(shù)組.
Demo:
public class TestDemo { public static void main(String[] args) { int[][] array = {{1,2},{3,4,5},{6,7,8,9}}; for(int i=0;i< array.length;i++) { for(int j=0;j<array[i].length;j++) { System.out.print(array[i][j]+" "); } System.out.println(" "); } } } //運行結(jié)果: 1 2 3 4 5 6 7 8 9
由于二維數(shù)組的應(yīng)用和一維數(shù)組并沒有太大的區(qū)別,所以,在這里不做介紹,學(xué)會如何定義二維數(shù)組就好。
總結(jié)
到此這篇關(guān)于Java中的數(shù)組使用詳解及練習的文章就介紹到這了,更多相關(guān)Java數(shù)組詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot如何整合redis實現(xiàn)過期key監(jiān)聽事件
這篇文章主要介紹了SpringBoot如何整合redis實現(xiàn)過期key監(jiān)聽事件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2020-09-09SpringBoot實現(xiàn)動態(tài)配置及項目打包部署上線功能
本文講解的是如何使用Spring動態(tài)配置文件,實現(xiàn)不同環(huán)境不同配置,靈活切換配置文件;以及講述了如何使用?Maven?打包,然后上傳至Linux服務(wù)器進行部署,對SpringBoot打包部署上線過程感興趣的朋友一起看看吧2022-10-10使用Feign設(shè)置Token鑒權(quán)調(diào)用接口
這篇文章主要介紹了使用Feign設(shè)置Token鑒權(quán)調(diào)用接口,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03老生常談foreach(增強for循環(huán))和for的區(qū)別
下面小編就為大家?guī)硪黄仙U刦oreach(增強for循環(huán))和for的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-0930w+數(shù)據(jù)使用RedisTemplate?pipeline空指針NullPointerException異常分析
這篇文章主要為大家介紹了30w+數(shù)據(jù)使用RedisTemplate?pipeline空指針NullPointerException異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08如何去除Java中List集合中的重復(fù)數(shù)據(jù)
這篇文章主要介紹了Java中List集合去除重復(fù)數(shù)據(jù)的方法,對大家的工作或?qū)W習有一定價值,有需求的朋友可以參考下2020-05-05Hibernate映射解析之關(guān)聯(lián)映射詳解
所謂關(guān)聯(lián)映射就是將關(guān)聯(lián)關(guān)系映射到數(shù)據(jù)庫里,在對象模型中就是一個或多個引用。下面這篇文章詳細的給大家介紹了Hibernate映射解析之關(guān)聯(lián)映射的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02