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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我是一个android基础班的学生,过几天就要面试就业班了,所以今天趁着休息赶紧把不是太懂的回顾弄懂,在这过程中我把一个不容理解的问题花费了时间弄懂了,在这里和大家分享一下。
        问题是这样的:
         判断定义为String类型的s3和s2是否相等,说出结果。
        * String s1 = "ab";
        * String s2 = "abc";
        * String s3 = s1 + "c";
        * System.out.println(s3 == s2);
        * System.out.println(s3.equals(s2));
看官应该会给我一个大大的鄙视表情做回报吧   可以理解,但是请耐心往下看
这道题大家肯定都知道输出结果是什么,不知道的你也学过后硬记一下嘛 但是,我的问题不是这个,
我的问题是:此道题一共创建了几个对象?


有些大神可能又要不屑了,这还不简单。但是,你的思路未必清晰,就算清晰,还有个地方你也不是太清楚!为了我更清楚的知道结果,往下看嘻嘻,买个关子!我接下来要做的就是把冯佳老师讲的中间的容易被大家忽略的重点呈现给大家!
来了哦!~~

首先大家都知道此题的输出会是:
false
ture

重点不在equals方法,而是“ == ”!!!(equals与“ == ”区别懂了才行
S1和S2对象的创建也不是重点(它们会被创建在常量池中,原因参照冯佳老师第12天第5个视频)
重点在于S3对象的创建!!!!!!
要想知道S3的创建,你要知道
Java 语言提供对字符对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的(参见图一   很多人会忽略这个!)
因为S1是一个字符串对象,所以要用到这个支持,不能直接拼接(另外"c"是不会在常量池中创建对象的因为没人接收它的地址,创建了也是垃圾!)
这里就是说到已经在堆内存创建了一个StringBuilder对象,并用append方法拼接出“abc”了,大家知道,String 类型的引用(S3)是无法接收一个StringBuilder对象的
所以jvm就自动调用StringBuilder类的toString方法将StringBuilder类型的对象转为新创建的String类型,并将地址值传给S3!了事儿收工!


重点是想让你关注:
1、为什么要先创建StringBuilder对象(因为s2是一个对象,底层对字符串连接都是在字符串缓冲区进行的)
2、答案是一共创建了四个对象(分别是s1、s2、StringBuilder对象、s3StringBuilder对象没有引用指向,被创建后就变成垃圾!
3、作者真的很用心的想能帮到你!

啊,写了这么久,你不打赏一下嚒?

14.png (35.73 KB, 下载次数: 19)

图一、第一个知识点

图一、第一个知识点

评分

参与人数 2黑马币 +26 收起 理由
ren2016123 + 6 赞一个!
xiaoyimiao + 20 很给力!

查看全部评分

14 个回复

倒序浏览
ajzaxt 来自手机 中级黑马 2016-4-11 11:14:36
沙发
赞\(≧▽≦)/
回复 使用道具 举报
葛明棒棒哒
回复 使用道具 举报
葛明棒棒哒
回复 使用道具 举报
怒赞
回复 使用道具 举报
17k就是你的了。哈哈
回复 使用道具 举报

谢玲姐
回复 使用道具 举报
HelloBoy 发表于 2016-4-11 11:26
17k就是你的了。哈哈

大家都17K
回复 使用道具 举报
厉害哇,基础班的学生就是比自学的我强多了
回复 使用道具 举报

谢谢!~~么么哒!~~
回复 使用道具 举报
lidandan 发表于 2016-4-11 11:32
厉害哇,基础班的学生就是比自学的我强多了

嗯嗯,来基础班学习却是比自学强很多!~~不过,自学的话,努力也是可以的!~
回复 使用道具 举报
minge123 发表于 2016-4-11 11:35
嗯嗯,来基础班学习却是比自学强很多!~~不过,自学的话,努力也是可以的!~ ...

多谢鼓励
回复 使用道具 举报
楼主很认真,很详细
回复 使用道具 举报
谢谢楼主分享
回复 使用道具 举报
编号89757 来自手机 中级黑马 2016-4-16 08:02:47
15#
今天学习String,等下留意一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马