Java數(shù)組擴(kuò)容后輸出結(jié)果異常,問(wèn)題出在哪兒?

Java數(shù)組擴(kuò)容及輸出結(jié)果異常分析

本文分析一段Java代碼,該代碼意圖實(shí)現(xiàn)數(shù)組動(dòng)態(tài)擴(kuò)容,但輸出結(jié)果與預(yù)期不符。我們將剖析問(wèn)題根源并提供解決方案。

代碼旨在將元素4添加到數(shù)組int[] arr = {1, 2, 3}的末尾,使其變?yōu)?{1, 2, 3, 4}。代碼創(chuàng)建新數(shù)組,復(fù)制原數(shù)組元素,添加新元素,然后將新數(shù)組賦值給原數(shù)組變量。

原始代碼如下:

public class AddToArray {     public static void main(String[] args) {         int arr1[] = {1, 2, 3};         int arr2[] = new int[arr1.length + 1];          for (int i = 0; i < arr1.length; i++) {             arr2[i] = arr1[i];         }         arr2[arr1.length] = 4;         arr1 = arr2; //關(guān)鍵:將引用指向新的數(shù)組          for (int i = 0; i < arr1.length; i++) {             System.out.println(arr1[i] + 't'); //問(wèn)題出在這里         }     } }

程序預(yù)期輸出 1 2 3 4,但實(shí)際輸出可能與預(yù)期不同,這取決于運(yùn)行環(huán)境和System.out.println(arr1[i] + ‘t’);這行代碼。

立即學(xué)習(xí)Java免費(fèi)學(xué)習(xí)筆記(深入)”;

問(wèn)題分析:

System.out.println(arr1[i] + ‘t’); 這行代碼中的 + 運(yùn)算符并非簡(jiǎn)單的字符串連接。由于’t’是制表符,它具有ASCII碼值9。Java會(huì)將整數(shù)arr1[i]與整數(shù)9相加,然后再將結(jié)果轉(zhuǎn)換為字符串輸出。這導(dǎo)致輸出結(jié)果并非數(shù)組元素本身。

解決方案:

為了避免整數(shù)相加,應(yīng)該將’t’與arr1[i]進(jìn)行字符串連接,或者直接輸出arr1[i]。修改后的代碼如下:

public class AddToArray {     public static void main(String[] args) {         int arr1[] = {1, 2, 3};         int arr2[] = new int[arr1.length + 1];          for (int i = 0; i < arr1.length; i++) {             arr2[i] = arr1[i];         }         arr2[arr1.length] = 4;         arr1 = arr2; //關(guān)鍵:將引用指向新的數(shù)組          for (int i = 0; i < arr1.length; i++) {             System.out.print(arr1[i] + "t"); // 使用字符串連接         }         System.out.println(); //換行     } }

或者:

public class AddToArray {     public static void main(String[] args) {         int arr1[] = {1, 2, 3};         int arr2[] = new int[arr1.length + 1];          for (int i = 0; i < arr1.length; i++) {             arr2[i] = arr1[i];         }         arr2[arr1.length] = 4;         arr1 = arr2; //關(guān)鍵:將引用指向新的數(shù)組          for (int i = 0; i < arr1.length; i++) {             System.out.print(arr1[i]); // 直接輸出整數(shù)             if (i < arr1.length -1) System.out.print("t"); //添加制表符,避免最后多一個(gè)制表符         }         System.out.println(); //換行     } }

修改后的代碼將正確輸出 “1 2 3 4” (或者 “1234” 如果使用第二個(gè)修改方案)。 這強(qiáng)調(diào)了編程中細(xì)微符號(hào)錯(cuò)誤可能導(dǎo)致意想不到結(jié)果,需要仔細(xì)檢查代碼細(xì)節(jié)。 另外,需要注意的是,Java數(shù)組是引用類(lèi)型,arr1 = arr2; 這一行是將arr1的引用指向了新的數(shù)組arr2,而不是復(fù)制數(shù)組內(nèi)容。

Java數(shù)組擴(kuò)容后輸出結(jié)果異常,問(wèn)題出在哪兒?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享