成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

教妹學 Java之數組

開發 后端
“哥,我看你之前的文章里提到,ArrayList 的內部是用數組實現的,我就對數組非常感興趣,想深入地了解一下,今天終于到這個環節了,好期待呀!”三妹的語氣里顯得很興奮。

[[398498]]

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

“的確是的,看 ArrayList 的源碼就一清二楚了。”我一邊說,一邊打開 Intellij IDEA,并找到了 ArrayList 的源碼。

  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

“瞧見沒?Object[] elementData 就是數組。”我指著顯示屏上這串代碼繼續說。

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

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

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

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

“哦。”三妹意味深長地點了點頭。

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

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

數組的聲明方式分兩種。

先來看第一種:

  1. int[] anArray; 

再來看第二種:

  1. int anOtherArray[]; 

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

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

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

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

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

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

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

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

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

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

  1. anArray[0] = 10; 

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

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

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

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

第一種,使用 for 循環:

  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 屬性獲取到數組的長度,然后從 0 開始遍歷,就得到了數組的所有元素。

第二種,使用 for-each 循環:

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

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

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

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

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

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

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

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

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

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

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

“怎么轉呢?”三妹問到。

最原始的方式,就是通過遍歷數組的方式,一個個將數組添加到 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); 

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

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

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

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

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

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

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

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

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

基本數據類型按照升序排列

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

來看第一個例子:

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

排序后的結果如下所示:

  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 位置上的元素進行反序,所以結果如下所示:

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

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

  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.     } 

上例中從數組中查詢元素 4,找到后通過 break 關鍵字退出循環。

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

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

“除了一維數組,還有二維數組,三妹你可以去研究下,比如說用二維數組打印一下楊輝三角。”說完,我就去陽臺上休息了,留三妹在那里學習,不能打擾她。

本文轉載自微信公眾號「沉默王二」,可以通過以下二維碼關注。轉載本文請聯系沉默王二公眾號。

 

 

責任編輯:武曉燕 來源: 沉默王二
相關推薦

2021-06-06 20:56:48

Java內存 intern

2020-11-18 09:44:49

Java命名約定

2020-10-26 09:36:45

Java變量數據

2021-07-08 22:43:41

ThrowThrowsJava

2021-07-26 17:22:02

Java

2021-07-03 17:53:52

Java異常處理機制

2021-06-11 18:08:00

Java字符串拼接

2020-10-29 10:28:31

Java數據類型

2021-07-30 09:32:55

JavaEquals

2020-11-13 10:29:37

流程控制語句

2022-11-26 00:34:57

數組Java程序

2020-12-09 05:19:35

static關鍵字Java

2021-05-14 07:53:32

Java打印數組

2022-02-16 08:26:18

Go并發信號量

2022-10-31 07:33:05

Javafor循環

2018-03-06 10:46:42

代碼Python買水果

2022-09-30 07:32:48

循環while循環體

2022-10-30 10:14:43

Java循環語句

2022-08-05 12:05:07

JavaGuava集合

2022-09-16 07:32:15

編程計算機命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久午夜片 | 成人久草 | 在线观看免费av网 | 成人国内精品久久久久一区 | 精品一区二区三区中文字幕 | 日韩视频专区 | 最近日韩中文字幕 | 欧美国产精品一区二区三区 | 亚洲国产精品99久久久久久久久 | 国产一区二区三区www | 久久久成人免费一区二区 | 欧美一二三 | 欧美一级电影免费 | 一区二区三区在线免费观看 | 韩三级在线观看 | 91精品国产一区二区三区 | 成人在线免费电影 | 在线播放91| 亚洲 中文 欧美 | 日本一区二区在线视频 | 国产乱性 | 免费观看av网站 | www.4567| 欧美v片| 国产免费一区二区三区 | 久久精品免费看 | 视频在线一区二区 | 一区二区三区四区五区在线视频 | 超碰成人免费 | 亚洲一区二区在线播放 | www.久久 | 黄色亚洲网站 | 欧美日韩三区 | 精精国产xxxx视频在线播放 | 国产成人亚洲精品 | 欧美国产中文字幕 | 欧美久操网 | 亚洲一区二区中文字幕 | 视频三区 | av不卡一区 | 国产午夜精品视频 |