原文:How is + implemented in Java?
译文:在java中,字符串的加法是如何实现的?
当我查看String类的concat函数的源码时,发现字符串连接是这么实现的:
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
那么,字符串的连接符(+)的实现和这个有什么区别呢?如果有区别的话,那它是如何实现的呢?
此外,这两者分别在什么场合使用,有没有性能上的差异。
为了回答这个问题,我们可以做一个测试。
首先,我们连接两个字符串
String s1 = "foo";
String s2 = "bar";
String s3 = s1 + s2;
下面我们将这个代码编译成class文件,然后再反编译(可以用JAD),我们得到反编译后的代码是:
String s = "foo";
String s1 = "bar";
String s2 = (new StringBuilder()).append(s).append(s1).toString();
所以,+ 和 concat 肯定是有区别的。
在性能上,从 concat() 源码可以看出,StringBuilder创建了更多的对象,而concat却没有,它使用的String类的内部实现。
综上,当我们需要连接两个字符串的时候,我们应当优先考虑使用 concat() 函数,当我们需要连接字符串和其它类型的变量时,再考虑使用+运算符。
译者注:用 javap -c 查看java生成的字节码:
java.lang.String cat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/ String;
18: astore_1
19: aload_1
20: areturn
可以看出 a += b 其实等价于
a = new StringBuilder()
.append(a)
.append(b)
.toString();
分享到:
相关推荐
将近250行的算法 实现了通过字符串进行加减乘除四则运算 纯通过处理字符串和数组实现 希望能帮助大家: 例如:String input "33+26 77+70"; String result ""; try { result Account...
功能:给出一个字符串表达式(可以是任意复杂的字符串表达式),计算字符串表达式的值. 特性: 1:用户可以添加其它运算符号 ,也就是说用户可以制定新的运算符,引擎中不存在的运算符号,当然具体的运算类...
java实现任意进制的转换,包括2进制转16进制,10进制转16进制,10进制转任意进制,36进制加法,可自行手动设置转换进制和需要转换的数字.
在123456789中任意位置插入任意个+-*/使表达式等于100,用go语言实现,Count函数借用他人,主要功能是计算表达式的值,本文没有提供。
集成了大整数的、加法、减法(仅限被减数大于减数)、乘法、乘以2、除以2、减去1、判断奇偶、判断是否为1等方法 乘法和加法经过多次测试和修改,基本上不存在什么问题,除法因为没用到所以没有写。 可以用到大数算法...
* 把一个字符串表达式,拆分成两个集合,一个集合包含计算中的数,一个集合包含计算中的符号 * 1.把一个表达式中的运算子提取出来 * 2.把一个表达式中的数提取出来 * 3.遍历运算子集合,优先运算乘法和除法(遇到乘法...
通常成为一个优秀的JAVA程序员需要较长时间的经验积累,包括从程序的tuning中,或从其他有经验的程序员口中,才知道一定功能需要怎样实现,在程序中需要避免那些问题.但这往往是比较片面的,知其然而不知其所以然.
Java实验上机答案,内附详细解释说明,答题规范有效。
Python与C语言,Java语言都不一样,没有单个字符,只有一个有一个字符的字符串。 字符串对象不可修改,属于不可变类型 字符串和列表,元组都从属于序列这个对象类别。所以序列支持的操作,字符串也支持。 用单...
本资源给出了Eclipse下图灵机的完整Java程序源码工程包,开发说明文档中给出了图灵机概要设计,功能实现程序结构剖析,明了易懂,源码导入Eclipse即可使用,无需编译,实用性极强。 功能简述:Java GUI(AWT)生成...
北京动力节点-Java编程零基础教程-091-Java基本语法-控制语句-switch语句-字符串作为比较对象.avi 北京动力节点-Java编程零基础教程-092-Java基本语法-控制语句-switch语句-举例1.avi 北京动力节点-Java编程零...
6.7.2 从字符串中删除空格 268 6.7.3 计算表达式的值 268 6.7.4 获得项值 271 6.7.5 分析数 272 6.7.6 整合程序 274 6.7.7 扩展程序 276 6.7.8 提取子字符串 277 6.7.9 运行修改过的程序 280 6.8 ...
实例42 字符串索引越界异常(StringIndexOutBounds) 60 实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 ...
实例42 字符串索引越界异常(StringIndexOutBounds) 60 实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求的...
实例42 字符串索引越界异常(StringIndexOutBounds) 60 实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 ...
字符串计算器用定界符输入字符串数字并产生数字加法
实例42 字符串索引越界异常(StringIndexOutBounds) 60 实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求...
实例42 字符串索引越界异常(StringIndexOutBounds) 60 实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求的...
您输入两个字符串:一个键和一个消息 该消息使用base32编码(使用Guava) 密钥被哈希化为SHA-3(515位)哈希,我们将其称为h1(这是一个整数) 根据一个赋予属性的小型算法,生成一个称为salt的伪随机数:将其添加...
实验指导书 实验名称:包、接口与异常处理 学时安排:2 实验类别:综合设计型实验 实验要求:1人1组  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 一、实验目的 1、掌握java字符串处理...