剖析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>, CharSequenceJava程序中的所有字面值(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
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- JAVA中的String剖析
- J2SE基础夯实系列之String字符串拼接原理剖析
- Java String拼接
- 关于Java字符串String在运算中的拼接
- JAVA源码剖析之---String类(一)
- JAVA源码剖析之--String类(二)
- Java 之String的内存分析拼接,联系
- String中的字符串拼接问题
- C++之string的拼接
- java的string字符串拼接
- Java中的字符串拼接
- 剖析java的字符串拼接机制
- 【网络协议】ICMP协议、Ping、Traceroute
- duplicate symbol 错误的解决办法
- 算法5-2:红黑树
- 计科1111-1114班第二次实验作业(算法基本功 与 综合思考)
- tomcat原理及实现-----tomcat模块模块化(第二篇)
- 剖析java中的String之__拼接
- 利用C#进行Socket通信编实例
- position学习终结者(一)
- Linux内核设计基础(六)之块I/O层
- 如何用一个月的时间准备google的技术面试
- Mysql嵌套语句的应用
- 找硬币问题
- 算法5-3:B树
- 解决get方法传递URL参数中文乱码问题