黑马程序员技术交流社区
标题:
遇到一个很奇怪的问题
[打印本页]
作者:
周万谋
时间:
2012-10-28 12:23
标题:
遇到一个很奇怪的问题
本帖最后由 周万谋 于 2012-11-2 22:33 编辑
在练习final 时,遇到一个问题:
public class FinalTest {
public static void main(String[] args) {
final String str1 = "黑马"+ 123;
final String str2 = "黑马" +String.valueOf(123);
System.out.println(str1 == "黑马123");
System.out.println(str2 == "黑马123");
}
}
//运行结果是:
//true
//false
//为什么输出语句会是这样?求解,谢谢
作者:
黑马杨锦喜
时间:
2012-10-28 12:31
final String str2 = "黑马" +String.valueOf(123); 相当于:
String s="123";
final String str2="黑马"+s;
因此会输出false
作者:
林志进
时间:
2012-10-28 12:57
String s=String.valueOf(123);
System.out.println(s=="123"); //直接这样写的返回的也是false
final String str1 = "黑马"+ 123; 编译期的时候默认转换为 String str=“黑马123”
final String str2 = "黑马" +String.valueOf(123); 因为有参与这样的运算,编译期无法识别,运行期的时候返回一个新的对象,我是这样理解的
作者:
刘丽娜
时间:
2012-10-28 13:45
不太懂 帮顶一下 求答案
作者:
葛旭东
时间:
2012-10-28 16:55
3楼说的是对的!就是编译时期判定的原因。
作者:
王阳
时间:
2012-10-29 00:06
个人理解
final String str1 = "黑马"+ 123; str1是一个指向一个内存地址,连接上123 指向的仍然是一个堆内存地址,int 基本类型不指向堆内存
final String str2 = "黑马" +String.valueOf(123); 但是 String.valueOf(123)就不是了,你可以看下方法,里面最后会new 一个 String 因为不是equals ==是比较物理地址,第二个就相当于 分别指向了堆里面的2个内存地址,然后赋值给栈
所以就是说两个字符串连接的值都是在栈里面连接的,但是指向的内存地址就不一样了
C:\Documents and Settings\Administrator\桌面
作者:
王阳
时间:
2012-10-29 00:09
未命名.gif
(610.93 KB, 下载次数: 39)
下载附件
2012-10-29 00:09 上传
这个图应该自认为描述的蛮清楚了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2