搜尋
首頁Javajava教程一起聊聊JAVA中字串和陣列做參數傳遞

本篇文章為大家帶來了關於java的相關知識,其中主要介紹了關於java字串和陣列做參數傳遞情況的相關問題,以下就來看一下為什麼說java只有值傳遞,希望對大家有幫助。

一起聊聊JAVA中字串和陣列做參數傳遞

推薦學習:《java學習教學

首先明確的一點就是在java中只有值傳遞!只有值傳遞!理論依據來自《think in java》。接下來就是具體說明為何java只有值傳遞。
因為java中有基本型別和引用型別兩種資料型,再加上String這個特殊的型別,所以主要從三個面向就行解釋。

1. 基本資料型別

先看程式碼

public class Demo01 {
    
    public void change(int a) {
        System.out.println("副本a 的初始值" + a);
        a = 20;
        System.out.println("副本a 的新值值" + a);
    }

    public static void main(String[] args) {
        int a = 10;
        Demo01 d = new Demo01();
        d.change(a);
        System.out.println("change方法执行后的值" + a);
    }
}

分析:

        在java中基本資料型別遵循值傳遞,所以物件d在調用change()方法時,只是將原始資料a的副本傳給方法中的參數,第一時間原本和副本a的值都是10,在執行到a=20後,副本a的值變成了20。

所以運行結果為:

原理參考下圖

2. 引用資料類型

先看程式碼

public class Demo02 {

    char[] ch = {'a', 'b', 'c'};

    public void change(char ch[]) {
        System.out.println("方法中ch[0]的初始值:" + ch[0]);
        ch[0] = 'g';
        System.out.println("方法中ch[0]执行后的新值:" + ch[0]);
    }

    public static void main(String[] args) {
        Demo02 d = new Demo02();
        System.out.println("对象d中数组的初始值是:"+d.ch);
        d.change(d.ch);
        System.out.println("对象d中数组的最终值是:"+d.ch);
    }
}

分析:

        在傳遞類型作為參數傳遞時,也屬於數值傳遞,此時傳遞的是位址值副本,但這兩個地址指向同一個地方。當副本位址沒有進行變更指向時,對副本位址指向的資料進行操作會影響到原始資料的值。方法中ch[] 數組和原始ch[]數組指向同一個數據,所以初始階段ch[0]都指向’a’;接著對副本中的ch[0]進行新的賦值變為‘g’。
所以執行結果為:

 原理參考下圖

3. 字串的參數傳遞

先看程式碼

public class Demo03 {
    public void change(String str2) {
        System.out.println("方法中str2初始值" + str2);
        System.out.println("方法中str2初始hashcode值" + str2.hashCode());
        str2 = "bbb";
        System.out.println("方法中str2赋值后:" + str2);
        System.out.println("方法中str2赋值后hashcode值:" + str2.hashCode());
    }

    public static void main(String[] args) {
        String str1 = new String("aaa");
        System.out.println("原始字符串str1的hashcode值:" + str1.hashCode());
        Demo03 d = new Demo03();
        d.change(str1);
        System.out.println("方法调用后str1的值" + str1);
    }
}

分析:

        字串是特殊的資料型,它的底層是一個final 型的char[]陣列,屬於無法更改,所以字串在作為參數傳遞時,可以當做一個特殊的數組進行操作,同樣的它也是將複製一份原本的對象引用給了副本,此時副本對象的引用和原本對象的引用都指向原始字符串的位置,也就是str2在剛開始初始化時它指向的位址和原物件str1指向的位置一致,即str2的初始hashcode值和原始物件str1的hashcode值一樣,str2經過str2=「bbb」操作後,由於字串的不可變性,此時str2會指向一個新的物件引用,即此時str2指向「bbb」的位置。 str2的hashcode值會變化,但原本str1它的物件參考沒有改變,而且「aaa」也沒有改變,所以str1仍然指向」aaa」。 運行結果如下:

接下來看一個更具體的字串範例:

public class Demo04 {

    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("hello");
        StringBuffer s2 = new StringBuffer("hi");
        test(s, s2);
        System.out.println("方法調用后s的值:" + s);
        System.out.println("方法調用后s2的值:" + s2);
    }

    static void test(StringBuffer s3, StringBuffer s4) {
        System.out.println("方法初始化時s3的值" + s3);
        System.out.println("方法初始化時s4的值" + s4);
        s4 = s3;
        s3 = new StringBuffer("new");
        System.out.println("第一步变化后s3的值" + s3);
        System.out.println("第一步变化后s4的值" + s4);
        s3.append("boy");
        s4.append("gril");
        System.out.println("第二步变化后s3的值" + s3);
        System.out.println("第二步变化后s4的值" + s4);

    }
}

這次先看結果:

然後進行分析:

在未執行方法之前,字串s1和s2指向的位置分別是“hello”和“hi”,這個毋容置疑,

(1)接著進入方法內部,方法中參數s3和s4初始化時和上面例子相同,此時它們和s1s2指向同一個位置,或者說s1s2將物件引用副本給了s3s4,此時s3s4的值為「hello」和「hi」

(2)接著執行s4=s3,這個操作就是將s3的物件引用給了s4,此時s4為「hello」;s3=new StringBuffer(」new ”);這個操作要注意,此時相當於給了s3一個新的物件引用,s3指向一個字串為“new”的位置,所以此時s3=“new”,s4=“hello”

(3)然後s3.append(“boy”);s4.append(“gril”);在StringBuffer中的append方法要注意,它的操作不會為s3s4指向一個新的物件引用,是在原來的基礎上進行操作,因此操作完之後s3=“newboy”,s4=“hellogril”

