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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王小呆 中级黑马   /  2016-9-7 22:55  /  891 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

     String s1 = "a";
     String s2 = s1 + "b";
     String s3 = "a" + "b";
     System.out.println(s2 == "ab");
     System.out.println(s3 == "ab");

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

16 个回复

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

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

表示很厉害    我好像些许懂了不少   谢谢 !
回复 使用道具 举报
感觉想不明白啊
回复 使用道具 举报

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

然而并不是....
回复 使用道具 举报
Jarc 发表于 2016-9-9 10:35
S3的存储是会直接运算成“ab”,而在存储池里有“ab”,不会在分配空间存储一个新的“ab”。 ...

应该是这样
回复 使用道具 举报
王小呆 发表于 2016-9-9 09:43
反正这个  小于 byte类型的数字呀  他存放的是在常量池   而这个常量池好像和String 那种的常量池不太一 ...

哦哦,好像有点懂了
回复 使用道具 举报
cjc147 发表于 2016-9-8 00:16
因为s2是一个字符串变量,它在与字符串常量“b”通过+号连接的时候底层是通过StringBuilder或者Stringbuffe ...

这个解释不错
回复 使用道具 举报
s2是新创建了一个对象,而s3指向ab,==比较的是地址值,所以第一个false ,第二个true
回复 使用道具 举报
                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");               
                //==比较的是地址值。
回复 使用道具 举报
java的常量优化机制,常量相加是先相加再判断,变量相加是先判断再运算    常量"a"+常量"b"是常量"ab"放到常量池中,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马