原文: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();
分享到:
相关推荐
在Java编程语言中,计算字符串表达式是一项常见的任务,它涉及到解析、编译和执行包含数学运算符和操作数的字符串。这篇博客“Java实现计算字符串表达式”可能讲解了如何利用Java来处理这种问题,虽然具体的实现细节...
将近250行的算法 实现了通过字符串进行加减乘除四则运算 纯通过处理字符串和数组实现 希望能帮助大家: 例如:String input "33+26 77+70"; String result ""; try { result Account...
在实际编程中,开发者通常会利用现有的库来实现AES加密和解密,例如Java的JCE库、Python的pycryptodome库或者C#的Bouncy Castle库。这些库已经封装好了加密和解密的过程,只需调用相应的函数并提供密钥和待处理的...
3. **add2 方法**:这个方法扩展了加法功能,接受一个字符串数组作为参数,对数组中的所有元素进行累加。同样,每个元素在加入之前都会通过 `null2zero` 转换。 4. **sub 方法**:实现减法操作,与 `add` 方法类似...
实现字符串转算式的算法有很多种,例如递归下降解析(Recursive Descent Parsing)、LL(1)、LR(0)、LALR(1)等都是编译原理中的经典方法。对于简单的算式,可以使用更直观的方法,如Shunting Yard算法或直接使用栈来...
2. 实现基本的字符串数学运算,如字符串加法、减法、乘法和除法,这可能涉及到复杂的位操作和边界条件处理。 3. 提供一个机制来设置精度,即决定保留多少位小数,这可以通过控制字符串截断或者四舍五入来实现。 4. ...
在这个过程中,有两个关键步骤:**字符串解析**和**运算逻辑处理**。 **字符串解析**是将用户输入的文本转换为可执行的数学表达式的过程。这涉及到识别数字、操作符(如加号"+"、减号"-"、乘号"*"、除号"/"等)以及...
在Java中,我们可以使用`Integer`类的`toHexString`方法,将一个整数的二进制表示转换为十六进制字符串。例如: ```java int binaryNumber = 0b101010; // 二进制数 String hexString = Integer.toHexString(binary...
在Java中,词法分析器会识别诸如"int"(整型)、"+"(加法运算符)和"String"(字符串类型)这样的标识符。词法分析器的工作是基于预定义的规则,这些规则定义了源代码的字符序列如何映射到词法单元。例如,一个简单...
在IT行业中,字符串转公式是一项常见的任务,尤其是在计算和数据分析领域。这个过程涉及到将用户输入的字符串解析成可执行的数学公式,然后计算出结果。这通常需要编程语言中的表达式解析器或库来实现。以下是一些...
在编程领域,实现一个计算器来处理字符串形式的运算表达式是一项常见的任务。这个“计算器(字符串运算)”项目旨在处理用户输入的复杂数学表达式,例如“-(1+(2-3)*4-(3+19)%3)/2”,并返回计算结果。这种...
四则运算解析器是一种计算机程序,它能够接收包含加、减、乘、除等四则运算符的字符串表达式,并将其转化为可执行的计算过程。这个解析器通常用于解决基础的数学问题,对于编程初学者来说,理解并实现这样一个解析器...
功能:给出一个字符串表达式(可以是任意复杂的字符串表达式),计算字符串表达式的值. 特性: 1:用户可以添加其它运算符号 ,也就是说用户可以制定新的运算符,引擎中不存在的运算符号,当然具体的运算类...
在提供的压缩包文件中,"字符串计算器.exe"是一个可执行文件,可能是用某种编程语言(如C++、Java、Python等)编译或打包后的程序,可以直接运行以使用这个字符串计算器。运行这个程序时,用户可以在命令行界面或...
在本压缩包“java-leetcode题解之第415题字符串相加.zip”中,包含的是关于LeetCode第415题“字符串相加”(Add Strings)的Java解决方案。这道题目属于计算机编程领域,特别是Java语言的学习与算法实践。LeetCode是...
在Java中,我们通常使用字符串来表示MAC地址。 2. **MAC地址校验**: - **校验有效性**:可以使用正则表达式检查MAC地址的格式是否正确,例如`^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$`。 - **校验物理唯一性*...
在这个示例中,使用 Java 语言实现了对十六进制字符串的异或运算,通过将十六进制字符串转换为二进制形式,然后进行异或运算,最后将结果转换回十六进制字符串。这个示例展示了异或运算在实际应用中的重要性和实用性...
在Java编程中,将两个二进制字符串相加是一个常见的任务,这通常涉及到将字符串转换为整数,进行加法运算,然后将结果转换回二进制字符串。下面我们将详细探讨两种实现方法。 方法一: 这种方法是通过首先将二进制...
字符串在Java中是用双引号包围的一串字符,比如"example of string"。字符串常用于存储文本信息,比如用户输入、文件路径等。高亮字符串可以帮助快速定位和识别字符串,通常字符串会用一种醒目的颜色,比如紫色或者...