解析Java String类中的运算符“+”

版权声明:本文为博主原创文章,转载请注明出处,谢谢!

版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2017/07/21/解析Java-String类中的运算符“-”/

访问原文「解析Java String类中的运算符“+”

String简要说明

大家都知道Java中String是不可变类。也就是说如果有一个String初始化的值位”Hello”,如果把它赋值为”Hello World!”,那么不是在原内存地址上修改数据,而是重新生成了一个新对象并重新指向这个对象。而在Java虚拟机中,字符串是直接放在常量池中的,而且关于String比较相关的题目很多,这篇文章不做详细描述。

一个简单的例子

下面的代码会生成几个String,先不要着急的往下看答案,自己想想。

1
String str = "Hello" + "World" + "!";

这个问题主要还是考察了Java虚拟机对String中”+”运算符的特殊处理,我们来看一下编译生成的class是什么样的。见下图。

看到String HelloWorld!是不是很惊讶,是的,这段代码只生成了一个字符串。

看看Java源码是怎么说的

下面粘贴出来的是Java1.8中String源码上的注释。

可以看到Java对String+运算提供了特殊的支持,也就是说使用String+会被解析成为StringBuilder或者StringBuffer。上面的例子里没有看到StringBuilder或者StringBuffer的影子,我们再来看一些复杂的例子。

稍微复杂的例子

首先看下面的例子,这个代码会生成几个字符串,先不要着急的往下看答案,自己想想。

1
2
3
4
5
6
7
public static void main(String[] args) {
String author = "Jerky Lu";
int age = 99;
boolean isMale = true;
String desc = author + ",age:" + age + ",isMale" + isMale;
System.out.println(desc);
}

我们再来看一下这个main函数编译后的结果,见下图。

可以看到已经定义的数据相加产生的字符串和直接相加产生的新字符串是不一样的。

然后看一个循环的例子。

1
2
3
4
5
6
7
8
public static void main(String[] args) {
String str = "";
for(char i = 'a'; i <= 'z'; i++)
{
str += i;
}
System.out.println(str);
}

编译后的结果如下。

总结一下

String的+被Java进行了特殊处理,在运算过程中会使用StringBuilder或者StringBuffer代替求和。而具体会生成几个字符串也要具体问题具体分析,如果数据不定义而是直接相加只会产生1个字符串,而如果有字符串或者基本类型等预先定义好再相加结果是会生成多个。另外需要强调的是,本文的例子中所有的字符串均没有被提前生成。