黑马程序员技术交流社区

标题: 字符串的一些细节问题 [打印本页]

作者: liubea    时间: 2014-7-25 14:39
标题: 字符串的一些细节问题
本帖最后由 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。求解?

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

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

如果代码这么写:
System.out.println(s1=="hello"+"world");
为什么又是true呢。
作者: 张涛的狂怒    时间: 2014-7-26 12:08
本帖最后由 张涛的狂怒 于 2014-7-26 12:14 编辑

s1是一个对象,而s2+s3进行字符串链接后产生了一个新的对象,虽然s1和s2+s3的内容是相同的,但是其内容分别保存在堆内存不同的空间中,也就是说内存地址值是不一样的,而“==”符号是比较内存地址值的。
作者: 张涛的狂怒    时间: 2014-7-26 12:28
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.

作者: fantacyleo    时间: 2014-7-26 13:23
liubea 发表于 2014-7-26 11:50
如果代码这么写:
System.out.println(s1=="hello"+"world");
为什么又是true呢。

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

字符串是java中的一个final类,他在创建对象时候,节约内存着想。就是内存中有的字符常量就不会再创建而是直接指向。
作者: 楚风★憧憬    时间: 2014-7-26 14:22
1是一个对象,而s2+s3进行字符串链接后产生了一个新的对象,虽然s1和s2+s3的内容是相同的,但是其内容分别保存在堆内存不同的空间中,也就是说内存地址值是不一样的,而“==”符号是比较内存地址值的。
作者: 洛漠O_o    时间: 2014-7-26 14:33
这些基础真是要好好研究研究了
作者: @for    时间: 2014-7-26 16:13
s2+s3生成了一个新的对象,==是判断引用的地址是否相等的
作者: liubea    时间: 2014-7-26 23:06
谢谢大家!




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