(4)此時方法調用完,回頭捋一下s3s4在過程中的對s1s2的影響。
——- A . 首先是s3和s1一樣剛開始指向“hello”,接著給s3創建一個新的對象引用“new”,此時s3和s1再無半毛錢關係,s3進行append( boy)後,s3=“newboy”;
——– B . s4剛開始和s2都指向“hi”,接著s3將自己初始值(也就是s1的副本)給了s4,此時s4指向「hello」(這會s4和s1有了關係),s4執行append(grill)操作,因為它和s1指向相同位置,所以它們的共同指向的物件會變化,s4=s1=「hellogrill」。
——- C .然後就清楚了,s2指向的物件「hi」並未變化,s1指向的「hello」在append(「grill」)操作下變成了「hellogril」。

4. 總結

  •  當使用基本資料型別作為方法的形參時,在方法體中對形參的修改不會影響到實參的數值

  • 當使用引用資料型別作為方法的形參時,若在方法體中修改形參指向的資料內容,會對實參變數的數值產生影響,因為形參變數和實參變數共用同一塊堆區;

  • 當使用引用資料型別作為方法的形參時,若在方法體中改變了形參變數的指向,此時不會對實參變數的數值產生影響,因此形參變數和實參變數分別指向不同的堆區;最後一個例子就是最形象的解釋。

  • 關於字串做參數,也是看它的參數變數指向是否發生了變化,因為String的底層為final類型的char[]原因,當你在String s = “ aaa”還是String s = new String(“aaa”)時,都會為s建立一個新的物件參考。但是呼叫了append()方法時,是不會指向新的對象,會在原來的指向的對像上發生改變,與它共享的對象引用也會改變。

  • 最後重複的是java中沒有引用傳遞,只有值傳遞,引用類型屬於特殊值傳遞(是將它的位址副本給了參數,但是它與基本資料型別不同,如果地址指向的物件發生了變化,因為共享原因,原始物件也會改變)。

推薦學習:《java教學

以上是一起聊聊JAVA中字串和陣列做參數傳遞的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
Java平台獨立性:與不同的操作系統的兼容性Java平台獨立性:與不同的操作系統的兼容性May 13, 2025 am 12:11 AM

JavaachievesPlatFormIndependencethroughTheJavavIrtualMachine(JVM),允許Codetorunondifferentoperatingsystemsswithoutmodification.thejvmcompilesjavacodeintoplatform-interploplatform-interpectentbybyteentbytybyteentbybytecode,whatittheninternterninterpretsandectectececutesoneonthepecificos,atrafficteyos,Afferctinginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginging

什麼功能使Java仍然強大什麼功能使Java仍然強大May 13, 2025 am 12:05 AM

JavaispoperfulduetoitsplatFormitiondence,對象與偏見,RichstandardLibrary,PerformanceCapabilities和StrongsecurityFeatures.1)Platform-dimplighandependectionceallowsenceallowsenceallowsenceallowsencationSapplicationStornanyDevicesupportingJava.2)

頂級Java功能:開發人員的綜合指南頂級Java功能:開發人員的綜合指南May 13, 2025 am 12:04 AM

Java的頂級功能包括:1)面向對象編程,支持多態性,提升代碼的靈活性和可維護性;2)異常處理機制,通過try-catch-finally塊提高代碼的魯棒性;3)垃圾回收,簡化內存管理;4)泛型,增強類型安全性;5)ambda表達式和函數式編程,使代碼更簡潔和表達性強;6)豐富的標準庫,提供優化過的數據結構和算法。

Java真的平台獨立嗎? '寫一次,在任何地方運行”如何起作用Java真的平台獨立嗎? '寫一次,在任何地方運行”如何起作用May 13, 2025 am 12:03 AM

javaisnotirelyplatemententedduetojvmvariationsandnativecodinteinteration,butitlargelyupholdsitsitsworapromise.1)javacompilestobytecoderunbythejvm

揭示JVM:您了解Java執行的關鍵揭示JVM:您了解Java執行的關鍵May 13, 2025 am 12:02 AM

thejavavirtualmachine(JVM)IsanabtractComputingmachinecrucialforjavaexecutionasitrunsjavabytecode,使“ writeononce,runanywhere”能力

Java仍然是基於新功能的好語言嗎?Java仍然是基於新功能的好語言嗎?May 12, 2025 am 12:12 AM

Javaremainsagoodlanguageduetoitscontinuousevolutionandrobustecosystem.1)Lambdaexpressionsenhancecodereadabilityandenablefunctionalprogramming.2)Streamsallowforefficientdataprocessing,particularlywithlargedatasets.3)ThemodularsystemintroducedinJava9im

是什麼使Java很棒?關鍵特徵和好處是什麼使Java很棒?關鍵特徵和好處May 12, 2025 am 12:11 AM

Javaisgreatduetoitsplatformindependence,robustOOPsupport,extensivelibraries,andstrongcommunity.1)PlatformindependenceviaJVMallowscodetorunonvariousplatforms.2)OOPfeatureslikeencapsulation,inheritance,andpolymorphismenablemodularandscalablecode.3)Rich

前5個Java功能:示例和解釋前5個Java功能:示例和解釋May 12, 2025 am 12:09 AM

Java的五大特色是多態性、Lambda表達式、StreamsAPI、泛型和異常處理。 1.多態性讓不同類的對象可以作為共同基類的對象使用。 2.Lambda表達式使代碼更簡潔,特別適合處理集合和流。 3.StreamsAPI高效處理大數據集,支持聲明式操作。 4.泛型提供類型安全和重用性,編譯時捕獲類型錯誤。 5.異常處理幫助優雅處理錯誤,編寫可靠軟件。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器