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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 党传才 中级黑马   /  2012-4-12 13:34  /  1666 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class finalTest{
public static void main(String[] args) {
final String book = "测试:"+ 99.0;
final String book2 = "测试:"+ String.valueOf(99.0);
System.out.println(book == "测试:99.0");
System.out.println(book2 == "测试:99.0");
}
}
在群里面看到一个问题,不明白。希望谁能解释下,为什么第二个输出的是false。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

4 个回复

倒序浏览
==比较的是两个对象的地址值。
如果改为System.out.println(book2.equals("测试:99.0");
输出的就是true

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
是这样的:
正如楼上兄弟说的 ==比较的是地址
然后在回到你的代码上:
final String book2 = "测试:"+ String.valueOf(99.0);
重新在内存开辟了空间
另外要想比较值就要使用 equals

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 石好强 于 2012-4-12 14:20 编辑

final String book = "测试:"+ 99.0; //这个是进行了一步操作,直接转化成字符串,一个对象,开辟了一个空间[
final String book2 = "测试:"+ String.valueOf(99.0);//这个是进行了两步操作,前面"测试"是一个字符串,而后面String.valueOf(99.0);是一个返回的字符数组对象,开辟了空间,这是第一步操作。而 "测试:"+ String.valueOf(99.0),是第二个操作,是两个对象

而==是比较内存地址值,这肯定是不相等的。

这是我的理解,呵呵。不对之处请指正,我对这一块也不是太通透

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
final String book2 = "测试:"+ String.valueOf(99.0);
System.out.println(book == "测试:99.0");
System.out.println(book2 == "测试:99.0");
}
}
在群里面看到一个问题,不明白。希望谁能解释下,为什么第二个输出的是false。


System.out.println(book2 == "测试:99.0");
表示的是栈内存中的变量book2所指向的地址值是否和堆内存中字符串"测试:99.0"的地址值相同

而字符串"测试:99.0"的地址值是book1所指向的地址值;

显而易见,book2和book1是两个不同的变量,地址值指向也不同;

顺便说一句,被final修饰的变量是不能够多次赋值的,初次赋值后,就不能在改变;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马