【后端面经-Java】String与StringBuffer与StringBuilder的比较

这篇具有很好参考价值的文章主要介绍了【后端面经-Java】String与StringBuffer与StringBuilder的比较。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 1. String
  • 2. StringBuffer
  • 3. StringBuilder
  • 4. 性能提升
  • 5. 总结和比较
  • 面试模拟
  • 参考资料

1. String

  1. 不可变
    查看String源码如下:
    public final class String implements java.io.Serializable, Comparable<String>, CharSequence{
        /** The value is used for character storage. */
        private final char value[];
    
        /** The offset is the first index of the storage that is used. */
        private final int offset;
    
        /** The count is the number of characters in the String. */
        private final int count;
    
        /** Cache the hash code for the string */
        private int hash; // Default to 0
    
        /** use serialVersionUID from JDK 1.0.2 for interoperability */
        private static final long serialVersionUID = -6849794470754667710L;
        
        ......
    }
    
    由源码可知,String中存储数据的数组被关键字final修饰,因此是不可变的
  2. 运算和操作
    1. 创建对象
      创建对象有两种方式:
      //方式一
        String str = "abc";
      //方式二
        String str = new String("abc");
      
      两种方式都会在栈中创建一个字符串变量str,但它们的内存分配方式是不同的。
      我们可以通过如下代码直观看出两种方式的不同
        String str1 = "abc";
        String str2 = "abc";
        String str3 = new String("abc");
        String str4 = new String("abc");
        System.out.println(str1 == str2); //true
        System.out.println(str3 == str4); //false
      
      为了理解这部分内容,最好先了解一下Java中的内存分配机制,可参考此篇博客:【后端面经-Java】JVM内存分区详解
      总之,简单来说,内存主要分为栈、堆、方法区等部分,栈中存放局部变量,堆中存放对象实例和数组,方法区中存放类信息和常量等,常量池一开始均在方法区中,后来运行时常量池转移到堆中,下文均按照这种内存分配模型来讨论。
      下图展示了两种创建方式下的内存情况:
      • 方式一
      • 在栈中创建一个变量之后,需要指向具体的值,首先会在常量池中查找abc,如果找到,则指向这个字符串,如果没有找到,在运行时常量池中创建这一字符串,然后指向它。
      • 因此,str1str2指向的是同一个字符串,即同一个内存单元,所以str1 == str2true
      • 方式二
        • 在栈中创建一个变量之后,在堆中构造一个新的字符串对象,然后指向它。
        • 因此,str3str4指向的是两个不同的内存单元,所以str3 == str4false
    2. "+"运算
      • 每次"+"运算虽然看似很简便,实际上需要创建一个新的String对象来接收结果,而作为运算数的String对象依然存在于堆中,成为垃圾占用堆空间,需要Java垃圾回收机制进行处理。(关于Java垃圾回收机制,可参考此篇博文:【后端面经-Java】JVM垃圾回收机制)
      • 这种操作是非常低效的,且造成了大量的内存占用,因此在实际开发中,应尽量避免使用"+"运算符来进行字符串拼接,而应该使用StringBufferStringBuilder来进行字符串拼接。
    3. substring() && replace() && concat()
      • 这些操作的一个特点就是:创建新的String对象承接结果,而原来的String对象依然存在于堆中。
  3. 适用场景
    1. 适用于字符串不需修改的场景。

2. StringBuffer

  1. 可变
    1. StringBuffer源代码中数组是可变长度的。
  2. 线程安全
    1. 在类定义过程中,适用synchronized关键字,保证线程安全。
    2. 线程安全与否是StringBufferStringBuilder的重要区别之一。
  3. 运算和操作
    1. append():在字符串末尾添加新字符串;
    2. insert():在指定位置插入新字符串;
    3. toString():将StringBuffer转换为String
  4. 适用场景
    • 多线程,字符串需要频繁修改

3. StringBuilder

  1. 可变
    1. StringBuffer一样,StringBuilder源代码中数组是可变长度的。
  2. 线程不安全
    1. 并没有使用synchronized关键字,因此线程不安全。
    2. 因为线程不安全,不需要考虑线程安全的处理,所以StringBuilder的性能比StringBuffer略高。
  3. 适用场景:
    1. 单线程,字符串需要频繁修改

4. 性能提升

  1. 为了提升性能,避免在字符串需要修改的场景下使用String类;
  2. 在初始定义时预先估计字符串的长度,对StringBuilderStringBuffer进行初始化,避免频繁扩容,提升性能。
     StringBuilder sb = new StringBuilder(100);
     StringBuffer sb = new StringBuffer(100);
    ``
    
    

5. 总结和比较

下图是对三者进行的比较:

面试模拟

Q:简单介绍一下String和StringBuilder的区别
A:首先,String定义的字符串是不可变的,使用拼接函数或者操作符将会创建一个新的String对象,性能不高;而StringBuilder定义的字符串可变,且线程不安全使得其具有较好的性能,在字符串需要频繁修改的场景下,使用StringBuilder会更好。文章来源地址https://www.toymoban.com/news/detail-599656.html

