1. 程式人生 > >我的Java開發學習之旅------>Java String物件作為引數傳遞的問題解惑

我的Java開發學習之旅------>Java String物件作為引數傳遞的問題解惑


又是一道面試題,來測試你的Java基礎是否牢固。

題目:以下程式碼的執行結果是?

public class TestValue {
	public static void test(String str) {
		str="World"; //程式碼3
	}
	public static void main(String[] args) {
		String string = "Hello";  //程式碼1
		test(string);  //程式碼2
		System.out.println(string); //程式碼4
	}
}


執行結果是:Hello

解析:執行到達程式碼1時,系統在堆記憶體中開闢一個記憶體空間來

生成一個String物件,並把這個物件的值設為“Hello”,然後將該物件分配給棧記憶體中的string變數來引用。變數string是被實際分配的引用物件,此引用儲存著“Hello”在堆記憶體的地址值。

執行到達程式碼2,進入test(String str)方法,變數string的(引用)值的副本被傳遞給test方法。即將string變數的副本賦給test方法的形參str。此時變數string和test()方法內的變數str都是引用記憶體中的值為“Hello”的String物件。

執行到達程式碼3時,系統在堆記憶體中開闢一個記憶體空間來生成一個新的String物件,並把這個物件的值設為“World”

,然後將該物件分配給棧記憶體中的str變數來引用。此時變數string仍然引用記憶體中的值為“Hello”的String物件,而test()方法內的變數str則引用記憶體中的值為“World”的String物件。

執行到達程式碼4時,test(String str)方法結束了,方法內的變數str作用消失,棧記憶體中沒有了變數str,還有變數string。堆記憶體中值為“Hello”的String物件依然被變數string引用,值為“World”的String物件沒有被引用。所以列印結果為:Hello

下面是記憶體示意圖。


當然如果我們真的需要改變物件的值,可以嘗試使用StringBuffer物件來處理。程式碼如下

public class TestValue {
	public static void main(String[] args) {  
	    StringBuilder string = new StringBuilder("Hello");  
	    change(string);  
	    System.out.println(string);  
	}  
	   
	public static void change(StringBuilder str) {  
		str.delete(0, 5).append("World");  
	}  
}

列印結果為:World

讀者也可以參考以下連結:


==================================================================================================

  作者:歐陽鵬  歡迎轉載,與人分享是進步的源泉!

==================================================================================================


相關推薦

Java開發學習------>Java String物件作為引數傳遞的問題解惑

