java script和java有什么区别_Java 中操作字符串都有哪些类?它们之间有什么区别

c4475753a8732dec7763c0967f093224.png

1. String、StringBuffer、StringBuilder

原文出自《编写高质量代码:改善 Java 程序的 151 个建议》

CharSequence 接口有三个实现类与字符串有关:String、StringBuffer、StringBuilder,虽然它们都与字符串有关,但是其处理机制是不同的。

String 类是不可改变的量,也就是创建后就不能再修改了,比如创建了一个“abc”这样的字符串对象,那么它在内存中永远都会是“abc”这样具有固定表面值的一个对象,不能被修改,即使想通过 String 提供的方法来尝试修改,也是要么创建一个新的字符串对象,要么返回自己,比如:

String str = "abc";String str1 = str.substring(1);

StringBuffer 是一个可变字符序列,它与 String 一样,在内存中保存的都是一个有序的字符序列(char 类型的数组),不同点是 StringBuffer 对象的值是可改变的,例如:

StringBuffer sb = new StringBuffer("a");sb.append("b");

从上面的代码可以看出 sb 的值在改变,初始化的时候是“a”,经过 append 方法后,其值变成了“ab”。可能有读者会问了,这与 String 类通过“+”连接有什么区别?例如:

String s = "a";s = s + "b";

有区别,字符串变量 s 初始化时是“a”对象的引用,经过加号计算后,s 变量就修改为了“ab”的引用,但是初始化的“a”对象还是没有改变,只是变量 s 指向了新的引用地址。再看看 StringBuffer 的对象,它的引用地址虽不变,但值在改变。

StringBuilder 与 StringBuffer 基本相同,都是可变字符序列,不同点是:StringBuffer 是线程安全的,StringBuilder 是线程不安全的,翻翻两者的源代码,就会发现在 StringBuffer 的方法前都有 synchronized 关键字,这也是 StringBuffer 在性能上远低于 StringBuilder 的原因。

在性能方面,由于 String 类的操作都是产生新的 String 对象,而 StringBuilder 和 StringBuffer 只是一个字符数组的再扩容而已,所以 String 类的操作要远慢于 StringBuffer 和 StringBuilder。

弄清楚了三者的原理,我们就可以在不同的场景下使用不同的字符序列了:

(1)使用 String 类的场景

在字符串不经常变化的场景中可以使用 String 类,例如常量的声明、少量的变量运算等。

(2)使用 StringBuffer 类的场景

在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用 StringBuffer,例如 XML 解析、HTTP 参数解析和封装等。

(3)使用 StringBuilder 类的场景

在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在单线程的环境中,则可以考虑使用 StringBuilder,如 SQL 语句的拼装、JSON 封装等。

2 String,StringBuffer, StringBuilder 的区别是什么

1、String 是字符串常量,而 StringBuffer 和 StringBuilder 是字符串变量。由 String 创建的字符内容是不可改变的,而由 StringBuffer 和 StringBuidler 创建的字符内容是可以改变的。

2、StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的。StringBuilder 是从 JDK 5 开始,为 StringBuffer 类补充的一个单线程的等价类。我们在使用时应优先考虑使用 StringBuilder,因为它支持 StringBuffer 的所有操作,但是因为它不执行同步,不会有线程安全带来额外的系统消耗,所以速度更快。

8803226b4e430582b1deea75b1a0d635.png
10d30fb0a6164029167b1b21bf3f76e0.png

- END -

a1f51259e91c11f0211b9919b4d6a6f1.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值