String、StringBuilder、StringBuffer

String 特点

  • 字符串不可变,它们的值在创建后不能被更改
  • 虽然 String 的值是不可变的,但是它们可以被共享
  • 字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[])

String 对象的特点

  • 通过构造方法得到的对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同。
  • 通过直接赋值得到的对象,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立—个 String 对象,并在字符串池中维护。

字符串比较

因为 String 是引用数据类型,所以使用 == 比较的是两个字符串对象的地址值是否相同。故需使用 public boolean equals(Object anObject) {} 方法比较字符串的内容是否相同。

String 常见笔试题

  1. 下面代码中第一行会在常量池中创建 abc,第二行代码会在堆内存中创建 abc。
	String str1 = "abc";
	String str2 = new String("abc");
	System.out.println(str1 == str2); // false
	System.out.println(str1.equals(str2)); // true
  1. 下面代码中第一行根据常量优化机制在编译时 str1 已经优化成了 abc,因此会在常量池中创建 abc,第二行代码则会寻找常量池中的 abc,不再创建。
	String str1 = "a" + "b" + "c";
	String str2 = "abc";
	System.out.println(str1 == str2); // true
	System.out.println(str1.equals(str2)); // true
  1. 下面代码中第一行在常量池中创建 ab,第二行在常量池中创建 abc,第三行先创建 StringBuilder 对象,通过 append 连接得到 abc,再调用 toString() 把得到的地址指向 str3。
	String str1 = "ab";
	String str2 = "abc";
	String str3 = str1 + "c";
	System.out.println(str3 == str2); // false
	System.out.println(str3.equals(str2)); // true

第一行和第三行代码的解析内容:

Code:
       0: ldc           #2                  // String ab
       2: astore_1
       3: new           #3                  // class java/lang/StringBuilder
       6: dup
       7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      10: aload_1
      11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      14: ldc           #6                  // String c
      16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      22: astore_2
      23: return

StringBuilder

对字符串进行拼接操作时,每次拼接,都会构建一个新的 String 对象,既耗时,又浪费内存空间,因此 Java 提供了 StringBuilder 类来解决这个问题。

String 和 StringBuilder 相互转换

String 转 StringBuilder

通过 StringBuilder 的构造方法 public StringBuilder(String var1) 就可以转成 StringBuilder。

	String str = "abc";
	StringBuilder sb = new StringBuilder(str);

StringBuilder 转 String

通过 StringBuilder 对象的 toString() 就可以转成 String。

	StringBuilder sb = new StringBuilder("abc");
    String str = sb.toString();

String、StringBuilder 和 StringBuffer

区别

  • String:字符串常量,字符串值不可变。因为用于存放字符的数组被声明为 final 的,因此只能赋值一次,不可再更改。

  • StringBuilder:字符串变量,非线程安全。在内部 StringBuilder 对象被当作是一个包含字符序列的变长数组。

  • StringBuffer:字符串变量,线程安全。该类在日常开发中基本不会使用到。

使用场景

  • 循环中拼接字符串,反转字符串时可使用 StringBuilder。
  • 非上述场景下可直接使用 String。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aiqian9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值