浅谈String、StringBuffer和StringBuilder之间的区别

 更新时间:2023年10月21日 10:16:30   作者:浪浪山的猿  
这篇文章主要介绍了浅谈String、StringBuffer和StringBuilder之间的区别,通过字面量方式为字符串赋值时,此时的字符串存储在方法区的字符串常量池中,需要的朋友可以参考下

一. String

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

String的实例化方式

通过字面量方式实例化

String str ="abc";

通过new+构造器的方式实例化

String str = newString("abc");

区别:

  • 通过字面量方式为字符串赋值时,此时的字符串存储在方法区的字符串常量池中;
  • 通过new+构造器方式实例化字符串时,字符串对象存储在堆中,但是字符串的值仍然存储在方法区的常量池中。

String字符串具有不可变性,当字符串重新赋值时,不管是对字符串进行拼接,还是调用String的replace()方法修改指定的字符或字符串,都不会在原来的内存地址进行修改,而是重新分配新的内存地址进行赋值

二. StringBuffer

StringBuffer对象代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列,但都不会产生新的对象。通过StringBuffer生成的字符串,可以调用toString()方法将其转换为一个String对象。

StringBuffer是线程安全的

StringBuffer类中实现的方法,StringBuffer是如何实现线程安全的呢?

    @Override
    public synchronized int length() {
        return count;
    }
    @Override
    public synchronized int capacity() {
        return value.length;
    }
    @Override
    public synchronized void ensureCapacity(int minimumCapacity) {
        super.ensureCapacity(minimumCapacity);
    }
    /**
     * @since      1.5
     */
    @Override
    public synchronized void trimToSize() {
        super.trimToSize();
    }

从源码中可以看到,StringBuffer类中的方法都添加了synchronized关键字,也就是给这个方法添加了一个锁,用来保证线程安全。

三. StringBuilder

StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,他们的原理与操作一样,两个类的构造器和方法也基本相同。

不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。

四. 总结

String、StringBuffer和StringBuilder三者的异同?

  • String :不可变的字符序列;底层使用 byte[] 存储。
  • StringBuffer :可变的字符序列;线程安全的,效率低;底层使用 byte[] 存储。
  • StringBuilder :可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用 byte[] 存储。

从代码角度验证三者的效率对比

接下我们来测试下拼接10000条数据的各自所耗的时间

package com.scg.springcloudordercenter.controller;
 
/**
 * @author gf
 * @date 2023/2/21
 */
public class StringTest {
 
    public static void main(String[] args) {
 
        long startTime;
        long endTime;
        String str1 = "";
        StringBuffer str2 = new StringBuffer("");
        StringBuilder str3 = new StringBuilder("");
 
        // 1.拼接str1,计算String所耗时间
        startTime = System.currentTimeMillis();
        for(int i= 1;i<=10000;i++){
            str1 += i;
        }
        endTime = System.currentTimeMillis();
        System.out.println("String所耗时间为:" + (endTime-startTime) + "毫秒");
 
        // 2.拼接str2,计算StringBuffer所耗时间
        startTime = System.currentTimeMillis();
        for(int i= 1;i<=10000;i++){
            str2.append(i);
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer所耗时间为:" + (endTime-startTime) + "毫秒");
 
        // 3.拼接str3,计算StringBuilder所耗时间
        startTime = System.currentTimeMillis();
        for(int i= 1;i<=10000;i++){
            str3.append(i);
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder所耗时间为:" + (endTime-startTime) + "毫秒");
    }
 
}

结果:

String所耗时间为:745毫秒
StringBuffer所耗时间为:4毫秒
StringBuilder所耗时间为:1毫秒
Process finished with exit code 0

很明显,我们拼接一万次字符串操作就可以对比出三者的效率:StringBuilder>StringBuffer>String

到此这篇关于浅谈String、StringBuffer和StringBuilder之间的区别的文章就介绍到这了,更多相关String、StringBuffer和StringBuilder区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springmvc接收json串,转换为实体类List方法

    springmvc接收json串,转换为实体类List方法

    今天小编就为大家分享一篇springmvc接收json串,转换为实体类List方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 深入解析Jdk8中Stream流的使用让你脱离for循环

    深入解析Jdk8中Stream流的使用让你脱离for循环

    这篇文章主要介绍了Jdk8中Stream流的使用,让你脱离for循环,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • spring boot 错误页面配置解决方案

    spring boot 错误页面配置解决方案

    这篇文章主要介绍了spring boot 错误页面配置解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Spring Boot 定制URL匹配规则的方法

    Spring Boot 定制URL匹配规则的方法

    本篇文章主要介绍了Spring Boot 定制URL匹配规则的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Collection中的size()和isEmpty()区别说明

    Collection中的size()和isEmpty()区别说明

    这篇文章主要介绍了Collection中的size()和isEmpty()区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java 图文并茂讲解主方法中的String[] args参数作用

    Java 图文并茂讲解主方法中的String[] args参数作用

    很多老铁不清楚JAVA主方法中main()里面的的参数是什么意思,以及有什么作用,接下来给大家用最通俗易懂的话来讲解,还不清楚的朋友来看看吧
    2022-04-04
  • 通过反射注解批量插入数据到DB的实现方法

    通过反射注解批量插入数据到DB的实现方法

    今天小编就为大家分享一篇关于通过反射注解批量插入数据到DB的实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • springboot使用swagger-ui 2.10.5 有关版本更新带来的问题小结

    springboot使用swagger-ui 2.10.5 有关版本更新带来的问题小结

    这篇文章主要介绍了springboot使用swagger-ui 2.10.5 有关版本更新带来的问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java设计模式之单一职责原则精解

    Java设计模式之单一职责原则精解

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。本篇介绍设计模式七大原则之一的单一职责原则
    2022-02-02
  • 使用Java将海量扁平数据高效转化为类目字典树

    使用Java将海量扁平数据高效转化为类目字典树

    在电商 ERP 与 OMS 系统的重构中,构建多级商品类目树是一个经典场景,本文结合实际对接海外电商平台的业务场景,探讨如何利用哈希映射将解析的时间复杂度从 O(N²) 降至 O(N),并分享了关于内存预分配与本地缓存的进阶优化思考,需要的朋友可以参考下
    2026-04-04

最新评论