※ 引述《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
: 谢谢