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

  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()方法
               
        }
}

35 个回复

正序浏览
有没有更好的解释呢,今天看到在editplus中解析的不一样,很是不解啊
回复 使用道具 举报
有时候很奇怪,基本数据是不是也可以这么解释呢
回复 使用道具 举报
貌似不错
回复 使用道具 举报
挺有耐心的
回复 使用道具 举报
学习一下
回复 使用道具 举报
学习了,感谢楼主的分享!
回复 使用道具 举报
基础班入学考试这类题便做错了
回复 使用道具 举报
顶,很详细
回复 使用道具 举报
很好,也解决了我的问题
回复 使用道具 举报
学习了~~
回复 使用道具 举报
学习学习
回复 使用道具 举报
  完全看不懂 这是第几天的内容啊,,,,,,,
回复 使用道具 举报
很详细,学习了,从来没有想过这么多
回复 使用道具 举报
学习了!
回复 使用道具 举报
jjyy1008 来自手机 中级黑马 2015-6-7 03:00:24
22#
总结的很好
回复 使用道具 举报
君子无醉 来自手机 中级黑马 2015-6-7 02:52:31
21#
虽然以前知道,但是楼主总结的很详细  感觉又学到了很多,赞一个
回复 使用道具 举报
学习了!!!
回复 使用道具 举报
这题不错,很详细的
回复 使用道具 举报
总结的很不错
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马