java中String、StringBuffer与StringBuilder的区别

作者:陈新月-Phyllis 时间:2021-11-12 13:28:24 

String

String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

这个是String类的解释,之前小咸儿看到这个情况,不能理解上述的解释,如下


String a = "123";
a = "456";
// 打印出来的a为456
System.out.println(a)

看到这里,小咸儿不明白了,这不是明明已经对他进行修改了吗?为什么还说他是一个不可变类呢?

经过小咸儿和小伙伴们的学习,明白String类不可变在哪里体现出来的,接下来就看一张上述a对象的内存存储空间图

java中String、StringBuffer与StringBuilder的区别

可以看出来,再次给a赋值时,并不是对原来堆中实例对象进行重新赋值,而是生成一个新的实例对象,并且指向“456”这个字符串,a则指向最新生成的实例对象,之前的实例对象仍然存在,如果没有被再次引用,则会被垃圾回收。

StringBuffer

StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。


StringBuffer b = new StringBuffer("123");
b.append("456");
// b打印结果为:123456
System.out.println(b);

在看一下b对象的内存空间图:

java中String、StringBuffer与StringBuilder的区别

所以说StringBuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中可以连接新的字符串。

StringBuilder

StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。

StringBuffer是如何实现线程安全的呢?

StringBuffer类中实现的方法:

java中String、StringBuffer与StringBuilder的区别

StringBuilder类中实现的方法:

java中String、StringBuffer与StringBuilder的区别

由此可见,StringBuffer类中的方法都添加了synchronized关键字,也就是给这个方法添加了一个锁,用来保证线程安全。

Java9的改进

Java9改进了字符串(包括String、StringBuffer、StringBuilder)的实现。在Java9以前字符串采用char[]数组来保存字符,因此字符串的每个字符占2字节;而Java9的字符串采用byte[]数组再加一个encoding-flag字段来保存字符,因此字符串的每个字符只占1字节。所以Java9的字符串更加节省空间,字符串的功能方法也没有受到影响。

以上所述是小编给大家介绍的java中String、StringBuffer与StringBuilder的区别网站的支持!

来源:https://blog.csdn.net/csxypr/article/details/92378336

标签:java,String,StringBuffer,StringBuilder
0
投稿

猜你喜欢

  • JAVA操作MongoDB数据库实例教程

    2023-11-18 13:22:27
  • IDEA安装后找不到.vmoptions文件的问题及解决

    2023-10-05 22:43:44
  • springboot集成redis并使用redis生成全局唯一索引ID

    2023-11-28 05:42:39
  • springboot自动扫描添加的BeanDefinition源码实例详解

    2023-11-24 15:15:22
  • 举例说明Java设计模式编程中ISP接口隔离原则的使用

    2023-11-20 11:07:40
  • java读取XML文件的四种方法总结(必看篇)

    2023-03-22 23:12:58
  • Java多线程模拟银行系统存钱问题详解

    2023-11-28 22:13:32
  • Spring实现处理跨域请求代码详解

    2023-11-25 12:28:34
  • Spring-Data-JPA整合MySQL和配置的方法

    2023-10-29 10:19:41
  • MyBatis-Plus多表联查(动态查询)的项目实践

    2023-11-19 21:43:17
  • springboot读取文件,打成jar包后访问不到的解决

    2023-07-14 13:56:35
  • java实现给图片加铺满的网格式文字水印

    2023-07-30 05:22:12
  • c#实现16进制和字符串之间转换的代码

    2023-07-22 08:28:09
  • 通过Docker启动Solace并在Spring Boot通过JMS整合Solace的操作方法

    2023-07-11 09:52:28
  • Flutter 如何正确显示SnackBar

    2023-06-23 13:00:40
  • Java中finally和return的关系实例解析

    2023-05-31 04:21:31
  • 浅谈SpringMVC+Spring3+Hibernate4开发环境搭建

    2023-08-06 13:49:19
  • Java中避免过多if-else的几种方法

    2023-11-28 13:07:09
  • Java实现数据库连接池的方法

    2023-11-28 08:57:30
  • springboot 整合hbase的示例代码

    2023-02-11 19:35:20
  • asp之家 软件编程 m.aspxhome.com