作者darkk6 (Mr. Pan)
看板java
标题Re: [问题] 回传区域变数问题
时间Sat Sep 22 17:03:37 2018
※ 引述《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
: 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.254.65.65
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1537607019.A.8F5.html
※ 编辑: darkk6 (111.254.65.65), 09/22/2018 17:05:06
1F:推 evo1994: 讲的很清楚 推~ 09/25 01:38
2F:推 highland: 推推~ 09/26 14:44
3F:推 GGing: 那如果今天传进去的是 Collection 呢? 09/28 05:32
4F:→ adrianshum: 楼上:也一样呀,也是传copy of pointer 进去 09/28 08:16