自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java 數(shù)組優(yōu)秀指南,快收藏讓它吃灰

開發(fā) 后端
兩年前,我甚至寫過一篇文章,吐槽數(shù)組在 Java 中挺雞肋的,因為有 List 誰用數(shù)組啊,現(xiàn)在想想那時候的自己好幼稚,好可笑。因為我只看到了表面現(xiàn)象,實際上呢,List 的內(nèi)部仍然是通過數(shù)組實現(xiàn)的。

 [[331325]]

兩年前,我甚至寫過一篇文章,吐槽數(shù)組在 Java 中挺雞肋的,因為有 List 誰用數(shù)組啊,現(xiàn)在想想那時候的自己好幼稚,好可笑。因為我只看到了表面現(xiàn)象,實際上呢,List 的內(nèi)部仍然是通過數(shù)組實現(xiàn)的,比如說 ArrayList,在它的源碼里可以看到下面這些內(nèi)容:

 

  1. /** 
  2.  * The array buffer into which the elements of the ArrayList are stored. 
  3.  * The capacity of the ArrayList is the length of this array buffer. Any 
  4.  * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 
  5.  * will be expanded to DEFAULT_CAPACITY when the first element is added. 
  6.  */ 
  7. transient Object[] elementData; // non-private to simplify nested class access 
  8.  
  9. /** 
  10.  * The size of the ArrayList (the number of elements it contains). 
  11.  * 
  12.  * @serial 
  13.  */ 
  14. private int size

數(shù)組在 Java 中,必須算是核心,神一般的存在。

01、什么是數(shù)組

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

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

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

了解了數(shù)組的定義后,讓我們來深入地研究一下數(shù)組的用法。

在 Java 中,數(shù)組的聲明方式有兩種。

先來看第一種:

 

  1. int[] anArray; 

再來看第二種:

 

  1. int anOtherArray[]; 

不同之處就在于中括號的位置,是緊跟類型,還是放在變量名的后面。前者比后者的使用頻率更高一些。

接下來就該看看怎么初始化數(shù)組了,同樣有多種方式可以初始化數(shù)組,比如說最常見的是:

 

  1. int[] anArray = new int[10]; 

使用了 new 關(guān)鍵字,對吧?這就意味著數(shù)組的確是一個對象。然后,在方括號中指定了數(shù)組的長度,這是必須的。

這時候,數(shù)組中的每個元素都會被初始化為默認值,int 類型的就為 0,Object 類型的就為 null。

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

 

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

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

02、訪問數(shù)組

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

 

  1. anArray[0] = 10; 
  2. System.out.println(anArray[0]); 

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

如果索引的值超出了數(shù)組的界限,就會拋出 ArrayIndexOutOfBoundException,關(guān)于這方面的知識,我之前特意寫過一篇文章,如果你感興趣的話,可以跳轉(zhuǎn)過去看看。

為什么會發(fā)生ArrayIndexOutOfBoundsException

我覺得原因挺有意思的。

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

03、遍歷數(shù)組

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

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

 

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

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

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

 

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

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

04、可變參數(shù)

可變參數(shù)用于將任意數(shù)量的參數(shù)傳遞給方法:

 

  1. void varargsMethod(String... varargs) {} 

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

 

  1. public class VarargsDemo 
  2.  
  3.     public VarargsDemo() 
  4.     { 
  5.     } 
  6.  
  7.     transient void varargsMethod(String as[]) 
  8.     { 
  9.     } 

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

 

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

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

 

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

05、把數(shù)組轉(zhuǎn)成 List

List 封裝了很多常用的方法,方便我們對集合進行一些操作,而如果直接操作數(shù)組的話,多有不便,因此有時候我們需要把數(shù)組轉(zhuǎn)成 List。

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

 

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

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

 

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

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

 

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

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

 

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

06、把數(shù)組轉(zhuǎn)成 Stream

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

 

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

也可以直接對數(shù)組的元素進行剪輯,通過指定索引的方式:

 

  1. Stream<String> anotherStream = Arrays.stream(anArray, 1, 3); 

結(jié)果包含"一枚有趣的程序員"和"好好珍重他",1 這個索引位置包括,3 這個索引位置不包括。

07、數(shù)組排序

Arrays 類提供了一個 sort() 方法,可以對數(shù)組進行排序。

  • 基本數(shù)據(jù)類型按照升序排列
  • 實現(xiàn)了 Comparable 接口的對象按照 compareTo() 的排序

來看第一個例子:

 

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

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

 

  1. [1, 2, 4, 5, 8] 

來看第二個例子:

 

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

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

 

  1. [A, Z, E, B, C] 

08、數(shù)組搜索

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

 

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

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

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

 

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

09、總結(jié)

除了一維數(shù)組,還有二維數(shù)組,但說實話,二維數(shù)組不太常用,這里就不再介紹了,感興趣的話,可以嘗試打印以下楊輝三角。

這篇文章,我們介紹了 Java 數(shù)組的基本用法和一些高級用法,我想小伙伴們應(yīng)該已經(jīng)完全掌握了。

責(zé)任編輯:華軒 來源: 沉默王二
相關(guān)推薦

2020-06-24 09:38:17

前端開發(fā)工具

2021-01-19 07:51:12

JavaScriptJavac++

2023-09-13 16:55:42

JavaScript數(shù)組

2021-01-26 05:04:47

屬性FlexBox用法

2021-02-01 07:55:37

JS 數(shù)組元素

2018-07-24 18:07:33

人工智能ARVR

2018-09-27 19:10:17

ARVRAI

2014-06-26 14:09:05

2022-08-05 09:15:27

數(shù)據(jù)治理

2018-09-11 12:54:53

面試HadoopKafka

2023-06-09 08:11:32

2021-03-02 11:40:17

Windows微軟技巧

2020-04-14 17:15:17

CSS工具Web開發(fā)

2021-07-19 10:13:41

Figma插件工具

2018-05-08 14:58:07

戴爾

2020-04-17 10:23:43

TDD測試驅(qū)動

2016-09-21 22:12:43

網(wǎng)絡(luò)爬蟲Java開源

2021-03-26 09:49:11

運維架構(gòu)技術(shù)

2025-03-03 07:00:00

點贊
收藏

51CTO技術(shù)棧公眾號