您的位置:首页 > 编程语言 > Java开发

[javase]字符串拼接

2012-07-30 23:59 190 查看
原文地址:http://tech.techweb.com.cn/thread-511421-1-1.html

网上剖析String的不少,关于其他的String的知识我就不累赘去说了!" }* I# t% R+ R6 f
* t) ]$ Q' O4 ~- y5 _. O0 r8 h

本文只解释下我在面试中遇到的String拼接的问题以及最近看到了网上的一道机试题跟这个有关系, 所以就想把自己对String拼接的理解分享给大家

Java codeString s =

null;  ' O' D+ t# W8 k

s +=5 z  ?  f( H; o6 Z
"abc";  + u& I# {  X/ v6 u- M3 C

System.out.println(s);  

答案是nullabc!1 h! Z! w. `$ L# E, p

就这三行代码, 我问了不下于50个人, 有资深的人也有新手的, 在不运行的情况下全答错了。! 可见现在学java的人有很多人都是速成的,而且这种原理级而又看似不怎么实用的东西几乎没什么人去研究, 但是后面说的机试如果能知道String拼接的原理的话。将很容易就解决!- T9 p8 d( O8 J$ P
3 f( S, j( ]7 t" t1 r4 P4 I4 O

很早的时候我就知道String拼接中间会产生StringBuilder对象(JDK1.5之前产生StringBuffer),但是当时也没有去深究内部, 导致在华为笔试此题就错了!
1 A5 q% K: p5 b2 d  B! U0 N9 j

运行时, 两个字符串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返回结果!
" k) e9 V4 h0 M" d

所以那道题答案的由来就是StringBuilder.append("null").append("abc").toString();6 _, Q$ p8 f$ G- V2 v

大家看了我以上的分析以后, 再碰到诸如此类的面试题应该不会再出错了!6 X( j# s* F. d

3 ?$ Z  ^$ Q# |7 B

那么了解String拼接有什么用呢?% B( Z2 `' k! T5 N8 T" s
5 p, u; q# ^! H$ d, V

在做多线程的时候, 往往会用到一个同步监视器对象去同步一个代码块中的代码synchronized(Obj), 对同一个对象才会互斥,不是同一个对象就不会互斥!
就这三行代码, 我问了不下于50个人, 有资深的人也有新手的, 在不运行的情况下全答错了。! 可见现在学java的人有很多人都是速成的,而且这种原理级而又看似不怎么实用的东西几乎没什么人去研究, 但是后面说的机试如果能知道String拼接的原理的话。将很容易就解决!- T9 p8 d( O8 J$ P
3 f( S, j( ]7 t" t1 r4 P4 I4 O

很早的时候我就知道String拼接中间会产生StringBuilder对象(JDK1.5之前产生StringBuffer),但是当时也没有去深究内部, 导致在华为笔试此题就错了!
1 A5 q% K: p5 b2 d  B! U0 N9 j

运行时, 两个字符串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返回结果!
" k) e9 V4 h0 M" d

所以那道题答案的由来就是StringBuilder.append("null").append("abc").toString();6 _, Q$ p8 f$ G- V2 v

大家看了我以上的分析以后, 再碰到诸如此类的面试题应该不会再出错了!6 X( j# s* F. d

3 ?$ Z  ^$ Q# |7 B

那么了解String拼接有什么用呢?% B( Z2 `' k! T5 N8 T" s
5 p, u; q# ^! H$ d, V

在做多线程的时候, 往往会用到一个同步监视器对象去同步一个代码块中的代码synchronized(Obj), 对同一个对象才会互斥,不是同一个对象就不会互斥!就这三行代码, 我问了不下于50个人, 有资深的人也有新手的, 在不运行的情况下全答错了。! 可见现在学java的人有很多人都是速成的,而且这种原理级而又看似不怎么实用的东西几乎没什么人去研究, 但是后面说的机试如果能知道String拼接的原理的话。将很容易就解决!- T9
p8 d( O8 J$ P
3 f( S, j( ]7 t" t1 r4 P4 I4 O

很早的时候我就知道String拼接中间会产生StringBuilder对象(JDK1.5之前产生StringBuffer),但是当时也没有去深究内部, 导致在华为笔试此题就错了!
1 A5 q% K: p5 b2 d  B! U0 N9 j

运行时, 两个字符串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返回结果!
" k) e9 V4 h0 M" d

所以那道题答案的由来就是StringBuilder.append("null").append("abc").toString();6 _, Q$ p8 f$ G- V2 v

大家看了我以上的分析以后, 再碰到诸如此类的面试题应该不会再出错了!6 X( j# s* F. d

3 ?$ Z  ^$ Q# |7 B

那么了解String拼接有什么用呢?% B( Z2 `' k! T5 N8 T" s
5 p, u; q# ^! H$ d, V

在做多线程的时候, 往往会用到一个同步监视器对象去同步一个代码块中的代码synchronized(Obj), 对同一个对象才会互斥,不是同一个对象就不会互斥!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息