今天在一篇博客里,意外的看到了一段关于java中对字符串的“+”运算的处理(博客原文:http://blog.csdn.net/yirentianran/article/details/2871417),突然间想到要详细了解下这个知识点,于是从网上找资料学习了一下。
首先罗列下已知的java中字符串连接方式
第一种:使用Stirng类的concat方法
形式:
String c = a.concat(b);
顺便学习了concat的源码,concat的实现方式是这样的
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
} |
第二种:利用StringBuffer(或者StringBuilder)
形式:
StringBuilder st = new StringBuilder();
c = st.append(a).append(b).toString();
第三种:也是最最常用的,“+”运算
形式:
c = a+b;
问题是:java虚拟机是怎么执行这个运算的?“+”代表了什么,是不是映射了某个方法?
首先看下jdk1.6版本中的一个说明:
Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是过
StringBuilder
(或StringBuffer
)类及其 append
方法实现的。字符串转换是通过 toString
方法实现的,该方法由 Object
类定义,并可被 Java 中的所有类继承。有关字符串串联和转换的对于java的这个机制,我是一点都不了解,试着从网上百度了一些,发现这个问题还是有不少人感兴趣的,现在就自己总结一下这方面的知识:
(1)在水木社区主站,我找到了一个相同的问题,得知了两点:一是string是编译器有特殊处理的类;二是,在《thinking in java》一书里有提及(查书后发现也只是略有提交,没有详细阐述)。
(2)最后是一篇博客,作者通过反编译证明了一开始那篇文章的说法。阅读后也是受益匪浅,非常感谢作者的贡献和分享。