A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周万谋 中级黑马   /  2012-10-28 12:23  /  2131 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周万谋 于 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
//为什么输出语句会是这样?求解,谢谢

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

6 个回复

倒序浏览
final String str2 = "黑马" +String.valueOf(123);  相当于:
String s="123";
final String str2="黑马"+s;
因此会输出false
回复 使用道具 举报
String s=String.valueOf(123);
System.out.println(s=="123"); //直接这样写的返回的也是false
final String str1 = "黑马"+ 123;  编译期的时候默认转换为 String str=“黑马123”
final String str2 = "黑马" +String.valueOf(123);    因为有参与这样的运算,编译期无法识别,运行期的时候返回一个新的对象,我是这样理解的

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

回复 使用道具 举报
不太懂 帮顶一下 求答案
回复 使用道具 举报
3楼说的是对的!就是编译时期判定的原因。
回复 使用道具 举报
个人理解
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:56
7#
这个图应该自认为描述的蛮清楚了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马