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

Java中初始化數組

開發 后端
數組是一種有用的數據類型,用于管理在連續內存位置中建模最好的集合元素。下面是如何有效地使用它們。

[[281233]]

數組是一種有用的數據類型,用于管理在連續內存位置中建模最好的集合元素。下面是如何有效地使用它們。

有使用 C 或者 FORTRAN 語言編程經驗的人會對數組的概念很熟悉。它們基本上是一個連續的內存塊,其中每個位置都是某種數據類型:整型、浮點型或者諸如此類的數據類型。

Java 的情況與此類似,但是有一些額外的問題。

一個數組的示例

讓我們在 Java 中創建一個長度為 10 的整型數組:

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

上面的代碼片段會發生什么?從左到右依次是:

  1. 最左邊的 int[] 將變量的類型聲明為 int 數組(由 [] 表示)。
  2. 它的右邊是變量的名稱,當前為 ia
  3. 接下來,= 告訴我們,左側定義的變量賦值為右側的內容。
  4. = 的右側,我們看到了 new,它在 Java 中表示一個對象正在被初始化中,這意味著已為其分配存儲空間并調用了其構造函數(請參見此處以獲取更多信息)。
  5. 然后,我們看到 int[10],它告訴我們正在初始化的這個對象是包含 10 個整型的數組。

因為 Java 是強類型的,所以變量 ia 的類型必須跟 = 右側表達式的類型兼容。

初始化示例數組

讓我們把這個簡單的數組放在一段代碼中,并嘗試運行一下。將以下內容保存到一個名為 Test1.java 的文件中,使用 javac 編譯,使用 java 運行(當然是在終端中):

  1. import java.lang.*;
  2.  
  3. public class Test1 {
  4.  
  5. public static void main(String[] args) {
  6. int[] ia = new int[10]; // 見下文注 1
  7. System.out.println("ia is " + ia.getClass()); // 見下文注 2
  8. for (int i = 0; i < ia.length; i++) // 見下文注 3
  9. System.out.println("ia[" + i + "] = " + ia[i]); // 見下文注 4
  10. }
  11.  
  12. }

讓我們來看看最重要的部分。

  1. 我們聲明和初始化了長度為 10 的整型數組,即 ia,這顯而易見。
  2. 在下面的行中,我們看到表達式 ia.getClass()。沒錯,ia 是屬于一個對象,這行代碼將告訴我們是哪個類。
  3. 在緊接的下一行中,我們看到了一個循環 for (int i = 0; i < ia.length; i++),它定義了一個循環索引變量 i,該變量遍歷了從 0 到比 ia.length 小 1 的序列,這個表達式告訴我們在數組 ia 中定義了多少個元素。
  4. 接下來,循環體打印出 ia 的每個元素的值。

