您好,登錄后才能下訂單哦!
這篇“Java中數(shù)組定義和使用實(shí)例分析”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Java中數(shù)組定義和使用實(shí)例分析”文章吧。
Java語(yǔ)言中的數(shù)組是一種引用數(shù)據(jù)類型;不屬于基本數(shù)據(jù)類型;數(shù)組的父類是Object。
數(shù)組實(shí)際上是一個(gè)容器,可以同時(shí)容納多個(gè)元素。(數(shù)組是一個(gè)數(shù)據(jù)的集合)
數(shù)組:字面意思是“一組數(shù)據(jù)”
數(shù)組當(dāng)中可以存儲(chǔ)“基本數(shù)據(jù)類型”的數(shù)據(jù),也可以存儲(chǔ)“引用數(shù)據(jù)類型”的數(shù)據(jù)。
數(shù)組因?yàn)槭且妙愋停詳?shù)組對(duì)象是堆內(nèi)存當(dāng)中。(數(shù)組是存儲(chǔ)在堆當(dāng)中的)
數(shù)組當(dāng)中如果存儲(chǔ)的是“java對(duì)象”的話,實(shí)際上存儲(chǔ)的是對(duì)象的“引用(內(nèi)存地址)”,數(shù)組中不能直接存儲(chǔ)java對(duì)象(存它的地址)。
數(shù)組一旦創(chuàng)建,在java中規(guī)定,長(zhǎng)度不可變。(數(shù)組長(zhǎng)度不可變)
數(shù)組的分類:一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組...(一維數(shù)組較多,二維數(shù)組偶爾使用!)
所有的數(shù)組對(duì)象都有l(wèi)ength屬性(java自帶的),用來(lái)獲取數(shù)組中元素的個(gè)數(shù)。
java中的數(shù)組要求數(shù)組中元素的類型統(tǒng)一。比如int類型數(shù)組只能存儲(chǔ)int類型,Person類型數(shù)組只能存儲(chǔ)Person類型。例如:超市購(gòu)物,購(gòu)物袋中只能裝蘋果,不能同時(shí)裝蘋果和橘子。(數(shù)組中存儲(chǔ)的元素類型統(tǒng)一)
數(shù)組在內(nèi)存方面存儲(chǔ)的時(shí)候,數(shù)組中的元素內(nèi)存地址(存儲(chǔ)的每一個(gè)元素都是有規(guī)則的挨著排列的)是連續(xù)的。內(nèi)存地址連續(xù)。這是數(shù)組存儲(chǔ)元素的特點(diǎn)(特色)。數(shù)組實(shí)際上是一種簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。
所有的數(shù)組都是拿“第一個(gè)小方框的內(nèi)存地址”作為整個(gè)數(shù)組對(duì)象的內(nèi)存地址。(數(shù)組中首元素的內(nèi)存地址作為整個(gè)數(shù)組對(duì)象的內(nèi)存地址。)
數(shù)組中每一個(gè)元素都是有下標(biāo)的,下標(biāo)從0開(kāi)始,以1遞增。最后一個(gè)元素的下標(biāo)是:length - 1;下標(biāo)非常重要,因?yàn)槲覀儗?duì)數(shù)組中元素進(jìn)行“存取”的時(shí)候,都需要通過(guò)下標(biāo)來(lái)進(jìn)行。
數(shù)組這種數(shù)據(jù)結(jié)構(gòu)的優(yōu)點(diǎn)和缺點(diǎn)是什么?
優(yōu)點(diǎn):查詢/查找/檢索某個(gè)下標(biāo)上的元素時(shí)效率極高??梢哉f(shuō)是查詢效率最高的一個(gè)數(shù)據(jù)結(jié)構(gòu)。為什么檢索效率高?
第一:每一個(gè)元素的內(nèi)存地址在空間存儲(chǔ)上是連續(xù)的。
第二:每一個(gè)元素類型相同,所以占用空間大小一樣。
第三:知道第一個(gè)元素內(nèi)存地址,知道每一個(gè)元素占用空間的大小,又知道下標(biāo),所以通過(guò)一個(gè)數(shù)學(xué)表達(dá)式就可以計(jì)算出某個(gè)下標(biāo)上元素的內(nèi)存地址。直接通過(guò)內(nèi)存地址定位元素,所以數(shù)組的檢索效率是最高的。數(shù)組中存儲(chǔ)100個(gè)元素,或者存儲(chǔ)100萬(wàn)個(gè)元素,在元素查詢/檢索方面,效率是相同的,因?yàn)閿?shù)組中元素查找的時(shí)候不會(huì)一個(gè)一個(gè)找,是通過(guò)數(shù)學(xué)表達(dá)式計(jì)算出來(lái)的。(算出一個(gè)內(nèi)存地址,直接定位的。)
缺點(diǎn):
第一:為了保證數(shù)組中每個(gè)元素的內(nèi)存地址連續(xù),所以在數(shù)組上隨機(jī)刪除或者增加元素的時(shí)候,效率較低,因?yàn)殡S機(jī)增刪元素會(huì)涉及到后面元素統(tǒng)一向前或者向后位移的操作。
第二:數(shù)組不能存儲(chǔ)大數(shù)據(jù)量,為什么?因?yàn)楹茈y在內(nèi)存空間上找到一塊特別大的連續(xù)的內(nèi)存空間。對(duì)于數(shù)組中最后一個(gè)元素的增刪,是沒(méi)有效率影響的。
怎么聲明/定義一個(gè)一維數(shù)組?
語(yǔ)法格式:int[] array1; double[] array2; boolean[] array3; String[] array4; Object[] array5;怎么初始化一個(gè)一維數(shù)組呢?
包括兩種方式:靜態(tài)初始化一維數(shù)組,動(dòng)態(tài)初始化一維數(shù)組。
(1)靜態(tài)初始化語(yǔ)法格式:
int[] array = {100, 2100, 300, 55};
(2)動(dòng)態(tài)初始化語(yǔ)法格式:
int[] array = new int[5];這里的5表示數(shù)組的元素個(gè)數(shù)。
初始化一個(gè)5個(gè)長(zhǎng)度的int類型數(shù)組,每個(gè)元素默認(rèn)值0
再例如:String[] names = new String[6];初始化6個(gè)長(zhǎng)度的String類型數(shù)組,每個(gè)元素默認(rèn)值null。
什么時(shí)候使用靜態(tài)數(shù)組初始化?什么時(shí)候使用動(dòng)態(tài)數(shù)組初始化?
(1)創(chuàng)鍵數(shù)組的時(shí)候,確定數(shù)組中存儲(chǔ)哪些具體的元素時(shí),采用靜態(tài)初始化方式
(2)創(chuàng)鍵數(shù)組的時(shí)候,不確定將來(lái)存儲(chǔ)哪些數(shù)據(jù),可以采用動(dòng)態(tài)初始化的方式,預(yù)先分配內(nèi)存空間
package com.bjpowernode.javase.array; public class ArrayTest01 { public static void main(String[] args) { //1.靜態(tài)初始化 int[] a1 = {1,3,5,7,9}; //所有的數(shù)組對(duì)象都有l(wèi)ength屬性,而不是方法! System.out.println("數(shù)組元素的個(gè)數(shù)是:"+a1.length); //取第一個(gè)元素 System.out.println(a1[0]); //取最后一個(gè)元素 System.out.println(a1[a1.length-1]); //改數(shù)據(jù) a1[a1.length-1] = 0; //遍歷數(shù)據(jù) for(int i=0;i< a1.length;i++){ System.out.println(a1[i]); } //數(shù)據(jù)下標(biāo)越界異常,例如:訪問(wèn)下面為6的數(shù)據(jù)元素 //System.out.println(a1[6]);// ArrayIndexOutOfBoundsException //2.動(dòng)態(tài)初始化 int[] a2 = new int[5]; //默認(rèn)值是0 for(int i=0;i< a2.length;i++){ System.out.println(a2[i]); } //初始化一個(gè)Object類型的數(shù)組, //1.采用靜態(tài)初始化方式 Object o1 = new Object(); Object o2 = new Object(); Object o3 = new Object(); Object[] object = {o1,o2,o3}; //上面就等價(jià)于:Object[] object = {new Object(),new Object(),new Object()}; for(int i=0;i<object.length;i++){ System.out.println(object[i]);// 默認(rèn)調(diào)用toString方法 } //2.采用動(dòng)態(tài)初始化的方式 Object[] obj = new Object[3]; for(int i=0;i<obj.length;i++){ System.out.println(obj[i]);// null null null } //初始化一個(gè)String類型的數(shù)組 //1.靜態(tài)初始化 String[] str1 = {"abc","bcd","cde"}; for (int i = 0; i < str1.length; i++) { System.out.println(str1[i]); } //2.動(dòng)態(tài)初始化 String[] str2 = new String[3]; for (int i = 0; i < str2.length; i++) { System.out.println(str2[i]); } } }
動(dòng)態(tài)存儲(chǔ)內(nèi)存圖
當(dāng)傳遞的是一個(gè)數(shù)組,方法也用數(shù)組的形式進(jìn)行接收;這個(gè)數(shù)組可以是靜態(tài)的,也可以是動(dòng)態(tài)創(chuàng)建的;并且我們把方法寫成寫成靜態(tài)的,這樣不需要new對(duì)象就可以調(diào)用!
例1:
package com.bjpowernode.javase.array; public class ArrayTest02 { //也可以采用C++的風(fēng)格,寫成String args[] public static void main(String args[]) { System.out.println("HelloWorld"); // 1.方法的參數(shù)傳數(shù)組---靜態(tài)初始化方式 int[] a = {1,2,3,4,5}; printArray(a); // 2.方法的參數(shù)傳數(shù)組---動(dòng)態(tài)初始化方式 int[] arr = new int[5]; printArray(arr); // 直接一步完成 printArray(new int[3]); } //靜態(tài)方法進(jìn)行打印 public static void printArray(int[] arr){ for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }
例2:(掌握)
(1)一種特殊情況傳遞靜態(tài)數(shù)組;如果直接傳遞一個(gè)靜態(tài)數(shù)組的話,語(yǔ)法必須這樣寫!
(2)我們先看一個(gè)例子:int[] arr = {1,2,3};我們傳遞數(shù)組的參數(shù)時(shí)候,一般就是傳遞數(shù)組名arr,例如:printArray(arr);但是另一種方法就是傳過(guò)去,去掉數(shù)組名arr剩余的組成部分:
int[]{1,2,3},但是要加上new關(guān)鍵字,例如: printArray(new int[]{1,2,3});
package com.bjpowernode.javase.array; public class ArrayTest03 { public static void main(String[] args) { //----------1.動(dòng)態(tài)初始化一位數(shù)組(兩種傳參方式) //第一種傳參方式 int[] a1 = new int[5];//默認(rèn)是5個(gè)0 printArray(a1); System.out.println("-------------"); //第二種傳參方式 printArray(new int[3]); System.out.println("-------------"); //----------2.靜態(tài)初始化一位數(shù)組(兩種傳參方式) //第一種傳參方式 int[] a2 = {1,2,3}; printArray(a2); System.out.println("-------------"); //第二種傳參方式----直接傳遞一個(gè)靜態(tài)數(shù)組 printArray(new int[]{4,5,6}); } //調(diào)用的靜態(tài)方法----靜態(tài)方法比較方便,不需要new對(duì)象 public static void printArray(int[] arr){ for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }
(1)對(duì)于main(String[] args);分析一下:誰(shuí)負(fù)責(zé)調(diào)用main方法(JVM)
JVM調(diào)用main方法的時(shí)候,會(huì)自動(dòng)傳一個(gè)String數(shù)組過(guò)來(lái),長(zhǎng)度為0。
例1:
package com.bjpowernode.javase.array; public class ArrayTest04 { // 這個(gè)方法程序員負(fù)責(zé)寫出來(lái),JVM負(fù)責(zé)調(diào)用。JVM調(diào)用的時(shí)候一定會(huì)傳一個(gè)String數(shù)組過(guò)來(lái)。 public static void main(String[] args) { // JVM默認(rèn)傳遞過(guò)來(lái)的這個(gè)數(shù)組對(duì)象的長(zhǎng)度?默認(rèn)是0 // 通過(guò)測(cè)試得出:args不是null。 System.out.println("JVM給傳遞過(guò)來(lái)的String數(shù)組參數(shù),它這個(gè)數(shù)組的長(zhǎng)度是?" + args.length); //0 // 以下這一行代碼表示的含義:數(shù)組對(duì)象創(chuàng)建了,但是數(shù)組中沒(méi)有任何數(shù)據(jù)。就等價(jià)于: String[] strs = new String[0]; //動(dòng)態(tài)的方式 //String[] strs = {}; // 靜態(tài)初始化數(shù)組,里面沒(méi)東西。 printLength(strs); //調(diào)用printLength靜態(tài)方法 /* 既然傳過(guò)來(lái)的“String[] args”數(shù)組里什么都沒(méi)有;那么這個(gè)數(shù)組什么時(shí)候里面會(huì)有值呢? 其實(shí)這個(gè)數(shù)組是留給用戶的,用戶可以在控制臺(tái)上輸入?yún)?shù),這個(gè)參數(shù)自動(dòng)會(huì)被轉(zhuǎn)換為“String[] args” 例如這樣運(yùn)行程序:java ArrayTest04 abc def xyz;相當(dāng)于在編譯時(shí)進(jìn)行傳參 那么這個(gè)時(shí)候JVM會(huì)自動(dòng)將“abc def xyz”通過(guò)空格的方式進(jìn)行分離,分離完成之后,自動(dòng)放到“String[] args”數(shù)組當(dāng)中。 所以main方法上面的String[] args數(shù)組主要是用來(lái)接收用戶輸入?yún)?shù)的。 把a(bǔ)bc def xyz 轉(zhuǎn)換成字符串?dāng)?shù)組:{"abc","def","xyz"} */ // 遍歷數(shù)組 for (int i = 0; i < args.length; i++) { System.out.println(args[i]); } //既然是編譯時(shí)進(jìn)行傳參,對(duì)于編譯運(yùn)行一體的IDEA怎么使用呢? //Run--->EditConfiguration--->Program Arguments里面進(jìn)行傳參,然后在從后重新運(yùn)行 } public static void printLength(String[] args){ System.out.println(args.length); // 0 } }
例2:
(1)main方法上面的“String[] args”有什么用?
可以用來(lái)模擬一個(gè)登陸系統(tǒng)!請(qǐng)看下面這個(gè)有趣的例題:
package com.bjpowernode.javase.array; /* 模擬一個(gè)系統(tǒng),假設(shè)這個(gè)系統(tǒng)要使用,必須輸入用戶名和密碼。 */ public class ArrayTest05 { public static void main(String[] args) { //先判斷長(zhǎng)度,是不是兩個(gè)字符串長(zhǎng)度,不是2直接終止程序 if(args.length != 2){ System.out.println("請(qǐng)輸入用戶名和密碼"); return; } //取出用戶名和密碼 String username = args[0]; String password = args[1]; // 假設(shè)用戶名是admin,密碼是123的時(shí)候表示登錄成功。其它一律失敗。 // 判斷兩個(gè)字符串是否相等,需要使用equals方法。 // if(username.equals("admin") && password.equals("123")){ //這樣有可能空指針異常 // 下面這種編寫方式,也可以避免空該指針異常! if("admin".equals(username) && "123".equals(password)){ System.out.println("恭喜你,登錄成功"); System.out.println("您可以繼續(xù)使用該系統(tǒng)"); }else{ System.out.println("賬戶或密碼錯(cuò)誤,請(qǐng)重新輸入"); } } }
(1)一維數(shù)組的深入:數(shù)組中存儲(chǔ)的類型為:引用數(shù)據(jù)類型;對(duì)于數(shù)組來(lái)說(shuō),實(shí)際上只能存儲(chǔ)java對(duì)象的“內(nèi)存地址”。數(shù)組中存儲(chǔ)的每個(gè)元素是“引用”。下面這個(gè)例題重點(diǎn)理解!
(2)數(shù)組要求數(shù)組中元素的類型統(tǒng)一;但是也可以存儲(chǔ)它的子類型!
package com.bjpowernode.javase.array; public class ArrayTest06 { public static void main(String[] args) { //1.靜態(tài)創(chuàng)建一個(gè)Animal類型的數(shù)組 Animal a1 = new Animal(); Animal a2 = new Animal(); Animal[] animals = {a1,a2}; //對(duì)Animal數(shù)組進(jìn)行遍歷 for (int i = 0; i < animals.length; i++) { //方法1 /*Animal a = animals[i]; a.move();*/ //方法2 animals[i].move(); } //2.動(dòng)態(tài)初始化一個(gè)長(zhǎng)度為2的animal類型的數(shù)組 Animal[] ans = new Animal[2]; ans[0] = new Animal(); //ans[1] = new Product(); //err,Product和Animals沒(méi)有任何關(guān)系 //Animal數(shù)組中只能存放Animal類型,不能存放Product類型 //3.Animal數(shù)組中可以存放Cat類型的數(shù)據(jù),因?yàn)镃at是Animal一個(gè)子類 ans[1] = new Cat(); for (int j = 0; j < ans.length; j++) { ans[j].move(); } //4.創(chuàng)建一個(gè)Animal類型的數(shù)據(jù),數(shù)組當(dāng)中存儲(chǔ)Cat和Bird //4.1靜態(tài)創(chuàng)建 Cat cat = new Cat(); Bird bird = new Bird(); Animal[] anim = {cat,bird}; for (int i = 0; i < anim.length; i++) { //直接調(diào)用子類和父類都有的move()方法 //anim[i].move(); //這里想要調(diào)用子類Bird里面特有的方法,需要向下轉(zhuǎn)型 if(anim[i] instanceof Bird){ Bird b = (Bird)anim[i]; //向下轉(zhuǎn)型 b.move(); b.sing(); //調(diào)用子類特有的方法 }else{ anim[i].move(); } } } } //動(dòng)物類 class Animal{ public void move(){ System.out.println("Animals move....."); } } //商品類 class Product{ } //有一個(gè)貓類繼承動(dòng)物類 class Cat extends Animal{ public void move(){ System.out.println("Cat move....."); } } //有一個(gè)鳥(niǎo)類繼承動(dòng)物類 class Bird extends Animal{ public void move(){ System.out.println("Bird move....."); } //鳥(niǎo)特有的方法 public void sing(){ System.out.println("鳥(niǎo)兒在歌唱!"); } }
在Java開(kāi)發(fā)中,數(shù)組長(zhǎng)度一旦確定不可變,那么數(shù)組滿了,需要擴(kuò)容怎么辦?
(1)java中對(duì)數(shù)組的擴(kuò)容是:先創(chuàng)建一個(gè)大容量的數(shù)組,然后將小容量數(shù)組中的元素一個(gè)個(gè)拷貝到大數(shù)組當(dāng)中,小容量會(huì)被釋放。
(2)結(jié)論:數(shù)組擴(kuò)容效率較低。因?yàn)樯婕暗娇截惖膯?wèn)題。所以在以后的開(kāi)發(fā)中請(qǐng)注意:盡可能少的進(jìn)行數(shù)組的拷貝??梢栽趧?chuàng)建數(shù)組對(duì)象的時(shí)候預(yù)估計(jì)以下多長(zhǎng)合適,最好預(yù)估準(zhǔn)確,這樣可以減少數(shù)組的擴(kuò)容次數(shù)。提高效率。(3)利用System.arraycopy進(jìn)行拷貝,總共5個(gè)參數(shù);System.arraycopy(源頭數(shù)組,下標(biāo),目的地?cái)?shù)組,下標(biāo),要拷貝的個(gè)數(shù))
package com.bjpowernode.javase.array; public class ArrayTest07 { public static void main(String[] args) { //java中的數(shù)組是怎樣拷貝的呢?System.arraycopy(5個(gè)參數(shù)) //System.arraycopy(源,下標(biāo),目的地,下標(biāo),個(gè)數(shù)) //拷貝源---把3、5、7拷貝過(guò)去 int[] src = {1,3,5,7,9}; //拷貝目的地---拷貝到下標(biāo)為5的地方 int[] dest = new int[20]; //調(diào)用拷貝函數(shù) System.arraycopy(src,1,dest,5,3); //打印驗(yàn)證 for (int i = 0; i < dest.length; i++) { System.out.println(dest[i]+" "); } //拷貝引用數(shù)據(jù)類型 String[] str = {"hello","world"}; String[] strs = new String[10]; System.arraycopy(str,0,strs,3,2); for (int i = 0; i < strs.length; i++) { System.out.println(strs[i]); } System.out.println("--------------"); //采用動(dòng)態(tài)開(kāi)辟的時(shí)候拷貝的是地址 Object[] objs = {new Object(),new Object(),new Object()}; Object[] objects = new Object[5]; System.arraycopy(objs,0,objects,0,3); for (int i = 0; i < objects.length; i++) { System.out.println(objects[i]); } } }
內(nèi)存圖
以上就是關(guān)于“Java中數(shù)組定義和使用實(shí)例分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。