作者Minilogo ()
看板java
标题[问题] 有关JAVA的reference
时间Sun Jun 9 14:18:12 2013
各位好
最近在写code的时候犯了一个常见的错误,这个bug是看成程式码的时候发现的,之前都
没有出错。
它的形式大概是
String str;
str = "1";
doSth();
str = "2";
doSth();
str = "3";
doSth();
str = "2";
doSth();
void doSth() {
if (str == "1") {
str = "2";
...
} else if (str == "2") {
str = "3";
...
} else if (str == "3") {
str = "1";
...
}
}
我知道比对字串内容应该要用equals,但这段code竟然能像我想的一样进行。
我是由C/C++开始写程式的,我在写JAVA的时候也发现虽然JAVA表面上说没有指标,
但根本到处都是指标的行为,reference也跟C++的reference不一样。
但我没有深入理解JAVA的机制,所以如果用C/C++来解释的话,就是
把JAVA的String str改成C/C++的char* str
str = "1" 实际是把"1"的位址存进去,比对(==)的时候也是比位址一不一样,
而相同内容的多个string literal编译器又通常只存一个,
所以才会"刚好"像我想的那样进行。
但 JAVA 不知道是不是可以用一样的道理解释,或是因为不同的原因,拜托麻烦各位
解答了,谢谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.165.124.79
1F:→ tkcn:String pool 06/09 14:25
2F:→ Minilogo:谢谢 部分相同 但更加进步 06/09 14:30
3F:推 PsMonkey:用变数代替就会炸光光啦 06/09 15:56
4F:→ PsMonkey:呜呜呜呜... 我错了...... Orz 06/09 17:12
5F:→ Minilogo:PsMonkey你是说String s1="1"; String s2="2"这样的吗? 06/09 18:42
6F:推 PsMonkey:不是,我完全记错了,不要管我... 06/09 18:49
7F:→ PsMonkey:要 str = new String("1") 才会出事.... 06/09 18:49
8F:→ PsMonkey:可惜 tkcn 都不酸我 XDDDD 06/09 18:49
9F:→ tkcn:留着等有板聚时爆料呀,PsMonkey 犯错大全 (817 pages) 06/09 19:17
10F:→ swpoker:string要用equal 06/10 09:24