黑马程序员技术交流社区

标题: 字符串的拼接(即有“+”号出现)的问题 [打印本页]

作者: java8023    时间: 2015-6-3 21:38
标题: 字符串的拼接(即有“+”号出现)的问题
  1. class Demo2
  2. {
  3.         public static void main(String args[])
  4.         {
  5.                 String s = null;
  6.                 s += "abc";                        //jvm是如此运行的s = (new StringBuilder(String.valueOf(s))).append("abc").toString());
  7.                 System.out.println(s.toString());
  8.       }
  9. }
复制代码

                /**
                 字符串的拼接(既有“+”号出现)的问题:
                一、只有字符串的时候,直接将两个字符串拼接在一起,在方法区常量池寻找,看是否有和拼接后相同的字符串,
                    若是有,就把已经有的地址值赋值,否则就在常量池开辟空间存放拼接后的字符窜,并把地址值赋值。
                    例子:
                        String str1="hello";                //常量池开辟空间存放“hello”,并将地址赋值给str1
                        String str2="world";                //常量池开辟空间存放“world”,并将地址赋值给str2
                        String str3="helloworld";        //常量池开辟空间存放“helloworld”,并将地址赋值给str3
                        String str4="hello"+"world";        //先将两个字符串拼接,在方法区内存中寻找看是否有相同内容的,发现有,就把已经有的地址值赋值给str4.
                        System.out.println(str3==str4);
                        结果就是true,因为两者指向了同一个内存地址。

                二、若是有变量参与的时候,就会创建new StringBuilder()对象
                   并且引用型变量会首先调用 String.valueOf(obj),然后String.valueOf(obj)的具体实现是:
                        return obj == null ? "null" : obj.toString(),
                         由于obj所属的对象不同,其输出的内容不也不同,
                        若是没有重写Object类中的tostring()方法,那么就是其内存地址值了,要是重写就是其重写后方法输出。(一般情况都是字符串变量)
                            然后使用stringbuilder的append()方法将获得字符串添加进容器,最后,stringbuier调用tostring()方法,得到字符串。
                 即如:String str=s+"aa";//其中s是一个对象的应用,引用性变量(实际上基本数据类型也是适用的)
                        jvm解析:
                        String str=(new StringBuilder().append(String.valueof(obj)).append("aa").toString());
                        String str=(new StringBuilder().append(String.valueof(obj== null ? "null" : obj.toString())).append("aa").toString());
               
                实际上打印的时候,println会再调用引用对象,tostring方法,实际上这个时候都是字符串了,就是默认调用其tostring()方法
               
        }
}


作者: TOBESKY    时间: 2015-6-3 21:57
很详细。。。。
作者: 城北一直晴。    时间: 2015-6-3 22:18
很不错!
作者: LoveMyself    时间: 2015-6-3 22:51
总结的很好呀
作者: sky930722    时间: 2015-6-3 23:10
总结的很详细,赞一个
作者: 下一页5    时间: 2015-6-3 23:14
我不会我现在
作者: jakemind    时间: 2015-6-3 23:26
领教了!!!!!!!!!!!!!!!!!!!!!!111
作者: 东邪    时间: 2015-6-3 23:38
学习了!
作者: 卡布    时间: 2015-6-4 00:39
学习啦~
作者: 山崩地裂    时间: 2015-6-4 08:34
受教了。。。。很 不错的总结
作者: java8023    时间: 2015-6-5 00:37
怎么就不给加技术分呢。这是为什么呢
作者: richaled    时间: 2015-6-5 08:05
不错,学习了
作者: 乌卡卡    时间: 2015-6-5 10:45
技术分怎么加
作者: 海角秋风    时间: 2015-6-5 11:03
学习了。。。很详细。。。
作者: 星辉祝愿    时间: 2015-6-5 11:34
总结的很好呀
作者: 开弓没有回头箭    时间: 2015-6-5 14:40
学习了...
作者: java8023    时间: 2015-6-6 22:19
版主在哪里啊,快点来啊技术分分
作者: ZYZQ    时间: 2015-6-6 23:28
总结的很不错
作者: l李伟    时间: 2015-6-7 01:34
这题不错,很详细的
作者: xiaodong    时间: 2015-6-7 01:46
学习了!!!
作者: 君子无醉    时间: 2015-6-7 02:52
虽然以前知道,但是楼主总结的很详细  感觉又学到了很多,赞一个
作者: jjyy1008    时间: 2015-6-7 03:00
总结的很好
作者: 嘎路的米    时间: 2015-6-7 10:05
学习了!
作者: Monster    时间: 2015-6-7 10:19
很详细,学习了,从来没有想过这么多
作者: 老徐    时间: 2015-6-7 10:33
  完全看不懂 这是第几天的内容啊,,,,,,,
作者: yang2015    时间: 2015-6-7 16:03
学习学习
作者: hnyzhlq    时间: 2015-6-7 16:45
学习了~~
作者: 坏坏总是我    时间: 2015-6-7 17:48
很好,也解决了我的问题
作者: langxiao505    时间: 2015-6-7 18:18
顶,很详细
作者: 一休    时间: 2015-6-7 20:24
基础班入学考试这类题便做错了
作者: 且听风_R0pZK    时间: 2015-6-7 20:32
学习了,感谢楼主的分享!
作者: 银哥    时间: 2015-6-7 21:13
学习一下
作者: 暨雪    时间: 2015-6-8 00:23
挺有耐心的
作者: MissMr.    时间: 2015-6-8 00:50
貌似不错
作者: java8023    时间: 2015-6-10 23:08
有时候很奇怪,基本数据是不是也可以这么解释呢
作者: java8023    时间: 2015-6-11 21:22
有没有更好的解释呢,今天看到在editplus中解析的不一样,很是不解啊




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