溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是Java數(shù)組

發(fā)布時間:2021-06-26 10:01:20 來源:億速云 閱讀:141 作者:chen 欄目:編程語言

本篇內(nèi)容介紹了“什么是Java數(shù)組”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

“哥,我看你之前的文章里提到,ArrayList  的內(nèi)部是用數(shù)組實現(xiàn)的,我就對數(shù)組非常感興趣,想深入地了解一下,今天終于到這個環(huán)節(jié)了,好期待呀!”三妹的語氣里顯得很興奮。

“的確是的,看 ArrayList 的源碼就一清二楚了?!蔽乙贿呎f,一邊打開 Intellij IDEA,并找到了 ArrayList 的源碼。

/**  * The array buffer into which the elements of the ArrayList are stored.  * The capacity of the ArrayList is the length of this array buffer. Any  * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA  * will be expanded to DEFAULT_CAPACITY when the first element is added.  */ transient Object[] elementData; // non-private to simplify nested class access  /**  * The size of the ArrayList (the number of elements it contains).  *  * @serial  */ private int size;

“瞧見沒?Object[] elementData 就是數(shù)組?!蔽抑钢@示屏上這串代碼繼續(xù)說。

數(shù)組是一個對象,它包含了一組固定數(shù)量的元素,并且這些元素的類型是相同的。數(shù)組會按照索引的方式將元素放在指定的位置上,意味著我們可以通過索引來訪問這些元素。在  Java 中,索引是從 0 開始的。

“哥,能說一下為什么索引從 0 開始嗎?”三妹突然這個話題很感興趣。

“哦,Java 是基于 C/C++ 語言實現(xiàn)的,而 C 語言的下標是從 0 開始的,所以 Java  就繼承了這個良好的傳統(tǒng)習(xí)慣。C語言有一個很重要概念,叫做指針,它實際上是一個偏移量,距離開始位置的偏移量,第一個元素就在開始的位置,它的偏移量就為  0,所以索引就為 0?!贝丝?,我很自信。

“此外,還有另外一種說法。早期的計算機資源比較匱乏,0 作為起始下標相比較于 1 作為起始下標,編譯的效率更高。”

“哦?!比靡馕渡铋L地點了點頭。

我們可以將數(shù)組理解為一個個整齊排列的單元格,每個單元格里面存放著一個元素。

數(shù)組元素的類型可以是基本數(shù)據(jù)類型(比如說 int、double),也可以是引用數(shù)據(jù)類型(比如說 String),包括自定義類型。

數(shù)組的聲明方式分兩種。

先來看第一種:

int[] anArray;

再來看第二種:

int anOtherArray[];

不同之處就在于中括號的位置,是跟在類型關(guān)鍵字的后面,還是跟在變量的名稱的后面。前一種的使用頻率更高一些,像 ArrayList  的源碼中就用了第一種方式。

同樣的,數(shù)組的初始化方式也有多種,最常見的是:

int[] anArray = new int[10];

看到了沒?上面這行代碼中使用了 new 關(guān)鍵字,這就意味著數(shù)組的確是一個對象,只有對象的創(chuàng)建才會用到 new  關(guān)鍵字,基本數(shù)據(jù)類型是不用的。然后,我們需要在方括號中指定數(shù)組的長度。

這時候,數(shù)組中的每個元素都會被初始化為默認值,int 類型的就為 0,Object 類型的就為  null。不同數(shù)據(jù)類型的默認值不同,可以參照之前的文章。

另外,還可以使用大括號的方式,直接初始化數(shù)組中的元素:

int anOtherArray[] = new int[] {1, 2, 3, 4, 5};

這時候,數(shù)組的元素分別是 1、2、3、4、5,索引依次是 0、1、2、3、4,長度是 5。

“哥,怎么訪問數(shù)組呢?”三妹及時地插話到。

前面提到過,可以通過索引來訪問數(shù)組的元素,就像下面這樣:

anArray[0] = 10;

變量名,加上中括號,加上元素的索引,就可以訪問到數(shù)組,通過“=”操作符可以對元素進行賦值。

如果索引的值超出了數(shù)組的界限,就會拋出 ArrayIndexOutOfBoundException。

既然數(shù)組的索引是從 0 開始,那就是到數(shù)組的 length - 1 結(jié)束,不要使用超出這個范圍內(nèi)的索引訪問數(shù)組,就不會拋出數(shù)組越界的異常了。

當數(shù)組的元素非常多的時候,逐個訪問數(shù)組就太辛苦了,所以需要通過遍歷的方式。

第一種,使用 for 循環(huán):

int anOtherArray[] = new int[] {1, 2, 3, 4, 5}; for (int i = 0; i < anOtherArray.length; i++) {     System.out.println(anOtherArray[i]); }

