1.代码
package lan.jdk.study;
public class StringTest {
private String name;
private String address;
public static void main(String[] args) {
String s = "";
for(int i = 1; i < 1000000; i++){
s += i;
}
}
@Override
public String toString() {
return "StringTest [name=" + name + ", address=" + address + "]";
}
}
记得刚学java的时候,如上代码中的s+=i;应该用StringBuilder的append方法来完成,从而避免生成很多String对象,
而在jdk1.6中,s+=i;这种代码会自动被编译器优化,通过反编译代码,可的到如下结果
Compiled from "StringTest.java"
public class lan.jdk.study.StringTest extends java.lang.Object{
public lan.jdk.study.StringTest();
Code:
0: aload_0
1: invokespecial #11; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #19; //String
2: astore_1
3: iconst_1
4: istore_2
5: goto 30
8: new #21; //class java/lang/StringBuilder
11: dup
12: aload_1
13: invokestatic #23; //Method java/lang/String.valueOf:(Ljava/lang/Objec
t;)Ljava/lang/String;
16: invokespecial #29; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
19: iload_2
20: invokevirtual #32; //Method java/lang/StringBuilder.append:(I)Ljava/la
ng/StringBuilder;
23: invokevirtual #36; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
26: astore_1
27: iinc 2, 1
30: iload_2
31: ldc #40; //int 1000000
33: if_icmplt 8
36: return
public java.lang.String toString();
Code:
0: new #21; //class java/lang/StringBuilder
3: dup
4: ldc #47; //String StringTest [name=
6: invokespecial #29; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
9: aload_0
10: getfield #49; //Field name:Ljava/lang/String;
13: invokevirtual #51; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
16: ldc #54; //String , address=
18: invokevirtual #51; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
21: aload_0
22: getfield #56; //Field address:Ljava/lang/String;
25: invokevirtual #51; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
28: ldc #58; //String ]
30: invokevirtual #51; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
33: invokevirtual #36; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
36: areturn
}
可以看jdk会自动优化String相加的代码,因此代码中直接用+操作连接字符串即可,以增加代码可读性。
分享到:
相关推荐
本测试着重探讨了三种常用的字符串连接方法:`+`运算符、`String.Format()`以及`StringBuilder.Append()`,并分析了它们在性能上的差异。 1. **字符串连接:+ 运算符** 在C#中,`+`运算符可以用于连接两个或多个...
在VB6.0编程环境中,连接运算符是用于将字符串或数值组合在一起的关键工具。本文将深入探讨两种主要的连接运算符:`+`和`&`,并提供实例来帮助理解它们之间的区别。 首先,让我们了解`+`运算符。在VB6.0中,`+`...
例如,我们希望两个`String`对象可以通过`+`运算符连接起来。这就是运算符重载的用途。 对于`String`类,我们可以这样重载`+`运算符: ```cpp String operator+(const String& other) const { // 创建一个新的...
String 类运算符重载 在 C++ 编程语言中,String 类是一种基本的数据类型,用于存储字符串。然而,在实际应用中,我们经常需要对字符串进行各种操作,例如字符串连接、字符串比较、字符串删除等等。为了满足这些...
"string类运算符重载" 本文主要讲解了C++中string类的运算符重载,包括构造函数、析构函数、拷贝构造函数、赋值函数、字符串相连函数等等。 首先,我们需要了解什么是运算符重载。运算符重载是C++中的一种机制,它...
我们重载了“+”运算符,使得我们可以使用“+”来连接字符串。 RString operator+ (const RString &other); 3. 字符串删除运算符重载 我们重载了“-”运算符,使得我们可以使用“-”来删除子串。 RString ...
根据给定的文件信息,本文将详细介绍如何在C++中通过重载加号运算符(+)实现字符串的连接功能。 ### C++中的运算符重载 运算符重载是C++面向对象编程的一个重要特性,它允许程序员改变内置运算符(如+、-、*等)...
因此,在设计类 String 时,我们必须增加“ +” 运算符的含义。 运算符重载的概念是指在原来预定义的运算符含义的基础上,再增加对于某个用户定义类型的对象进行操作的新的含义。这就是运算符重载。运算符重载后,...
在Java中,如果两个`String`对象通过`+`运算符连接,如`"abc" + '/'`,编译器会自动进行字面量连接优化(String Concatenation Optimization)。这意味着,只要连接的另一侧是字面量字符串(即直接写在代码中的字符...
3. **字符串连接操作**:使用`+`运算符可以将两个或多个`String`对象或不同数据类型的值连接起来。例如: - `stringThree = stringOne + 123;` 这行代码将整型数值123添加到`stringOne`的末尾。 - `stringThree = ...
那能不能简单地直接用+号连接呢,类似于下面 ’ + ’ 号重载 string a = Hello ; string b = World; cout<< a + b << endl; 如果直接这样用,那肯定是会报错的 这时候,我们可以重载+号运算符实现...
数字和字符串如果使用+运算符进行操作,那么会将数字先转换为字符串,然后进行字符串连接操作: var str = string text ; var num = 10; console.log(str + num) // string text 10 (2)布尔值参与的+运算符操作: ...
在main函数中,创建了两个String对象demo1和demo2,并通过"+"运算符将它们连接起来,最后输出结果。 而示例7-2展示了如何为Time类重载"+"运算符,实现两个时间的相加。这里,"+"运算符的重载作为一个成员函数,接受...
- 连接赋值运算符 (+=, -=, *=, /=, %=) 用于简化复合操作。例如,`x += 5;` 相当于 `x = x + 5;` 6. 比较和逻辑运算符: - 虽然算术运算符主要用于数学计算,但Java中还有比较运算符(==, !=, <, >, , >=)和...
string 字符串拼接操作有多种形式,例如使用 += 运算符重载连接字符串,例如 string& operator+= (const char* str),使用 += 运算符重载连接字符,例如 string& operator+= (const char c),使用 += 运算符重载连接...
例如,对于内置数据类型,加号(+)用于数值相加,而对于字符串类型,则用于连接两个字符串。在C++中,我们也可以对自定义的类进行运算符重载,比如让加号(+)对复数对象执行加法操作。 接下来,我们来讨论运算符...
* 连接运算符(+):可以将两个string对象连接起来形成一个新的string对象。 * 比较运算符(==、!=、<、>等):可以比较两个string对象的值。 * 子串运算符([]):可以访问string对象中指定位置的字符。 五、...
在C++中,字符串连接通常通过`+`运算符或`std::string`的`append`成员函数来完成。面向对象编程中,我们还可以通过自定义类的方法来实现字符串的连接功能。 1. **使用`+`运算符连接字符串**:这是最简单直接的方式...