黑马程序员技术交流社区

标题: 遇到一个很奇怪的问题 [打印本页]

作者: 周万谋    时间: 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
这个图应该自认为描述的蛮清楚了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2