java中數(shù)組的概念-java中數(shù)組的特點(diǎn)
剛學(xué)Java的時(shí)候,你是不是也有過(guò)這樣的困惑:“數(shù)組到底是個(gè)啥?為啥老師總說(shuō)它是基礎(chǔ)中的基礎(chǔ)?” 其實(shí)啊,數(shù)組就像咱們編程路上的“第一個(gè)工具箱”,不管是處理數(shù)據(jù)、刷題還是做項(xiàng)目,幾乎處處都能見到它的影子。但很多人學(xué)的時(shí)候只記了“數(shù)組是存數(shù)據(jù)的”,卻沒(méi)搞懂它的“脾氣”,結(jié)果寫代碼時(shí)不是越界就是賦值出錯(cuò)。今天這篇文章,咱們就掰開揉碎了聊——從數(shù)組到底是個(gè)啥,到它有哪些“必須知道”的特點(diǎn),再到怎么避開初學(xué)者常踩的坑,保證你看完就能上手用,再也不迷糊!
一、Java數(shù)組:到底是個(gè)啥?—— 從“貨架”理解數(shù)組概念
先問(wèn)個(gè)問(wèn)題:如果你要在程序里存5個(gè)學(xué)生的成績(jī),總不能聲明5個(gè)變量吧?int score1=90; int score2=85; ... 這要是存100個(gè)成績(jī),手不得敲斷?這時(shí)候,數(shù)組就派上用場(chǎng)了。
簡(jiǎn)單說(shuō),Java數(shù)組就是“相同數(shù)據(jù)類型的數(shù)據(jù)集合”,可以把它想象成超市里的“貨架”:每個(gè)貨架格子(數(shù)組元素)放的都是同一種商品(相同數(shù)據(jù)類型),每個(gè)格子有自己的編號(hào)(索引),你通過(guò)編號(hào)就能快速找到對(duì)應(yīng)的商品(訪問(wèn)元素)。
比如存5個(gè)成績(jī),用數(shù)組一句話搞定:int[] scores = {90, 85, 95, 80, 100}; 這里的scores就是數(shù)組名,{}里的是具體成績(jī)(元素),int[]表示數(shù)組里的元素都是int類型。
1.1 數(shù)組的“三要素”:元素、索引、長(zhǎng)度
想徹底搞懂?dāng)?shù)組,得先記住它的“三要素”:
元素:數(shù)組里存的具體數(shù)據(jù),比如上面例子里的90、85就是元素,所有元素必須是同一種數(shù)據(jù)類型(int、String、自定義對(duì)象等)。
索引:每個(gè)元素的“編號(hào)”,用來(lái)定位元素。注意!Java數(shù)組的索引從0開始(不是1!不是1!不是1!重要的事說(shuō)三遍),所以第一個(gè)元素的索引是0,第二個(gè)是1,以此類推。
長(zhǎng)度:數(shù)組能存多少個(gè)元素,一旦創(chuàng)建就固定不變。比如上面的scores數(shù)組有5個(gè)元素,長(zhǎng)度就是5,通過(guò)scores.length就能獲取(后面會(huì)詳細(xì)說(shuō))。
1.2 怎么創(chuàng)建數(shù)組?—— 兩種常用方式
創(chuàng)建數(shù)組就像“搭貨架”,得先確定“放什么類型的商品”(數(shù)據(jù)類型)和“有多少格子”(長(zhǎng)度)。Java里常用兩種創(chuàng)建方式:
方式1:靜態(tài)初始化(知道具體元素時(shí)用)
直接列出所有元素,系統(tǒng)會(huì)自動(dòng)計(jì)算長(zhǎng)度。比如存3個(gè)字符串:
// 格式:數(shù)據(jù)類型[] 數(shù)組名 = {元素1, 元素2, ...};
String[] names = {"張三", "李四", "王五"};
這種方式簡(jiǎn)單直接,適合元素少、已知的場(chǎng)景。
方式2:動(dòng)態(tài)初始化(不知道具體元素時(shí)用)
先指定數(shù)組長(zhǎng)度,元素暫時(shí)為空(會(huì)有默認(rèn)值,比如int默認(rèn)0,String默認(rèn)null),后面再賦值。比如創(chuàng)建一個(gè)能存5個(gè)int的數(shù)組:
java
// 格式:數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[長(zhǎng)度];
int[] ages = new int[5];
// 后續(xù)賦值(通過(guò)索引)
ages[0] = 20; // 第一個(gè)元素賦值20
ages[1] = 22; // 第二個(gè)元素賦值22
// ...以此類推
我剛開始學(xué)的時(shí)候,總搞混這兩種方式,比如寫成int[] arr = new int[3]{1,2,3};——這是錯(cuò)的!靜態(tài)初始化不能寫長(zhǎng)度,動(dòng)態(tài)初始化不能直接寫元素,記住“要么給元素,要么給長(zhǎng)度,別貪心”。
二、Java數(shù)組的5大核心特點(diǎn):這些“脾氣”你必須摸透
數(shù)組看著簡(jiǎn)單,但它的“脾氣”(特點(diǎn))直接決定了怎么用它、什么時(shí)候用它。搞懂這些特點(diǎn),才能避開坑,寫出高效代碼。
特點(diǎn)1:長(zhǎng)度一旦確定,就像定了型的模具——不可變的“容量”
這是數(shù)組最“倔強(qiáng)”的特點(diǎn):數(shù)組一旦創(chuàng)建,長(zhǎng)度就不能改了。就像你用模具做蛋糕,模具多大,蛋糕就多大,想多裝一塊都不行。
比如你創(chuàng)建了一個(gè)長(zhǎng)度為3的數(shù)組:
java
int[] arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
// 想加第四個(gè)元素?報(bào)錯(cuò)!
arr[3] = 4; // 編譯通過(guò),但運(yùn)行時(shí)會(huì)拋 ArrayIndexOutOfBoundsException(數(shù)組越界異常)
為啥會(huì)越界?因?yàn)閿?shù)組長(zhǎng)度是3,索引只能是0、1、2,3已經(jīng)超過(guò)最大索引(長(zhǎng)度-1)了。這是初學(xué)者最常踩的坑,我當(dāng)年寫循環(huán)遍歷數(shù)組時(shí),經(jīng)常把i < arr.length寫成i <= arr.length,結(jié)果每次運(yùn)行都報(bào)錯(cuò),后來(lái)特意在筆記本上寫了“索引最大是 length-1!”才記住。
怎么避免越界? 遍歷數(shù)組時(shí),用數(shù)組名.length獲取長(zhǎng)度,循環(huán)條件寫i < 數(shù)組名.length(比如for(int i=0; i 特點(diǎn)2:元素必須“同款”,就像集裝箱只裝一類貨——相同數(shù)據(jù)類型 數(shù)組就像物流公司的“集裝箱”,要么全裝衣服,要么全裝電子產(chǎn)品,不能混裝不同類型的數(shù)據(jù)。比如你不能在int數(shù)組里存字符串: java int[] arr = {1, 2, "3"}; // 編譯報(bào)錯(cuò)!"3"是String類型,和int不匹配 不過(guò)有個(gè)例外:如果數(shù)組類型是“父類”,可以存“子類對(duì)象”。比如Object[]數(shù)組(Object是所有類的父類),可以存String、Integer等: java Object[] objArr = {"張三", 20, true}; // 可以,因?yàn)镾tring、Integer、Boolean都是Object的子類 但平時(shí)開發(fā)很少這么用,畢竟數(shù)組的優(yōu)勢(shì)就是“類型統(tǒng)一,操作高效”,混裝反而麻煩。 特點(diǎn)3:內(nèi)存里“挨家挨戶”住,就像排隊(duì)占位——連續(xù)的內(nèi)存空間 數(shù)組在內(nèi)存中是“連續(xù)存儲(chǔ)”的,元素之間緊挨著,沒(méi)有空隙。這就像排隊(duì)買奶茶,每個(gè)人(元素)緊挨著站,前后位置固定。 這種“連續(xù)存儲(chǔ)”有啥好處?訪問(wèn)速度快! 因?yàn)閿?shù)組的每個(gè)元素地址可以通過(guò)“首地址 + 索引×元素大小”直接計(jì)算出來(lái),不用一個(gè)個(gè)找。比如int類型占4個(gè)字節(jié),如果數(shù)組首地址是1000,那么索引2的元素地址就是1000 + 2×4 = 1008,直接定位,時(shí)間復(fù)雜度是O(1)(瞬間找到)。 這也是為什么數(shù)組比鏈表(非連續(xù)存儲(chǔ))訪問(wèn)快,但插入刪除慢——你想想,排隊(duì)時(shí)中間加個(gè)人,后面的人都得往后挪,多費(fèi)勁! 特點(diǎn)4:數(shù)組變量是“遙控器”,真正的數(shù)據(jù)在“堆”里——引用類型 Java里的數(shù)據(jù)類型分兩種:基本類型(int、double等)和引用類型(類、接口、數(shù)組等)。數(shù)組屬于引用類型,這意味著數(shù)組變量(比如int[] arr)存的不是數(shù)據(jù)本身,而是數(shù)組在“堆內(nèi)存”中的地址(就像遙控器,按一下就能找到真正的電視)。 舉個(gè)例子: java int[] arr1 = {1, 2, 3}; int[] arr2 = arr1; // arr2和arr1指向同一個(gè)數(shù)組對(duì)象 arr2[0] = 100; System.out.println(arr1[0]); // 輸出100,因?yàn)閍rr1和arr2操作的是同一個(gè)數(shù)組 這里arr1和arr2都是“遙控器”,指向堆內(nèi)存中同一個(gè)數(shù)組對(duì)象,所以改arr2的元素,arr1也會(huì)變。如果想讓arr2是新數(shù)組,得重新創(chuàng)建:int[] arr2 = Arrays.copyOf(arr1, arr1.length);(需要導(dǎo)入java.util.Arrays)。 初學(xué)者常犯的錯(cuò):把數(shù)組變量賦值給另一個(gè)變量后,以為改新變量不影響舊變量,結(jié)果發(fā)現(xiàn)數(shù)據(jù)一起變了——記住,數(shù)組是引用類型,賦值的是地址,不是數(shù)據(jù)副本! 特點(diǎn)5:遍歷元素“兩種姿勢(shì)”,普通for循環(huán)和增強(qiáng)for循環(huán)——便捷的訪問(wèn)方式 數(shù)組的元素可以通過(guò)索引一個(gè)個(gè)訪問(wèn),遍歷的時(shí)候有兩種常用方式: 方式1:普通for循環(huán)(需要索引時(shí)用) 可以通過(guò)索引操作元素(比如修改值): java int[] scores = {90, 85, 95}; for (int i = 0; i < scores.length; i++) { System.out.println("第" + (i+1) + "個(gè)成績(jī):" + scores[i]); scores[i] += 5; // 每個(gè)成績(jī)加5分 } 方式2:增強(qiáng)for循環(huán)(只遍歷元素,不需要索引時(shí)用) 語(yǔ)法更簡(jiǎn)潔,但拿不到索引,也不能修改元素值(基本類型時(shí)): java int[] scores = {90, 85, 95}; for (int score : scores) { // 把數(shù)組里的每個(gè)元素依次賦給score System.out.println("成績(jī):" + score); score += 5; // 這里修改的是局部變量score,數(shù)組元素不變 } 我平時(shí)寫代碼,如果只需要看元素值,就用增強(qiáng)for循環(huán)(清爽);如果要修改元素或者需要索引(比如統(tǒng)計(jì)某個(gè)位置的元素),就用普通for循環(huán)。 三、數(shù)組這么“倔”,為啥還要用它?—— 適合的場(chǎng)景才是最好的 看到這里你可能會(huì)問(wèn):“數(shù)組長(zhǎng)度固定,不能混裝類型,好像不如ArrayList(動(dòng)態(tài)數(shù)組)好用啊?” 確實(shí),ArrayList可以自動(dòng)擴(kuò)容,用起來(lái)更靈活,但數(shù)組也有它不可替代的優(yōu)勢(shì): 效率高:連續(xù)內(nèi)存+直接索引訪問(wèn),讀寫速度比ArrayList快(ArrayList底層也是數(shù)組,但有額外的擴(kuò)容、檢查等操作)。 簡(jiǎn)單直接:不需要導(dǎo)入類(ArrayList需要import java.util.ArrayList),語(yǔ)法簡(jiǎn)單,適合存固定數(shù)量、同類型的數(shù)據(jù)(比如學(xué)生成績(jī)、月份天數(shù))。 底層基礎(chǔ):很多集合類(比如ArrayList、HashMap)底層都是用數(shù)組實(shí)現(xiàn)的,學(xué)好數(shù)組才能理解這些高級(jí)工具的原理。 就像蓋房子,數(shù)組是“ bricks(磚塊)”,雖然簡(jiǎn)單,但沒(méi)有它,高樓大廈(復(fù)雜數(shù)據(jù)結(jié)構(gòu))根本建不起來(lái)。 寫在最后 Java數(shù)組,看著是個(gè)“小角色”,卻是編程路上繞不開的“基本功”。它就像咱們學(xué)數(shù)學(xué)時(shí)的“加減乘除”,簡(jiǎn)單,但處處要用;有自己的“脾氣”(固定長(zhǎng)度、相同類型),但摸透了就很好用。 記住:數(shù)組的核心是“相同類型、固定長(zhǎng)度、連續(xù)存儲(chǔ)、引用類型”,搞懂這幾點(diǎn),不管是刷題時(shí)用數(shù)組解題,還是工作中處理數(shù)據(jù),都能游刃有余。下次再寫數(shù)組代碼,試試用“貨架”的類比想想——每個(gè)格子(元素)有編號(hào)(索引),裝同一種商品(類型),容量固定(長(zhǎng)度),是不是就清晰多了? 編程嘛,就是把復(fù)雜的問(wèn)題拆成一個(gè)個(gè)簡(jiǎn)單的“小零件”,而數(shù)組,就是你工具箱里最基礎(chǔ)、也最可靠的那一個(gè)。 尊重原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處與鏈接:http://www.abtbt.com.cn/fangfa/740924.html,違者必究!
與“java中數(shù)組的概念-java中數(shù)組的特點(diǎn)”相關(guān)文章
- Java有哪幾個(gè)關(guān)鍵特性-簡(jiǎn)單性的特點(diǎn)-新特性
- Java的主要特點(diǎn)有哪些-具體特點(diǎn)介紹-特性講解
- Java語(yǔ)言特點(diǎn)敘述-特點(diǎn)介紹-有什么特點(diǎn)
- Java面向?qū)ο蟮幕咎卣?封裝性-繼承性
- Java語(yǔ)言的特點(diǎn)及優(yōu)勢(shì)-特點(diǎn)介紹-優(yōu)勢(shì)介紹
- Java的主要特點(diǎn)-有什么特點(diǎn)-特點(diǎn)怎么體現(xiàn)
- Java有什么特性-java特性有哪些-java語(yǔ)言特性
- java語(yǔ)言的特點(diǎn)
- java語(yǔ)言有什么特點(diǎn)
- 什么是java語(yǔ)言