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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liubea 中级黑马   /  2014-7-25 14:39  /  1148 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 liubea 于 2014-8-8 00:31 编辑

public class StringTest{
          String s1 = "helloworld";
          String s2 = "hello";
          String s3 = "world";
          System.out.println(s1==s2+s3);
}
为什么打印出来的是false。求解?

}

11 个回复

倒序浏览
s2和s3是变量,因此s2+s3的值是编译期间无法确定的,而是在运行时才计算出来值并生产一个新对象,这个对象不是常量池中的"helloworld"。你把s2和s3加上final,变成不可修改值,编译期间就可以确定它们的值,结果就是true了
回复 使用道具 举报
fantacyleo 发表于 2014-7-25 14:56
s2和s3是变量,因此s2+s3的值是编译期间无法确定的,而是在运行时才计算出来值并生产一个新对象,这个对象 ...

谢谢,你太强了
回复 使用道具 举报
fantacyleo 发表于 2014-7-25 14:56
s2和s3是变量,因此s2+s3的值是编译期间无法确定的,而是在运行时才计算出来值并生产一个新对象,这个对象 ...

如果代码这么写:
System.out.println(s1=="hello"+"world");
为什么又是true呢。
回复 使用道具 举报
本帖最后由 张涛的狂怒 于 2014-7-26 12:14 编辑

s1是一个对象,而s2+s3进行字符串链接后产生了一个新的对象,虽然s1和s2+s3的内容是相同的,但是其内容分别保存在堆内存不同的空间中,也就是说内存地址值是不一样的,而“==”符号是比较内存地址值的。
回复 使用道具 举报
liubea 发表于 2014-7-26 11:50
如果代码这么写:
System.out.println(s1=="hello"+"world");
为什么又是true呢。

当String使用直接赋值的方式,只要声明的字符串内容相同,就不会再开辟新的内存空间;根据这一原则s1="helloworld";   而"hello"+"world"的结果就是“helloworld”产生的结果付给了一个新的对象,但是由于内容相同,所以没有开辟新的内存空间,内存地址也就相同了。所以System.out.printl(s1=="hello"+"world");的结果就是true.
回复 使用道具 举报
liubea 发表于 2014-7-26 11:50
如果代码这么写:
System.out.println(s1=="hello"+"world");
为什么又是true呢。

定义s1时,"helloworld"就被放入常量池。hello"+"world"在编译时就可以确定是"helloworld",编译器就会检查常量池中有没有这个字符串,发现有就直接让hello"+"world"指向常量池中的"helloworld",==比较结果当然是true啦
回复 使用道具 举报
liubea 发表于 2014-7-26 11:50
如果代码这么写:
System.out.println(s1=="hello"+"world");
为什么又是true呢。

字符串是java中的一个final类,他在创建对象时候,节约内存着想。就是内存中有的字符常量就不会再创建而是直接指向。
回复 使用道具 举报
1是一个对象,而s2+s3进行字符串链接后产生了一个新的对象,虽然s1和s2+s3的内容是相同的,但是其内容分别保存在堆内存不同的空间中,也就是说内存地址值是不一样的,而“==”符号是比较内存地址值的。
回复 使用道具 举报
这些基础真是要好好研究研究了
回复 使用道具 举报
@for 中级黑马 2014-7-26 16:13:35
11#
s2+s3生成了一个新的对象,==是判断引用的地址是否相等的
回复 使用道具 举报
谢谢大家!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马