简介: String 是 Java 中很常用的类之一,同时,字符串是 Java 面试中最重要的话题之一。 StringBuffer 和 StringBuilder 类提供了操作字符串的方法。 我们将研究 StringBuffer 和 StringBuilder 之间的区别。 StringBuffer 与 StringBuilder 的区别是 Java 中很常见的面试题。 在控制台上打印程序的内容,可以使用 String。此博客介绍 String 类的主要功能,然后我们将比较 StringBuffer 和 StringBuilder 类。

Java 中 String 与 StringBuffer 和 StringBuilder 的区别

介绍

String 是 Java 中很常用的类之一,同时,字符串是 Java 面试中最重要的话题之一。

StringBuffer 和 StringBuilder 类提供了操作字符串的方法。

我们将研究 StringBuffer 和 StringBuilder 之间的区别。

StringBuffer 与 StringBuilder 的区别是 Java 中很常见的面试题。

在控制台上打印程序的内容,可以使用 String。此博客介绍 String 类的主要功能,然后我们将比较 StringBuffer 和 StringBuilder 类。

String

注意一个常见的错误,不要记错了。因为 String 是 final 修饰的,无法被继承。所以 String 不是 Java 的基本数据类型。
字符串在 Java 中是不可变的,因此适合在多线程环境下使用。
当我们使用双引号创建一个字符串时,如下,JVM 首先在字符串池中寻找具有相同值的字符串。

String str1 = "ABC";

如果找到了,它将返回字符串池中的字符串对象的引用。否则,它会在字符串池中创建字符串对象并返回引用。JVM 通过在不同的线程中使用相同的字符串,节省了大量的内存。

如果使用 new 运算符创建字符串,则会在堆中创建它。

运算符 + 是为 String 重载的,我们可以用它来串联两个字符串。尽管在内部它使用 StringBuilder 来执行这个动作。

两个字符串只有在它们具有相同字符串的时候才相等,equals() 方法区分大小写。如果您正在寻找不区分大小写的检查,您应该使用 equalsIgnoreCase() 方法。

拼接字符串

由于 String 在 Java 中是不可变的,因此每当我们执行字符串拼接操作时,它都会生成一个新的 String 并丢弃旧的 String 以进行垃圾收集。
这些重复的操作会在堆中产生大量垃圾冗余。所以 Java 提供了 StringBuffer 和 StringBuilder 类,应该用于字符串操作。
StringBuffer 和 StringBuilder 是 Java 中的可变对象。

它们为字符串操作提供了 appendinsertdelete 和 substring 方法。

StringBuffer StringBuilder
线程安全 非线程安全
同步 非同步
始于 Java 1.0 始于 Java 1.5

在 Java 1.4 之前,StringBuffer 是字符串操作的唯一选择。但是,它的一个缺点是所有公共方法都是同步的。 StringBuffer 提供线程安全性,但以性能为代价。

在大多数情况下,我们不会在多线程环境中使用 String。所以 Java 1.5 引入了一个新类 StringBuilder,除了线程安全和同步之外,它与 StringBuffer 类似。

StringBuffer 有一些额外的方法,例如 substring, length, capacity, trimToSize 等。但是,这些不是必需的,因为 String 中也有所有这些。这就是为什么这些方法从未在 StringBuilder 类中实现的原因。

StringBuffer 是在 Java 1.0 中引入的,而 StringBuilder 类是在查看 StringBuffer 的缺点后在 Java 1.5 中引入的。

假设在单线程环境中或无关线程安全,要使用 StringBuilder。反之,使用 StringBuffer 进行线程安全的操作。

总结

    • String 是不可变的,而 StringBuffer 和 StringBuilder 是可变类。
    • StringBuffer 是线程安全和同步的,而 StringBuilder 不是。这就是 StringBuilder 比 StringBuffer 快的原因。
    • 字符串连接运算符 (+) 在内部使用 StringBuilder 类。
    • 对于非多线程环境中的字符串操作,我们应该使用 StringBuilder 否则使用 StringBuffer 类。

最新文章

  1. sublime编辑器插件
  2. ThinkCMF-上传多个图片源码解读
  3. Discuz X2任务开发
  4. openldap sshkey & 用户自定义属性
  5. NopCommerce中的单例
  6. HDU 1025 (LIS+二分) Constructing Roads In JGShining's Kingdom
  7. postgresql编译安装与调试(二)
  8. php数组内容分页的例子(转)
  9. http://jingyan.baidu.com/article/a378c960630e61b329283045.html
  10. Android 游戏开发 View框架
  11. 在Swift中实现 oc与swift的混编
  12. foreach 内嵌的使用
  13. python---用户登录程序
  14. #20175201 实验一 Java开发环境的熟悉(Linux + Eclipse)
  15. mysql 开发进阶篇系列 22 磁盘I/O问题(从linux操作系统上优化)
  16. Spring Cloud Consul使用——配置中心
  17. sql server2008 R2打开报错:无法识别的配置节 system.serviceModel解决办法分享
  18. 指定变形中心点CSS3
  19. js面向对象设计之class中一些坑和技巧
  20. 迷你MVVM框架 avalonjs 0.84发布

热门文章

  1. Elasticsearch:Index alias
  2. C#-12 转换
  3. NOIP 2013 洛谷P1966 火柴排队 (树状数组求逆序对)
  4. Es 学习笔记 (1)
  5. 快速上手Spring项目
  6. web前端一览&jQuery
  7. springboot+thymeleaf+bootstrap 超级无敌简洁的页面展示 商城管理页面
  8. 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2021)-MUFFIN:用于DDI预测的多尺度特征融合
  9. jquery的toggle()函数,显示/隐藏交替
  10. 为什么CSS中的calc函数可能会不生效?