當這個程序編譯和運行時,它產生以下結果:

  1. me@mydesktop:~/Java$ javac Test1.java
  2. me@mydesktop:~/Java$ java Test1
  3. ia is class [I
  4. ia[0] = 0
  5. ia[1] = 0
  6. ia[2] = 0
  7. ia[3] = 0
  8. ia[4] = 0
  9. ia[5] = 0
  10. ia[6] = 0
  11. ia[7] = 0
  12. ia[8] = 0
  13. ia[9] = 0
  14. me@mydesktop:~/Java$

ia.getClass() 的輸出的字符串表示形式是 [I,它是“整數數組”的簡寫。與 C 語言類似,Java 數組以第 0 個元素開始,擴展到第 <數組大小> - 1 個元素。如上所見,我們可以看到數組 ia 的每個元素都(似乎由數組構造函數)設置為零。

所以,就這些嗎?聲明類型,使用適當的初始化器,就完成了嗎?

好吧,并沒有。在 Java 中有許多其它方法來初始化數組。

為什么我要初始化一個數組,有其它方式嗎?

像所有好的問題一樣,這個問題的答案是“視情況而定”。在這種情況下,答案取決于初始化后我們希望對數組做什么。

在某些情況下,數組自然會作為一種累加器出現。例如,假設我們正在編程實現計算小型辦公室中一組電話分機接收和撥打的電話數量。一共有 8 個分機,編號為 1 到 8,加上話務員的分機,編號為 0。 因此,我們可以聲明兩個數組:

  1. int[] callsMade;
  2. int[] callsReceived;

然后,每當我們開始一個新的累計呼叫統計數據的周期時,我們就將每個數組初始化為:

  1. callsMade = new int[9];
  2. callsReceived = new int[9];

在每個累計通話統計數據的最后階段,我們可以打印出統計數據。粗略地說,我們可能會看到:

  1. import java.lang.*;
  2. import java.io.*;
  3.  
  4. public class Test2 {
  5.  
  6. public static void main(String[] args) {
  7.  
  8. int[] callsMade;
  9. int[] callsReceived;
  10.  
  11. // 初始化呼叫計數器
  12.  
  13. callsMade = new int[9];
  14. callsReceived = new int[9];
  15.  
  16. // 處理呼叫……
  17. // 分機撥打電話:callsMade[ext]++
  18. // 分機接聽電話:callsReceived[ext]++
  19.  
  20. // 匯總通話統計
  21.  
  22. System.out.printf("%3s%25s%25s\n", "ext", " calls made",
  23. "calls received");
  24. for (int ext = 0; ext < callsMade.length; ext++) {
  25. System.out.printf("%3d%25d%25d\n", ext,
  26. callsMade[ext], callsReceived[ext]);
  27. }
  28.  
  29. }
  30.  
  31. }

這會產生這樣的輸出:

  1. me@mydesktop:~/Java$ javac Test2.java
  2. me@mydesktop:~/Java$ java Test2
  3. ext calls made calls received
  4. 0 0 0
  5. 1 0 0
  6. 2 0 0
  7. 3 0 0
  8. 4 0 0
  9. 5 0 0
  10. 6 0 0
  11. 7 0 0
  12. 8 0 0
  13. me@mydesktop:~/Java$

看來這一天呼叫中心不是很忙。

在上面的累加器示例中,我們看到由數組初始化程序設置的零起始值可以滿足我們的需求。但是在其它情況下,這個起始值可能不是正確的選擇。

例如,在某些幾何計算中,我們可能需要將二維數組初始化為單位矩陣(除沿主對角線———左上角到右下角——以外所有全是零)。我們可以選擇這樣做:

  1. double[][] m = new double[3][3];
  2. for (int d = 0; d < 3; d++) {
  3. m[d][d] = 1.0;
  4. }

在這種情況下,我們依靠數組初始化器 new double[3][3] 將數組設置為零,然后使用循環將主對角線上的元素設置為 1。在這種簡單情況下,我們可以使用 Java 提供的快捷方式:

  1. double[][] m = {
  2. {1.0, 0.0, 0.0},
  3. {0.0, 1.0, 0.0},
  4. {0.0, 0.0, 1.0}};

這種可視結構特別適用于這種應用程序,在這種應用程序中,它便于復查數組的實際布局。但是在這種情況下,行數和列數只在運行時確定時,我們可能會看到這樣的東西:

  1. int nrc;
  2. // 一些代碼確定行數和列數 = nrc
  3. double[][] m = new double[nrc][nrc];
  4. for (int d = 0; d < nrc; d++) {
  5. m[d][d] = 1.0;
  6. }

值得一提的是,Java 中的二維數組實際上是數組的數組,沒有什么能阻止無畏的程序員讓這些第二層數組中的每個數組的長度都不同。也就是說,下面這樣的事情是完全合法的:

  1. int [][] differentLengthRows = {
  2. {1, 2, 3, 4, 5},
  3. {6, 7, 8, 9},
  4. {10, 11, 12},
  5. {13, 14},
  6. {15}};

在涉及不規則形狀矩陣的各種線性代數應用中,可以應用這種類型的結構(有關更多信息,請參見此 Wikipedia 文章)。除此之外,既然我們了解到二維數組實際上是數組的數組,那么以下內容也就不足為奇了:

  1. differentLengthRows.length

可以告訴我們二維數組 differentLengthRows 的行數,并且:

  1. differentLengthRows[i].length

告訴我們 differentLengthRowsi 行的列數。

深入理解數組

考慮到在運行時確定數組大小的想法,我們看到數組在實例化之前仍需要我們知道該大小。但是,如果在處理完所有數據之前我們不知道大小怎么辦?這是否意味著我們必須先處理一次以找出數組的大小,然后再次處理?這可能很難做到,尤其是如果我們只有一次機會使用數據時。

Java 集合框架很好地解決了這個問題。提供的其中一項是 ArrayList 類,它類似于數組,但可以動態擴展。為了演示 ArrayList 的工作原理,讓我們創建一個 ArrayList 對象并將其初始化為前 20 個斐波那契數字

  1. import java.lang.*;
  2. import java.util.*;
  3.  
  4. public class Test3 {
  5.  
  6. public static void main(String[] args) {
  7.  
  8. ArrayList<Integer> fibos = new ArrayList<Integer>();
  9.  
  10. fibos.add(0);
  11. fibos.add(1);
  12. for (int i = 2; i < 20; i++) {
  13. fibos.add(fibos.get(i - 1) + fibos.get(i - 2));
  14. }
  15.  
  16. for (int i = 0; i < fibos.size(); i++) {
  17. System.out.println("fibonacci " + i + " = " + fibos.get(i));
  18. }
  19.  
  20. }
  21. }

上面的代碼中,我們看到:

  • 用于存儲多個 IntegerArrayList 的聲明和實例化。
  • 使用 add() 附加到 ArrayList 實例。
  • 使用 get() 通過索引號檢索元素。
  • 使用 size() 來確定 ArrayList 實例中已經有多少個元素。

這里沒有展示 put() 方法,它的作用是將一個值放在給定的索引號上。

該程序的輸出為:

  1. fibonacci 0 = 0
  2. fibonacci 1 = 1
  3. fibonacci 2 = 1
  4. fibonacci 3 = 2
  5. fibonacci 4 = 3
  6. fibonacci 5 = 5
  7. fibonacci 6 = 8
  8. fibonacci 7 = 13
  9. fibonacci 8 = 21
  10. fibonacci 9 = 34
  11. fibonacci 10 = 55
  12. fibonacci 11 = 89
  13. fibonacci 12 = 144
  14. fibonacci 13 = 233
  15. fibonacci 14 = 377
  16. fibonacci 15 = 610
  17. fibonacci 16 = 987
  18. fibonacci 17 = 1597
  19. fibonacci 18 = 2584
  20. fibonacci 19 = 4181

ArrayList 實例也可以通過其它方式初始化。例如,可以給 ArrayList 構造器提供一個數組,或者在編譯過程中知道初始元素時也可以使用 List.of()array.aslist() 方法。我發現自己并不經常使用這些方式,因為我對 ArrayList 的主要用途是當我只想讀取一次數據時。

此外,對于那些喜歡在加載數據后使用數組的人,可以使用 ArrayListtoArray() 方法將其實例轉換為數組;或者,在初始化 ArrayList 實例之后,返回到當前數組本身。

Java 集合框架提供了另一種類似數組的數據結構,稱為 Map(映射)。我所說的“類似數組”是指 Map 定義了一個對象集合,它的值可以通過一個鍵來設置或檢索,但與數組(或 ArrayList)不同,這個鍵不需要是整型數;它可以是 String 或任何其它復雜對象。

例如,我們可以創建一個 Map,其鍵為 String,其值為 Integer 類型,如下:

  1. Map<String, Integer> stoi = new Map<String, Integer>();

然后我們可以對這個 Map 進行如下初始化:

  1. stoi.set("one",1);
  2. stoi.set("two",2);
  3. stoi.set("three",3);

等類似操作。稍后,當我們想要知道 "three" 的數值時,我們可以通過下面的方式將其檢索出來:

  1. stoi.get("three");

在我的認知中,Map 對于將第三方數據集中出現的字符串轉換為我的數據集中的一致代碼值非常有用。作為數據轉換管道的一部分,我經常會構建一個小型的獨立程序,用作在處理數據之前清理數據;為此,我幾乎總是會使用一個或多個 Map

值得一提的是,ArrayListArrayListMapMap 是很可能的,有時也是合理的。例如,假設我們在看樹,我們對按樹種和年齡范圍累計樹的數目感興趣。假設年齡范圍定義是一組字符串值(“young”、“mid”、“mature” 和 “old”),物種是 “Douglas fir”、“western red cedar” 等字符串值,那么我們可以將這個 Map 中的 Map 定義為:

  1. Map<String, Map<String, Integer>> counter = new Map<String, Map<String, Integer>>();

這里需要注意的一件事是,以上內容僅為 Map創建存儲。因此,我們的累加代碼可能類似于:

  1. // 假設我們已經知道了物種和年齡范圍
  2. if (!counter.containsKey(species)) {
  3. counter.put(species,new Map<String, Integer>());
  4. }
  5. if (!counter.get(species).containsKey(ageRange)) {
  6. counter.get(species).put(ageRange,0);
  7. }

此時,我們可以這樣開始累加:

  1. counter.get(species).put(ageRange, counter.get(species).get(ageRange) + 1);

最后,值得一提的是(Java 8 中的新特性)Streams 還可以用來初始化數組、ArrayList 實例和 Map 實例。關于此特性的詳細討論可以在此處此處中找到。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2009-06-11 13:26:16

Java數組聲明創建

2009-09-08 09:48:34

LINQ初始化數組

2009-09-18 11:15:52

C#數組初始化

2009-09-02 16:52:55

C#數組初始化

2009-11-18 17:53:18

PHP數組初始化

2011-07-07 15:13:42

PHP

2009-09-17 16:06:22

C#數組初始化

2011-06-17 15:29:44

C#對象初始化器集合初始化器

2009-08-28 11:24:48

C#一維數組初始化

2009-09-17 16:17:41

C#參差數組初始化

2023-11-12 23:08:17

C++初始化

2015-09-21 09:02:39

java數組

2012-03-13 13:38:42

Java

2010-01-13 18:01:43

VB.NET數組初始化

2009-08-28 11:09:35

C#數組初始化

2015-09-16 13:11:23

Java數組初始化

2009-09-18 11:33:37

C#二維數組初始化

2009-10-20 14:03:48

VB.NET數組聲明VB.NET數組初始化

2009-08-26 18:28:44

C#數組

2011-07-22 17:46:43

java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久综合伊人 | 精品国产一区二区三区性色 | 免费av观看 | 狠狠干av| 91文字幕巨乱亚洲香蕉 | 黄在线 | 在线不卡视频 | 日日夜夜免费精品视频 | 中文字幕精品一区 | 亚洲欧美在线视频 | 99精品电影 | 四虎av电影 | 精品免费 | 午夜成人免费视频 | a级片在线观看 | 免费观看羞羞视频网站 | 国产在线观看网站 | 黑色丝袜三级在线播放 | 亚洲黄色一区二区三区 | 国产精品视频在线观看 | 精品一区二区三区在线观看国产 | 北条麻妃99精品青青久久主播 | 欧美一区二区三区四区视频 | 日本天堂视频在线观看 | av影音 | 欧美日韩在线一区二区 | 精品在线99| 国产91丝袜在线熟 | 在线精品一区 | 一区二区三区四区在线视频 | 亚洲欧美综合网 | 亚洲网站在线观看 | 欧美日韩高清一区二区三区 | 99久久久99久久国产片鸭王 | 亚洲精品日韩视频 | 国产在线不卡 | 精品国偷自产在线 | 国产精品久久毛片av大全日韩 | av一区二区三区四区 | 福利一区在线观看 | 国产精品一区2区 |