参考资料

  1. Java String、StringBuffer 和 StringBuilder 的区别
  2. Java中String和StringBuilder的区别
  3. 探秘Java中的String、StringBuilder以及StringBuffer

到了这里,关于【后端面经-Java】String与StringBuffer与StringBuilder的比较的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JAVA】String ,StringBuffer 和 StringBuilder 三者有何联系?

    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 在之前的文章中我们介绍了JAVA中String的运用方法,事实上在JAVA字符串操作中仅仅只知道String方法是远远不够的,今天我们要介绍的 StringBuffer 和 StringBuilder 在字符串操作中同样占据总要地位。 和 String 类不同的是,S

    2024年02月14日
    浏览(29)
  • Java-String、StringBuffer、StringBuilder区别及相关面试题

    在Java编程中,经常会遇到处理字符串的需求。Java提供了多个类来处理字符串,其中最常用的是String、StringBuffer和StringBuilder类。本文将介绍这三个类的基本用法和区别。 String是Java中最常用的字符串类,它是不可变的,也就是说一旦被创建,它的值就不能被改变。下面是Stri

    2024年02月11日
    浏览(29)
  • java中的String使用注意事项、StringBuilder、StringBuffer、StringJoiner

    String使用注意事项 这里第二次创造了0个对象是因为字符串常量池中已经有\\\"abc\\\" StringBuilder 注意StringBuilder支持链式编程 StringBuilder 线程安全与不安全的区别在于,当系统里存在很多人同时操作同一个StringBuilder就可能出bug,而StringBuilder不会。 StringJoiner

    2024年02月12日
    浏览(25)
  • Java基础09 —— 字符序列--String、StringBuilder、StringBuffer区别及其方法介绍

    字符与字符串 字符类型(char)是Java中的基本数据类型,占2个字节16位,默认值是 ‘u0000’ 。字符是用单引号引住的单个符号. 字符串(String)是用双引号引住的任意个字符,是引用数据类型,默认值是null 。字符串其实就是字符组成的序列 字符串声明 举例: 字符序列 多个字符

    2024年02月09日
    浏览(28)
  • 36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

    ✏️ Java 中用 java.lang.String 类代表字符串 ✏️ 底层用 char[] 存储字符数据。从 Java9 开始,底层使用 byte[] 存储字符数据 🌿 字符串的底层是 char[] ,但是 char 数组和字符串不能等价。 char 数组是 char 数组,字符串是字符串。 🌿 C 语言中是可以把 char 数组 和字符串等价的 ✏️

    2023年04月08日
    浏览(43)
  • StringBuilder > StringBuffer > String

    StringBuilder , StringBuffer 和 String 都是 Java 中用于操作字符串的类,但它们在性能、线程安全性和用途上有一些区别。 1. String: String 类是 Java 中的不可变字符串类。一旦创建了字符串对象,它的值就不能被修改。每次对字符串进行操作(连接、替换等),都会创建一个新的字符

    2024年02月11日
    浏览(33)
  • String、StringBuffer、StringBuilder 的区别?

    一. 介绍 String、StringBuffer、StringBuilder:    前言: String、StringBuffer、StringBuilder 均在java.lang包下; String:  在Java中,String是一个特殊的引用类型,用于表示文本字符串。它提供了许多方法来操作和处理字符串,比如连接、截取、查找、替换等。 String类内部使用字符数组(ch

    2024年02月13日
    浏览(38)
  • String、StringBuffer和StringBuilder的详解

    目录 一、String讲解 1.String(String字符串常量) 2.String 拼接方式与性能的影响 二、StringBuffer 和 StringBuilder 讲解 1.StringBuffer 和 StringBuilder 使用场景:(StringBuffer、StringBuilder字符串变量) 2.StringBuffer的使用 3.StringBuffer与StringBuilder的线程安全性问题  4.synchronized的含义:(线程同步机制

    2024年02月12日
    浏览(26)
  • String与StringBuffer/StringBuilder有什么区别?

    可变性: String 使用final修饰数组,所以String是不可变的; StringBuilder与StringBuffer都继承自AbstactStringBuilder父类,在AbstrctStringBuilder中使用char[]value字符数组保存字符串,但是没有用final修饰,所以StringBuilder与StringBuffer都是可变的; 么次对String类型进行修改时,都会

    2024年02月12日
    浏览(35)
  • String、StringBuilder和StringBuffer之间的区别是什么?

    String 、 StringBuilder 和 StringBuffer 在Java中都用于处理文本数据,但它们之间存在一些关键区别,主要体现在可变性、线程安全性和性能上。 String 不可变性 : String 类的对象是不可变的。这意味着一旦 String 对象被创建,它所包含的字符序列就不能被改变。每次对字符串进行修

    2024年02月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包