溫馨提示×

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

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

Java中怎樣初始化數(shù)組

發(fā)布時(shí)間:2021-08-12 15:53:09 來源:億速云 閱讀:151 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關(guān)Java中怎樣初始化數(shù)組,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。


一個(gè)數(shù)組的示例

讓我們?cè)?Java 中創(chuàng)建一個(gè)長(zhǎng)度為 10 的整型數(shù)組:

int[] ia = new int[10];

上面的代碼片段會(huì)發(fā)生什么?從左到右依次是:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 最左邊的 int[] 將變量的類型聲明為 int 數(shù)組(由 [] 表示)。

  3. 它的右邊是變量的名稱,當(dāng)前為 ia。

  4. 接下來,= 告訴我們,左側(cè)定義的變量賦值為右側(cè)的內(nèi)容。

  5. = 的右側(cè),我們看到了 new,它在 Java 中表示一個(gè)對(duì)象正在被初始化中,這意味著已為其分配存儲(chǔ)空間并調(diào)用了其構(gòu)造函數(shù)(請(qǐng)參見此處以獲取更多信息)。

  6. 然后,我們看到 int[10],它告訴我們正在初始化的這個(gè)對(duì)象是包含 10 個(gè)整型的數(shù)組。

因?yàn)?Java 是強(qiáng)類型的,所以變量 ia 的類型必須跟 = 右側(cè)表達(dá)式的類型兼容。

初始化示例數(shù)組

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

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

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

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 我們聲明和初始化了長(zhǎng)度為 10 的整型數(shù)組,即 ia,這顯而易見。

  3. 在下面的行中,我們看到表達(dá)式 ia.getClass()。沒錯(cuò),ia 是屬于一個(gè)對(duì)象,這行代碼將告訴我們是哪個(gè)類。

  4. 在緊接的下一行中,我們看到了一個(gè)循環(huán) for (int i = 0; i < ia.length; i++),它定義了一個(gè)循環(huán)索引變量 i,該變量遍歷了從 0 到比 ia.length 小 1 的序列,這個(gè)表達(dá)式告訴我們?cè)跀?shù)組 ia 中定義了多少個(gè)元素。

  5. 接下來,循環(huán)體打印出 ia 的每個(gè)元素的值。

當(dāng)這個(gè)程序編譯和運(yùn)行時(shí),它產(chǎn)生以下結(jié)果:

me@mydesktop:~/Java$ javac Test1.javame@mydesktop:~/Java$ java Test1ia is class [Iia[0] = 0ia[1] = 0ia[2] = 0ia[3] = 0ia[4] = 0ia[5] = 0ia[6] = 0ia[7] = 0ia[8] = 0ia[9] = 0me@mydesktop:~/Java$

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

所以,就這些嗎?聲明類型,使用適當(dāng)?shù)某跏蓟?,就完成了?

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

為什么我要初始化一個(gè)數(shù)組,有其它方式嗎?

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

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

int[] callsMade;int[] callsReceived;

然后,每當(dāng)我們開始一個(gè)新的累計(jì)呼叫統(tǒng)計(jì)數(shù)據(jù)的周期時(shí),我們就將每個(gè)數(shù)組初始化為:

callsMade = new int[9];callsReceived = new int[9];

在每個(gè)累計(jì)通話統(tǒng)計(jì)數(shù)據(jù)的最后階段,我們可以打印出統(tǒng)計(jì)數(shù)據(jù)。粗略地說,我們可能會(huì)看到:

