剖析java中的String之__拼接

来源:互联网 发布:淘宝战网点 编辑:程序博客网 时间:2024/04/27 05:29

剖析java中的String之__拼接

       网上剖析String的不少,关于其他的String的知识我就不累赘去说了!本文只解释下我在面试中遇到的String拼接的问题以及最近看到了网上的一道机试题跟这个有关系, 所以就想把自己对String拼接的理解分享给大家! 

 一、Java String类-官方文档中String类的基本说明:

public final class String extends Object implements Serializable, Comparable<String>, CharSequence
Java程序中的所有字面值(string literals),即双引号括起的字符串,如"abc",都是作为String类的实例实现的。
String是常量,其对象一旦创建就不能再被改变换句话说,String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创造了一个全新的String对象,以包含修改后的字符串内容。String对象具有只读特性,指向它的任何引用都不可能改变它的值,因此,也不会对其他的引用有什么影响。
字符串连接:为String对象重载的“+”操作符可以用来连接String。编译器看到String对象后面跟着一个“+”时,就将与之相加的其他对象(可能并不是字符串)也转换为字符串,转换时是通过调用该对象的toString()方法。
当使用+拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。与之形成对比的是StringBuffer类,StringBuffer类使用append()方法追加字符串,向原有对象追加而不是创建新的对象。append()方法返回当前StringBuffer对象,因此可以串联起来使用。如:

StringBuffer buffer = new StringBuffer();buffer.append("Hello").append(" World");
StringBuffer类的toString()方法返回String类对象。StringBuffer类和String类的主要区别就是StringBuffer类的对象可以改变,而String类的对象一旦创建,就不能改变内容。
Java SE5中引入了StringBuilder,StringBuilder和StringBuffer的主要区别是后者是线程安全的。

二、去华为面试的时候, 第一笔试题就让我费神去想了, 回来在机子上运行结果, 发现自己当时答错了, 于是就狠下心来花了点时间研究这个:

String s = null;s += "abc";System.out.println(s);
答案是:nullabc
就这三行代码, 我问了不下于50个人, 有资深的人也有新手的, 在不运行的情况下全答错了! 可见现在学java的人有很多人都是速成的,而且这种原理级而又看似不怎么实用的东西几乎没什么人去研究, 但是后面说的机试如果能知道String拼接的原理的话,将很容易就解决!
很早的时候我就知道String拼接中间会产生StringBuilder对象(JDK1.5之前产生StringBuffer),但是当时也没有去深究内部, 导致在华为笔试此题就错了!
字符串拼接原理:运行时, 两个字符串str1, str2的拼接首先会调用 String.valueOf(obj),这个Obj为str1,而String.valueOf(Obj)中的实现是return obj == null ? "null" : obj.toString(), 然后产生StringBuilder, 调用的StringBuilder(str1)构造方法, 把StringBuilder初始化,长度为str1.length()+16,并且调用append(str1)! 接下来调用StringBuilder.append(str2), 把第二个字符串拼接进去, 然后调用StringBuilder.toString返回结果!
所以那道题答案的由来就是:StringBuilder.append("null").append("abc").toString();

大家看了我以上的分析以后, 再碰到诸如此类的面试题应该不会再出错了!

本文参考:http://blog.csdn.net/izard999/article/details/6708433

http://www.cnblogs.com/mengdd/archive/2013/01/03/2842846.html

0 0
原创粉丝点击