通過 length 屬性獲取到數(shù)組的長度,然后從 0 開始遍歷,就得到了數(shù)組的所有元素。

第二種,使用 for-each 循環(huán):

for (int element : anOtherArray) {     System.out.println(element); }

如果不需要關(guān)心索引的話(意味著不需要修改數(shù)組的某個元素),使用 for-each 遍歷更簡潔一些。當然,也可以使用 while 和 do-while  循環(huán)。

在 Java 中,可變參數(shù)用于將任意數(shù)量的參數(shù)傳遞給方法,來看 varargsMethod() 方法:

void varargsMethod(String... varargs) {}

該方法可以接收任意數(shù)量的字符串參數(shù),可以是 0 個或者 N  個,本質(zhì)上,可變參數(shù)就是通過數(shù)組實現(xiàn)的。為了證明這一點,我們可以看一下反編譯一后的字節(jié)碼:

public class VarargsDemo {      public VarargsDemo()     {     }      transient void varargsMethod(String as[])     {     } }

所以,我們其實可以直接將數(shù)組作為參數(shù)傳遞給該方法:

VarargsDemo demo = new VarargsDemo(); String[] anArray = new String[] {"沉默王二", "一枚有趣的程序員"}; demo.varargsMethod(anArray);

也可以直接傳遞多個字符串,通過逗號隔開的方式:

demo.varargsMethod("沉默王二", "一枚有趣的程序員");

在 Java 中,數(shù)組與 List 關(guān)系非常密切。List  封裝了很多常用的方法,方便我們對集合進行一些操作,而如果直接操作數(shù)組的話,有很多不便,因為數(shù)組本身沒有提供這些封裝好的操作,所以有時候我們需要把數(shù)組轉(zhuǎn)成  List。

“怎么轉(zhuǎn)呢?”三妹問到。

最原始的方式,就是通過遍歷數(shù)組的方式,一個個將數(shù)組添加到 List 中。

int[] anArray = new int[] {1, 2, 3, 4, 5};  List<Integer> aList = new ArrayList<>(); for (int element : anArray) {     aList.add(element); }

更優(yōu)雅的方式是通過 Arrays 類的 asList() 方法:

List<Integer> aList = Arrays.asList(anArray);

但需要注意的是,該方法返回的 ArrayList 并不是 java.util.ArrayList,它其實是 Arrays 類的一個內(nèi)部類:

private static class ArrayList<E> extends AbstractList<E>         implements RandomAccess, java.io.Serializable{}

如果需要添加元素或者刪除元素的話,需要把它轉(zhuǎn)成 java.util.ArrayList。

new ArrayList<>(Arrays.asList(anArray));

Java 8 新增了 Stream 流的概念,這就意味著我們也可以將數(shù)組轉(zhuǎn)成 Stream 進行操作。

String[] anArray = new String[] {"沉默王二", "一枚有趣的程序員", "好好珍重他"}; Stream<String> aStream = Arrays.stream(anArray);

如果想對數(shù)組進行排序的話,可以使用 Arrays 類提供的 sort() 方法。

基本數(shù)據(jù)類型按照升序排列

實現(xiàn)了 Comparable 接口的對象按照 compareTo() 的排序

來看第一個例子:

int[] anArray = new int[] {5, 2, 1, 4, 8}; Arrays.sort(anArray);

排序后的結(jié)果如下所示:

[1, 2, 4, 5, 8]

來看第二個例子:

String[] yetAnotherArray = new String[] {"A", "E", "Z", "B", "C"}; Arrays.sort(yetAnotherArray, 1, 3,                 Comparator.comparing(String::toString).reversed());

只對 1-3 位置上的元素進行反序,所以結(jié)果如下所示:

[A, Z, E, B, C]

有時候,我們需要從數(shù)組中查找某個具體的元素,最直接的方式就是通過遍歷的方式:

int[] anArray = new int[] {5, 2, 1, 4, 8}; for (int i = 0; i < anArray.length; i++) {     if (anArray[i] == 4) {         System.out.println("找到了 " + i);         break;     } }

上例中從數(shù)組中查詢元素 4,找到后通過 break 關(guān)鍵字退出循環(huán)。

如果數(shù)組提前進行了排序,就可以使用二分查找法,這樣效率就會更高一些。Arrays.binarySearch()  方法可供我們使用,它需要傳遞一個數(shù)組,和要查找的元素。

int[] anArray = new int[] {1, 2, 3, 4, 5}; int index = Arrays.binarySearch(anArray, 4);

“除了一維數(shù)組,還有二維數(shù)組,三妹你可以去研究下,比如說用二維數(shù)組打印一下楊輝三角?!闭f完,我就去陽臺上休息了,留三妹在那里學(xué)習(xí),不能打擾她。

“什么是Java數(shù)組”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI