黑马程序员技术交流社区

标题: 字符串问题 [打印本页]

作者: 王小呆    时间: 2016-9-7 22:55
标题: 字符串问题
     String s1 = "a";
     String s2 = s1 + "b";
     String s3 = "a" + "b";
     System.out.println(s2 == "ab");
     System.out.println(s3 == "ab");

在main方法中运行,  打印的结果  第一个是false  第二个是true  求解....

作者: yueyuefei    时间: 2016-9-7 23:15
对的  加号是个连接符
作者: 爱吃柠檬    时间: 2016-9-7 23:44
你知道在基本数据类型里有常量优化机制吗,引用类型里同样也有这种优化机制,第一种是因为你有个变量s1 所以两个地址值肯定不同,而第二种是优化机制,两个常量先相加,然后赋值给s3 那不就相当于s3="ab"吗
作者: cjc147    时间: 2016-9-8 00:16
因为s2是一个字符串变量,它在与字符串常量“b”通过+号连接的时候底层是通过StringBuilder或者Stringbuffer及其append方法实现的,其地址是存在与堆内存中的,而字符串常量“ab”地址是存在与方法去中的常量池。因此两个地址值是不一样的,而==号比较的就是地址值,因此结果为false
作者: 王小呆    时间: 2016-9-9 00:15
爱吃柠檬 发表于 2016-9-7 23:44
你知道在基本数据类型里有常量优化机制吗,引用类型里同样也有这种优化机制,第一种是因为你有个变量s1 所以 ...

你强调的是地址还是  地址里面的值  我记得  ==   比较的时候比较的是地址吧   而字符串的地址  指向返回就是字符本身呀
作者: 王小呆    时间: 2016-9-9 00:16
cjc147 发表于 2016-9-8 00:16
因为s2是一个字符串变量,它在与字符串常量“b”通过+号连接的时候底层是通过StringBuilder或者Stringbuffe ...

表示很厉害    我好像些许懂了不少   谢谢 !
作者: 风轻云淡139    时间: 2016-9-9 00:38
感觉想不明白啊
作者: 王小呆    时间: 2016-9-9 09:43
风轻云淡139 发表于 2016-9-9 00:38
感觉想不明白啊

反正这个  小于 byte类型的数字呀  他存放的是在常量池   而这个常量池好像和String 那种的常量池不太一样  ,昨天找了一下Integer类的源码  那些byte范围内的都是静态存在的  类一加载  就有这些数据了  很神奇  对Java的存储机制表示搞不懂  没有人对这个很清楚  
作者: Jarc    时间: 2016-9-9 10:35
S3的存储是会直接运算成“ab”,而在存储池里有“ab”,不会在分配空间存储一个新的“ab”。
作者: NOTHIING    时间: 2016-9-9 11:00
s2 = s1 +'b',结果就是true了
作者: 王小呆    时间: 2016-9-9 21:18
NOTHIING 发表于 2016-9-9 11:00
s2 = s1 +'b',结果就是true了

然而并不是....
作者: 王小呆    时间: 2016-9-9 21:20
Jarc 发表于 2016-9-9 10:35
S3的存储是会直接运算成“ab”,而在存储池里有“ab”,不会在分配空间存储一个新的“ab”。 ...

应该是这样
作者: 风轻云淡139    时间: 2016-9-10 00:25
王小呆 发表于 2016-9-9 09:43
反正这个  小于 byte类型的数字呀  他存放的是在常量池   而这个常量池好像和String 那种的常量池不太一 ...

哦哦,好像有点懂了
作者: NOTHIING    时间: 2016-9-15 21:49
cjc147 发表于 2016-9-8 00:16
因为s2是一个字符串变量,它在与字符串常量“b”通过+号连接的时候底层是通过StringBuilder或者Stringbuffe ...

这个解释不错
作者: Toxicant    时间: 2016-9-15 23:15
s2是新创建了一个对象,而s3指向ab,==比较的是地址值,所以第一个false ,第二个true
作者: somnus-sir    时间: 2016-9-16 20:42
                String s1 = "a";                //创建一个变量"a"附给s1,在常量池中
                String s2 = s1 + "b";        //通过StringBuilder或者StringBuilder的append ,toString  , "ab"附给s2, 在堆中
                String s3 = "a" + "b";        //常量优化机制"ab"  ,在常量池中       
                System.out.println(s2 == "ab");
                System.out.println(s3 == "ab");               
                //==比较的是地址值。
作者: hysnxdss    时间: 2016-9-16 21:14
java的常量优化机制,常量相加是先相加再判断,变量相加是先判断再运算    常量"a"+常量"b"是常量"ab"放到常量池中,




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