又是一道面試題,來測試你的Java基礎是否牢固。 題目:以下程式碼的執行結果是? public class TestValue { public static void test(String

Java開發學習------>Java經典排序演算法二分插入排序

一、折半插入排序(二分插入排序) 將直接插入排序中尋找A[i]的插入位置的方法改為採用折半比較,即可得到折半插入排序演算法。在處理A[i]時,A[0]……A[i-1]已經按關鍵碼值排好序。

Java開發學習------>Java資源的國際化詳解

國際化相關的Java類 Java國際化主要通過如下3個類完成 java.util.ResourceBundle:用於載入一個資源包 java.util.Locale:對應一個特定的國家/區域、語言環境。 java.text.MessageFormat:用於將訊息格式化 國際化資原始檔 為實現程式的

Java開發學習------>Java利用Comparator介面對多個排序條件進行處理

一、需求 假設現在有個如此的需求:需要對一個這樣的僱員列表進行排序,排序規則如下: 1、首先級別最高的排在前面, 2、如果級別相等,那麼按工資排序,工資高的排在前面, 3、如果工資相當則按入職年數排序,入職時間最長的排在前面。

Java開發學習------>Workspace in use or cannot be created, choose a different one.--錯誤解決的方法

原因 tracking size ons create rac 分享 target mono 今天使用Eclipse時,突然卡死了。然後我強制關閉了Eclipse,再又一次打開的時候就報錯了,錯誤例如以下: Workspace in use or cann

Java開發學習】如何實現中文漢字進行筆劃(筆畫)排序?

一、需求描述 最近有個需求,要求對列表進行排序,排序規則如下所示: 語言(文化)程式碼 國家/地區 排序方式 zh-CN 簡體中文(中國) 漢語拼音 zh-HK 繁體中文(中國香港特別行政區) 筆劃 zh-TW 繁體中文(中國臺灣) 筆劃

Java開發學習java泛型方法 java編程

java開發 java編程 java學習 java入門 Java泛型方法和泛型類支持程序員使用一個方法指定一組相關方法,或者使用一個類指定一組相關的類型。Java泛型是JDK 5中引入的一個新特性,泛型提供了編譯時類型安全檢測機制,該機制允許程序員在編譯時檢測到非法的類型。使用Java泛型的概

Java開發學習java基本數據類型

培訓班 otto oat style 簡單 lean 實用 類型 str 數據類型是每個編程語言必不可少的基礎知識,也是必須要掌握的技能,很多人知識簡單的進行理解,並沒有很系統的進行知識的梳理,以下是對java語言的內置數據類型匯總:  Java語言有8種基本類型。6種數字

的Web後端開發學習03

Python MTV(MVC) M: model 模型層 操作資料庫 T: template 模板層 顯示資料庫 V: view 控制層 接收使用者請求,響應請求 MTV步驟 開啟pycharm建立一個Django專案 ( 根據python版

的Web後端開發學習01

web架構: ​ C/S: client(客戶端)/server(伺服器端) ​ 跨平臺性差 ​ B/S: browser(網頁端)/server(伺服器端) ​ 跨平臺性強 用的多 ​ web分類: ​ 靜態

Hasen的linux設備驅動開發學習--時鐘

interval 好的 mask 再次 ask 中斷處理程序 eas 中斷 基礎 /** * Author:hasen * 參考 :《linux設備驅動開發具體解釋》 * 簡單介紹:android小菜鳥的linux * 設備驅動開發學習之

的RabbitMQ學習3 (發布/訂閱)

fan 一點 簡單 圖片 數據 這一 auto sha 如果 在前面的教程中,我們創建了一個工作隊列。工作隊列背後的假設是,每個任務只被傳遞給一個工作人員。在這一部分,我們將做一些完全不同的事情 - 我們會向多個消費者傳遞信息。這種模式被稱為“發布/訂閱&rdq

的機器學習(四):回歸與工程應用

多個 算法 ati function RR numpy pen 圖片 bsp 內容:線性回歸;邏輯回歸,應用場景。 一、線性回歸 有監督學習,根據學習樣本{x->y},學習一個映射f:X->Y(線性相關),輸出預測結果y_i。最簡單的例子:y=ax+b 重要組成

的機器學習(六):決策樹

family 分配 根據 drop chrom labels arch ntp -o 決策樹概念: 分類決策樹模型是一種描述對實例進行分類的樹形結構。決策樹由結點和有向邊組成。結點有兩種類型:內部節點和葉節點,內部節點表示一個特征或屬性,葉節點表示一個類。 分類的時候,從根

的Python學習(02)

我的Python學習之旅(02) 基本資料型別及變數的使用 list和tuple 條件判斷和迴圈 dict和set 好,接著上次的話題來說說Python的資料型別 首先,說個題外話,推薦學習python的大家去看看廖雪峰老師的部落格,講得

的Python學習(01)

我的Python學習之旅(01) 初識Python Hello World Python的輸入輸出 基本資料型別及變數的使用 list和tuple 條件判斷和迴圈 dict和set Python概要 Python

記錄的Python學習(二)time庫的基本操作

1、time() 功能:獲取當前時間戳,即計算機內部時間值,浮點數  2、ctime() 功能:獲取當前時間並以易讀方式表示,返回字串 3、gmtime() 功能:獲取當前實踐,表示為計算機可處理的時間格式  4、時間格式化:如t=time.gmtime()  

記錄的Python學習(一)關於turtle庫的基本用法

關於庫函式的匯入方法:①import <> ②import <> as <> ③ from tutle import <>   1、turtle.setup(width,height,startx,starty)  /

在linux環境下開發 學習

今天是在學習的第一天,雖然教的內容並不難,但是在沒有任何基礎下的學習並不會顯得輕鬆,之前大學都是蜻蜓點水一樣的學習知識,但是今天的學習有一半是需要我們自己動手去做的,一開始老師在上面飛快的敲,作為一張白紙只能看見飛快的程式碼行在冒出,但是經過一會的適應和老師的磨

(二) RabbitMQ實戰教程(面向Java開發人員)Rabbit Java Client

RabbitMQ Java Client 在介紹完RabbitMQ基本概念後,我們使用JAVA程式碼來模擬一套生產者和消費者的模型,Talk is cheap 直接上程式碼了。使用Java Client整合RabbitMQ需要在pom.xml中匯入如下依賴