面試官:string[] str1 = new string[1]{“abc”};創建了幾個對象?
面試官:string str2 = “a” + “b” + “d”; 創建了幾個對象?
面試官:str2 = “abc”; 創建了幾個對象?
先來看第一個string[] str1 = new string[1]{“abc”};創建了幾個對象?
答案:1個或2個。
分析:第一個,先查找常量池中是否有“abc”,如果沒有,則在常量池中創建一個“abc”對象,如果有,則不創建。
第二個,new 本身就要在堆中開闢一塊內存,創建一個“abc”對象實例。並返還地址給棧中的str。
看圖比較容易理解。也方便後面兩個問題的分析。
第二個問題string str2 = “a” + “b” + “d”; 創建了幾個對象?
答案:1個。
分析:首先沒有new。堆中創建對象0個。
那麼按照第一個問題的推理,“a”,“b”,"d"三個在常量池中都沒有,應該至少創建3個啊?
這裏有一個小知識點,這樣的代碼,在編譯時就已經把abc這三個常量拼在一起了,所以只在常量池中創建了一個“abd”的對象。
第三個問題str2 = “abc”; 創建了幾個對象?創建了幾個對象?
答案:0個。
分析:因爲常量池中已有,直接返回內存地址。str2修改引用。