String類的一些問題

2021-08-17 19:17:20 字數 1134 閱讀 9753

string a = "hello";

string b = "hello";

string c = "he" + "llo";

string d = "he" + new

string("llo");

a == b //1

a == c //2

a == d //3

首先公布答案,式子1返回true,式子2返回true,式子3返回false

式子1很好理解,由於存在字面量池,在用字面量賦值時,如果池中已經有了相同的字面量,就不會開闢新的空間,而是直接指向池中該字面量

式子2在字面量池中又建立了」he」和」llo」兩個字面量,但由於編譯器的存在,在編譯期便可以做到字面量的連線工作,所以」he」+」llo」仍然可以看作」hello」

string的不可變性體現在一旦new了乙個新的string物件,就不能改變物件的狀態,只能讓這個變數指向新的物件。這個特性帶來的好處有:

1.執行緒安全

因為string物件不可變,所以可以放心的讓多個執行緒訪問同乙個string物件

2.字面量池

正是因為string的不可變性,才會有字面量池的存在。否則,字面量池中的物件就會被隨意更改,那麼所有引用了這個物件的變數值也會被一同更改

看下面這個例子:

public

static

void

change(string a)

public

static

void

main(string args)

正確答案是hello,也就是對string形參的更改不會影響到實參

有人問string又不是基本型別,它不應該是按引用傳遞的嗎?

我們首先要明白這一點,雖然按引用傳遞時,我們可以改變實參,但我們無法讓這個引用指向新的實參,就比如:

public

void

change(myclass a)

這種操作是無效的

由於string是不可變的 ,所以任何改變string的操作實際上都是new了乙個新的物件,所以我們無法對這個引用指向的原實參造成任何影響,這樣看上去string就像按值傳遞一樣

String 一些問題

前言 等號 對於基本型別,比較的是值,對於引用型別,比較的是記憶體位址。1.在物件池中建立,如果常量池中已經存在則返回常量池中已經有的。private static void test1 結果 true 2.乙個在string pool中,乙個在堆中。private static void test...

C 一些問題

1 if else語句和switch case語句的效率分析對比 switch效率高。switch的效率與分支數無關,當只有分支比較少的時候,if效率比switch高,因為switch有跳轉表。分支比較多,那當然是switch 根據大量的實際程式測試 不考慮不同的編譯器優化程度差異,假設都是最好的優...

mysql 一些問題

1 中文亂碼 問題 推薦用 uft 8 編碼 適配一切介面,mysql中 發生中文亂碼時 開啟mysql 安裝路徑 更改後 重啟mysql 服務即可,有時也需要 重新匯入資料庫 可能是與 source 檔案時 編碼沒有設定好 client password your password port 33...