1.數(shù)組類型
數(shù)組是編程語言中最常見的一種數(shù)據(jù)結(jié)構(gòu)措拇,可用于存儲多個數(shù)據(jù)芹扭,每個數(shù)組元素存放一個數(shù)據(jù)芯肤,通澄示校可通過數(shù)組元素的索引來訪問數(shù)組元素遍略,包括為數(shù)組元素賦值和取出數(shù)組元素的值
理解數(shù)組:數(shù)組也是一種類型
java的數(shù)組要求所有的數(shù)組元素具有相同的數(shù)據(jù)類型慢味,因此在一個數(shù)組中,數(shù)組元素的類型是唯一的墅冷,即一個數(shù)組里只能存儲一種數(shù)據(jù)類型的數(shù)據(jù)纯路,而不能存儲多種數(shù)據(jù)類型的數(shù)據(jù)。
一旦數(shù)組的初始化完成寞忿,數(shù)組在內(nèi)存中所占的空間將被固定下來驰唬,因此數(shù)組的長度將不可改變,即使把某個數(shù)組元素的數(shù)據(jù)清空腔彰,但它所占的空間依然被保留叫编。
2.定義數(shù)組
java語言支持兩種語法格式來定義數(shù)組
type[] arrayName;
type arrayName[];?
對著兩種語法格式而言,通常推薦使用第一種格式霹抛,因?yàn)榈谝环N格式不僅具有更好的語意搓逾,而且具有更好的可讀性
數(shù)組是一種引用類型的變量,因此使用它定義一個變量時(shí)杯拐,僅僅標(biāo)識定義了一個引用變量霞篡,這個引用變量還未指向任何有效的內(nèi)存,因此定義數(shù)組時(shí)不能指定數(shù)組的長度端逼,而且由于定義數(shù)組只是定義了一個引用變量朗兵,并未指向任何有效的內(nèi)存空間,所以還沒有內(nèi)存空間來存儲數(shù)組元素顶滩,因此這個數(shù)組也不能使用余掖,只有對數(shù)組進(jìn)行初始化后才可以使用。
3.數(shù)組的初始化
java語言中數(shù)組必須先初始化礁鲁,然后才可以使用盐欺,所謂初始化,就是為數(shù)組的數(shù)組元素分配內(nèi)存空間仅醇,并為每個數(shù)組元素賦初始的值冗美。
數(shù)組的初始化有兩種方式:
靜態(tài)初始化:初始化時(shí)由程序員顯式指定每個數(shù)組元素的初始值,由系統(tǒng)決定數(shù)組長度着憨。
動態(tài)初始化:初始化時(shí)程序員只能指定數(shù)組長度墩衙,有系統(tǒng)為數(shù)組元素分配初始值。
靜態(tài)初始化語法格式如下:
arrayName = new type[] {element1.element2,element3....}
動態(tài)初始化語法格式如下:
arrayName = new type[length];
執(zhí)行動態(tài)初始化時(shí)程序員只需要指定數(shù)組的長度甲抖,即為每個數(shù)組元素指定所需的內(nèi)存空間漆改,系統(tǒng)將負(fù)責(zé)為這些數(shù)組元素分配初始值。
數(shù)組元素的類型是基本類型中的整數(shù)類型(byte准谚、short挫剑、int、long)則數(shù)組元素的值是0
數(shù)組元素的類型是基本類型中浮點(diǎn)類型(float柱衔、double)樊破,則數(shù)組元素的值是0.0
數(shù)組元素的類型是基本類型中字符類型(char)愉棱,則數(shù)組元素的值是'\u0000'
數(shù)組元素的類型是基本類型中布爾類型(boolean),則數(shù)組元素的值是null
4.使用數(shù)組
數(shù)組最常用的用法就是訪問數(shù)組元素哲戚,包括對數(shù)組元素進(jìn)行賦值和取出數(shù)組元素的值奔滑,訪問數(shù)組元素都是通過在數(shù)組引用變量后緊跟一個方括號[],方括號里是數(shù)組元素的索引值顺少,這樣就可以訪問數(shù)組元素了朋其,訪問到數(shù)組元素之后,就可以把一個數(shù)組元素當(dāng)成一個普通變量使用了脆炎,包括為該變量賦值和取出該變量的值梅猿,這個變量的類型就是定義數(shù)組時(shí)使用的類型。
java語言的數(shù)組索引是從0開始的秒裕,也就是說袱蚓,第一個數(shù)組元素的索引值為0,最后一個數(shù)組元素的索引值為數(shù)組長度減一几蜻,
如果訪問數(shù)組元素時(shí)指定的索引值小于0喇潘,或者大于等于數(shù)組的長度,編譯程序不會出現(xiàn)任何錯誤入蛆,但運(yùn)行時(shí)出現(xiàn)異常:java.lang.ArraryIndexOutOfBoundsException:N(數(shù)組索引越界異常)响蓉,異常信息后的N就是程序員試圖訪問的數(shù)組索引。
所有的數(shù)組都提供了一個length的屬性哨毁,通過這個屬性可以訪問到數(shù)組的長度,一旦獲得了數(shù)組的長度源武,就可以通過循環(huán)來遍歷該數(shù)組的每個數(shù)組元素扼褪。
5.foreach循環(huán)
從java5之后,java提供了一種更簡單的循環(huán):foreach循環(huán)粱栖,這種循環(huán)遍歷數(shù)組和集合话浇。使用foreach循環(huán)遍歷數(shù)組和集合元素時(shí),
闹究,無需獲得數(shù)組和集合的長度幔崖,無需根據(jù)索引來訪問數(shù)組元素和集合元素,foreach循環(huán)自動遍歷數(shù)組和集合的每個元素渣淤。
foreach循環(huán)的語法格式如下:
for(type variableName : array | collection)
{
//variableName 自動迭代訪問每個元素
}
foreach循環(huán)和普通循環(huán)不同的是赏寇,它無需循環(huán)條件,無需循環(huán)迭代語句价认,這些部分都由系統(tǒng)來完成嗅定,foreach循環(huán)自動迭代數(shù)組的每個元素,每當(dāng)元素都被迭代一次后用踩,foreach循環(huán)自動結(jié)束渠退。
6.深入數(shù)組
1)內(nèi)存中的數(shù)組
數(shù)組應(yīng)用變量是訪問堆內(nèi)存中數(shù)組元素的根本方式忙迁。
定義并初始化一個數(shù)組后,在內(nèi)存中分配了兩個空間碎乃,一個用于存放數(shù)組的引用變量姊扔,另一個用于存放數(shù)組本身。
2)基本類型數(shù)組的初始化
對于基本類型數(shù)組而言梅誓,數(shù)組元素的值直接存儲在對應(yīng)的數(shù)組元素中恰梢,因此初始化數(shù)組時(shí),先為該數(shù)組分配內(nèi)存空間证九,然后直接將數(shù)組元素的值存入對應(yīng)數(shù)組元素中删豺。
3)引用類型數(shù)組的初始化
每個數(shù)組元素里存儲的還是引用,它指向另一塊內(nèi)存愧怜,這塊內(nèi)存里存儲了有效數(shù)據(jù)呀页。
4)沒有多維數(shù)組
如果從數(shù)組底層的運(yùn)行機(jī)制上來看,沒有多維數(shù)組
java語言里的數(shù)組類型是引用類型拥坛,因此數(shù)組變量其實(shí)是一個引用蓬蝶,這個引用指向真實(shí)的數(shù)組內(nèi)褲才能。數(shù)組元素的類型也可以是引用猜惋,如果數(shù)組元素的引用再次指向真實(shí)的數(shù)組內(nèi)存丸氛,這種情形看上去很像多維數(shù)組。
java語言采用上面的語法格式來定義二維數(shù)組著摔,但它的實(shí)質(zhì)還是一維數(shù)組缓窜,只是其數(shù)組元素也是引用,數(shù)組元素里保存的引用指向一維數(shù)組谍咆。
7.java8增強(qiáng)的工具類:arrays
java提供的arrays類里包含的一些static修飾的方法可以直接操作數(shù)組禾锤,這個arrays類里包含了如下幾個static修飾的方法
int binarySearch(type[] a, type key):使用二分法查詢key元素值在a數(shù)組中出現(xiàn)的索引;如果a數(shù)組不包含key元素值摹察,則返回負(fù)數(shù)恩掷。調(diào)用該方法時(shí)要求數(shù)組中元素已經(jīng)按升序排列,這樣才能得到正確的結(jié)果供嚎。
int binarySearch(type[] a,int fromIndex,int toIndex ,type key):這個方法和前一個方法類似黄娘,但它只搜索a數(shù)組中fromIndex到toIndex索引的元素。調(diào)用該方法時(shí)要求數(shù)組中元素已經(jīng)按升序排列克滴,這樣才能得到正確的結(jié)果逼争。
type[] copyOf(type[] original,int length):這個方法將會把original數(shù)組復(fù)制成一個新數(shù)組,其中l(wèi)ength是新數(shù)組的長度偿曙。如果length小于original數(shù)組的長度氮凝,則新數(shù)組就是原數(shù)組的前面length個元素;
type[] copyOfRange(type[] original,int from,int to):這個方法與前面方法相似望忆,但這個方法只復(fù)制original數(shù)組的from索引到to索引的元素罩阵。
boolean equals(type[] a,type a2):如果a數(shù)組和a2數(shù)組的長度相等竿秆,而且a數(shù)組和a2數(shù)組的數(shù)組元素也一一相同,該方法將返回true稿壁。
void fill(type[] a, type val):該方法將會把a(bǔ)數(shù)組的所有元素都賦值為val幽钢。
void fill(type[] a,int fromIndex,int toIndex,type val)
void sort(type[] a)該方法對a數(shù)組進(jìn)行排序。
void sort(type[] a,int fromIndex,int toIndex)
String toString(type[] a):該方法將一個數(shù)組轉(zhuǎn)換成一個字符串傅是。該方法按順序把多個數(shù)組元素連綴在一起匪燕,多個數(shù)組元素使用英文逗號和空格隔開。
Arrays類處于java.util包下喧笔,為了在程序中使用Arrays類帽驯,必須在程序中導(dǎo)入java.util.Arrays類。
void parallelPrefix(xxx[] array,XxxBinaryOperator op):該方法使用op參數(shù)指定的計(jì)算公式計(jì)算得到的結(jié)果作為新的元素书闸。op計(jì)算公式包括left尼变、right兩個形參,其中l(wèi)eft代表數(shù)組中前一個索引處的元素浆劲,right代表數(shù)組中當(dāng)前索引處的元素嫌术,當(dāng)計(jì)算第一個新數(shù)組元素時(shí),left的值默認(rèn)為1
void setAll(xxx[] array,IntToXxxFunction generator):該方法使用指定的生成器為所有數(shù)組元素設(shè)置值牌借,該生成器控制數(shù)組元素的值得生成算法度气。
void paralleSetAll(xxx[] array,IntToXxxFunction generator):該方法的功能與上一個方法相同,只是該方法增加了并行能力膨报,可以利用多CPU并行來提高性能
void parallelSort(xxx[] a,int fromIndex,int toIndex):該方法與sort()方法相似磷籍,該方法增加了并行能力。
Spliterator.OfXxx spliterator(xxx[] array):將數(shù)組的所有元素轉(zhuǎn)換成對應(yīng)的Spliterator對象现柠。
XxxStream stream(xxx[] array):該方法將數(shù)組轉(zhuǎn)換為Stream,Stream是java8新增的流式編程的API