Re: [問題] 回傳區域變數問題

作者: darkk6 (Mr. Pan)   2018-09-22 17:03:37
※ 引述《gigigigi (gigigigi)》之銘言:
(調整一下原文順序)
: 我查網路Java 無法印address 來判斷有人說用hashCode, 但是看到
: hashcode :
: 只要求相同對象的 hashcode 一樣
: 並不保證不同對象的 hashcode 不一樣
: "即,有可能不同對象的 hashcode 是一樣的"
Hashcode 與記憶體無關,只是拿物件內的成員透過運算得到的一組 int,
基本上我們會要求如果這兩個物件在比較時被認為 "內容" 相同的時候,
就必須傳回相同的 Hashcode
(我自己習慣稱為 "內容" 相同)
內容相同是每個 class 自己給予的規則,並不一定是相同的 instance。
例如:
你買了一杯紅茶A;你的朋友也買了一杯同樣店家甜度冰塊的紅茶B
你朋友拿著他的紅茶B 問你要不要喝;你說我已經有了。
在這裡,紅茶 A 和紅茶 B 是兩個不同的東西(instance);
但我們認定他是相同的內容(都是紅茶),所以才會說已經有了
: public static String reverse(String originalStr)
: {
: String *[1;33mresultStr*[m = "";
: ... 處理字串反轉存到 resultStr
: return *[1;33mresultStr*[m;
: }
: public static void main(String[] args) throws IOException {
: String s = new String("hello world");
: String *[1;36mresult*[m = reverse(s);
: System.out.println(Integer.toHexString(result.hashCode()));
: System.out.println(result);
: }
在 Java 中被產生出來的物件並沒有分 local 或者 global 之類的 scope,只要
被生成,在被回收掉之前,都一直存在於記憶體中。
但指向該物件的變數,就會有 scope 的問題,以這裡為例子,當程式離開 reverse()
的時候,只有 resultStr 這個變數不存在,但配置出來的 String 還是
存在記憶體之中。
而 main 有用一個 result 去指向這個 instance。
在 Java GC 機制裡面,只要有一個 instance 是無法被存取到的時候,
那塊記憶體才會被系統收掉。
綜合上述,當離開 reverse() 的時候,反轉好的字串 instance 因為有被
main() 裡面的 result 給指著,所以並不會被視為可回收的對象,
因此會持續存在於記憶體中,而且 main() 裡面也可以正確存取到他。
: 在C/C++ 回傳區域變數問題
: 想請問一下我下面反轉字串例子,
: String resultStr = ""; 是 local 變數,
: 這樣回傳回去是把內容 copy 一份回去main() 函數的result?
: 應該不是ref? String resultStr = ""; 離開reverse函數應該就回收這塊記憶體
: 如果我今天改成 String resultStr = new String();
: 傳回是把address 回傳去讓 result 參考同一塊記憶體嘛?
Java 中並不會讓開發者碰到物件的記憶體,物件在 method 之間傳遞的時候,
不會 copy 一份真正的物件,而是將 reference 複製一份傳遞過去。
在 Java 中,物件 Reference 概念比較相當於 C/C++ 的 Pointer,例如:
//Java
public static main(String[] args) {
String str1 = "Java";
doSomething(input);
//到這邊 str1 還是 "Java"
}
public static void doSomething(String input) {
input = "QQ";
}
//C,C++
int main() {
chat* str1 = "Java";
doSomething(str1);
// str1 還是 "Java"
}
void doSomething(char* input) {
input = "QQ";
}
: 完整程式碼
: https://gist.github.com/shihyu/e6acfc206928b2cbb3011ea193fe1c4f
: 謝謝
作者: evo1994 (Evo)   2018-09-25 01:38:00
講的很清楚 推~
作者: highland (海蘭德)   2018-09-26 14:44:00
推推~
作者: GGing (小軒軒)   2018-09-28 05:32:00
那如果今天傳進去的是 Collection 呢?
作者: adrianshum (Alien)   2018-09-28 08:16:00
樓上:也一樣呀,也是傳copy of pointer 進去

Links booklink

Contact Us: admin [ a t ] ucptt.com