import java.lang.*;import java.io.*; public class Test2 {     public static void main(String[] args) {         int[] callsMade;        int[] callsReceived;         // 初始化呼叫計(jì)數(shù)器         callsMade = new int[9];        callsReceived = new int[9];         // 處理呼叫&hellip;&hellip;        //   分機(jī)撥打電話:callsMade[ext]++        //   分機(jī)接聽電話:callsReceived[ext]++         // 匯總通話統(tǒng)計(jì)         System.out.printf("%3s%25s%25s\n", "ext", " calls made",                "calls received");        for (int ext = 0; ext < callsMade.length; ext++) {            System.out.printf("%3d%25d%25d\n", ext,                    callsMade[ext], callsReceived[ext]);        }     } }

這會(huì)產(chǎn)生這樣的輸出:

me@mydesktop:~/Java$ javac Test2.javame@mydesktop:~/Java$ java Test2ext               calls made           calls received  0                        0                        0  1                        0                        0  2                        0                        0  3                        0                        0  4                        0                        0  5                        0                        0  6                        0                        0  7                        0                        0  8                        0                        0me@mydesktop:~/Java$

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

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

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

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

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

double[][] m = {        {1.0, 0.0, 0.0},        {0.0, 1.0, 0.0},        {0.0, 0.0, 1.0}};

這種可視結(jié)構(gòu)特別適用于這種應(yīng)用程序,在這種應(yīng)用程序中,它便于復(fù)查數(shù)組的實(shí)際布局。但是在這種情況下,行數(shù)和列數(shù)只在運(yùn)行時(shí)確定時(shí),我們可能會(huì)看到這樣的東西:

int nrc;// 一些代碼確定行數(shù)和列數(shù) = nrcdouble[][] m = new double[nrc][nrc];for (int d = 0; d < nrc; d++) {    m[d][d] = 1.0;}

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

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

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

differentLengthRows.length

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

differentLengthRows[i].length

告訴我們 differentLengthRowsi 行的列數(shù)。

深入理解數(shù)組

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

Java 集合框架很好地解決了這個(gè)問題。提供的其中一項(xiàng)是 ArrayList 類,它類似于數(shù)組,但可以動(dòng)態(tài)擴(kuò)展。為了演示 ArrayList 的工作原理,讓我們創(chuàng)建一個(gè) ArrayList 對(duì)象并將其初始化為前 20 個(gè)斐波那契數(shù)字:

import java.lang.*;import java.util.*; public class Test3 {     public static void main(String[] args) {         ArrayList<Integer> fibos = new ArrayList<Integer>();         fibos.add(0);        fibos.add(1);        for (int i = 2; i < 20; i++) {            fibos.add(fibos.get(i - 1) + fibos.get(i - 2));        }         for (int i = 0; i < fibos.size(); i++) {            System.out.println("fibonacci " + i + " = " + fibos.get(i));        }     }}

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

  • 用于存儲(chǔ)多個(gè) IntegerArrayList 的聲明和實(shí)例化。

  • 使用 add() 附加到 ArrayList 實(shí)例。

  • 使用 get() 通過索引號(hào)檢索元素。

  • 使用 size() 來確定 ArrayList 實(shí)例中已經(jīng)有多少個(gè)元素。

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

該程序的輸出為:

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

ArrayList 實(shí)例也可以通過其它方式初始化。例如,可以給 ArrayList 構(gòu)造器提供一個(gè)數(shù)組,或者在編譯過程中知道初始元素時(shí)也可以使用 List.of()array.aslist() 方法。我發(fā)現(xiàn)自己并不經(jīng)常使用這些方式,因?yàn)槲覍?duì) ArrayList 的主要用途是當(dāng)我只想讀取一次數(shù)據(jù)時(shí)。

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

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

例如,我們可以創(chuàng)建一個(gè) Map,其鍵為 String,其值為 Integer 類型,如下:

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

然后我們可以對(duì)這個(gè) Map 進(jìn)行如下初始化:

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

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

stoi.get("three");

在我的認(rèn)知中,Map 對(duì)于將第三方數(shù)據(jù)集中出現(xiàn)的字符串轉(zhuǎn)換為我的數(shù)據(jù)集中的一致代碼值非常有用。作為數(shù)據(jù)轉(zhuǎn)換管道的一部分,我經(jīng)常會(huì)構(gòu)建一個(gè)小型的獨(dú)立程序,用作在處理數(shù)據(jù)之前清理數(shù)據(jù);為此,我?guī)缀蹩偸菚?huì)使用一個(gè)或多個(gè) Map。

值得一提的是,ArrayListArrayListMapMap   是很可能的,有時(shí)也是合理的。例如,假設(shè)我們?cè)诳礃洌覀儗?duì)按樹種和年齡范圍累計(jì)樹的數(shù)目感興趣。假設(shè)年齡范圍定義是一組字符串值(“young”、“mid”、“mature”  和 “old”),物種是 “Douglas fir”、“western red cedar” 等字符串值,那么我們可以將這個(gè) Map 中的 Map 定義為:

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

這里需要注意的一件事是,以上內(nèi)容僅為 Map創(chuàng)建存儲(chǔ)。因此,我們的累加代碼可能類似于:

// 假設(shè)我們已經(jīng)知道了物種和年齡范圍if (!counter.containsKey(species)) {    counter.put(species,new Map<String, Integer>());}if (!counter.get(species).containsKey(ageRange)) {    counter.get(species).put(ageRange,0);}

此時(shí),我們可以這樣開始累加:

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

最后,值得一提的是(Java 8 中的新特性)Streams 還可以用來初始化數(shù)組、ArrayList 實(shí)例和 Map 實(shí)例。

以上就是Java中怎樣初始化數(shù)組,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

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

AI