一. 介绍 String、StringBuffer、StringBuilder:

   前言: String、StringBuffer、StringBuilder 均在java.lang包下;

    String: 在Java中,String是一个特殊的引用类型,用于表示文本字符串。它提供了许多方法来操作和处理字符串,比如连接、截取、查找、替换等。String类内部使用字符数组(char[])来存储字符串的内容,且value字段被final修饰,这意味着String对象一旦创建后,其值就不可改变。String对象的值存储在常量池中,每次修改操作都会创建一个新的字符串对象,并且如果常量池中已经存在相同内容的字符串,就会直接引用该字符串而不创建新对象。

    StringBuffer:Java中的一个可变字符串类,用于处理字符串。它可以被修改,因此适合在需要频繁更改字符串内容的情况下使用。StringBuffer提供了许多方法用于插入、删除和修改字符串,并且支持线程安全操作。与String类不同,StringBuffer对象可以在已有的字符串基础上进行操作,且地址值不会改变;StringBuffer 类是可变的,它不会在常量池中创建新的常量。当你使用 StringBuffer 修改一个字符串时,它会在堆内存中创建一个新的字符串对象,并且在需要的时候调整其容量。

    StringBuilder:与StringBuffer类似,它允许在已有字符串的基础上进行修改、添加和删除操作,而不需要创建新的字符串对象。通过使用StringBuilder,可以高效地进行字符串拼接、插入、替换等操作,特别适用于频繁修改字符串内容的场景,每次修改只是对自身做出修改。StringBuilder具有较高的性能和效率,并且是线程不安全的,适用于单线程环境下的字符串处理。

二. 区别:

  1. 不可变性:

  • String类是不可变的,一旦创建就不能被修改。任何对字符串的操作都会创建一个新的字符串对象。
  • StringBuffer和StringBuilder类是可变的,可以在原始字符串上进行修改,无需创建新的对象。

  2. 线程安全性:

  • String类是线程安全的,因为它的方法在内部使用了同步机制,适用于多线程环境。
  • StringBuffer类是线程安全的,所有的方法都使用了同步锁,可以在多线程环境中使用。
  • StringBuilder类是非线程安全的,它的方法没有使用同步锁,适用于单线程环境。

  3. 性能:

  • 由于String类的不可变性,每次进行拼接、替换等操作时都会创建新的对象,对性能有一定影响。
  • StringBuffer类是可变的,适用于频繁操作字符串的情况,但是由于使用了线程安全同步机制,相对较慢。
  • StringBuilder类是可变的,适用于单线程下频繁操作字符串的情况,在性能上优于StringBuffer。

  综上所述,如果你需要进行频繁的字符串拼接、替换等操作,并且在多线程环境下使用,应该选择StringBuffer类。如果在单线程环境下进行字符串操作,可以选择StringBuilder类以获得更好的性能。而如果你不需要修改字符串,只是进行简单的字符串操作,那么使用String类即可。

三. 代码展示

 不可变性区别展示:

    public static void main(String[] args) {
// String
String str = "Hello";
System.out.println(str.hashCode());
String str1 = str + "word";
System.out.println(str1.hashCode()); // StringBuilder
StringBuilder sb = new StringBuilder("Hello");
System.out.println(sb.hashCode());
StringBuilder sb1 = sb.append("word");
System.out.println(sb1.hashCode()); // StringBuffer
StringBuffer sbf = new StringBuffer("Hello");
System.out.println(sbf.hashCode());
StringBuffer sbf1 = sbf.append("word");
System.out.println(sbf1.hashCode());
}
输出结果:
69609650
-1093253444
23934342
23934342
22307196
22307196

  可以看到String在改变字符串后,HashCode发生改变,而StringBuffer、StringBuilder 没有变化。

四. 总结

  • String:不可变的字符串,线程安全,适合在多线程环境下使用,适用于字符串内容不经常改变的情况,操作少量的数据。
  • StringBuffer:可变的字符串,线程安全,适合在多线程环境下使用,适用于频繁进行字符串操作的情况。
  • StringBuilder:可变的字符串,非线程安全,适合在单线程环境下使用,适用于频繁进行字符串操作的情况。

五. 扩展

  1. String 源码中注释

 * Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* Because String objects are immutable they can be shared.

   *字符串是常量;它们的值在创建后不能更改,因为String对象是不可变的,所以它们可以共享。

public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[]; /** Cache the hash code for the string */
private int hash; // Default to 0
}

   private final char value[];  底层是字符数组实现,该值是使用final修饰,创建后不能改变。

  2. StringBuffer 源码中注释

 * A thread-safe, mutable sequence of characters.
* A string buffer is like a {@link String}, but can be modified. * The principal operations on a {@code StringBuffer} are the
* {@code append} and {@code insert} methods, which are
* overloaded so as to accept data of any type. * Whenever an operation occurs involving a source sequence (such as
* appending or inserting from a source sequence), this class synchronizes
* only on the string buffer performing the operation, not on the source.

  * 线程安全的可变字符序列,字符串缓冲区类似于String,但是可以修改。

  * 主要操作是通过append()、insert() 它们是重载的,以便接受任何类型的数据。

  * 每当涉及到源数据的操作发生改变时,(例如从源序列追加或插入)此类进行同步仅在执行操作的字符串缓冲区上,而不是在源数据上。

    @Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
} @Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}

   StringBuffer 在插入或修改的时候 都会使用synchronized() 确保线程安全性。

  3. StringBuilder 源码注释

 * A mutable sequence of characters.  This class provides an API compatible
* with {@code StringBuffer}, but with no guarantee of synchronization.
* This class is designed for use as a drop-in replacement for
* {@code StringBuffer} in places where the string buffer was being
* used by a single thread (as is generally the case). Where possible,
* it is recommended that this class be used in preference to
* {@code StringBuffer} as it will be faster under most implementations. * Instances of {@code StringBuilder} are not safe for
* use by multiple threads. If such synchronization is required then it is
* recommended that {@link java.lang.StringBuffer} be used.

  * 可变的字符串,此类提供与StringBuffer兼容的API,但不保证同步。这个类通常情况下用在字符串缓冲区被单个线程使用的地方,作为StringBuffer的替代品。建议优先使用此类而不是StringBuffer,因为在大多数实现中它会更快。

   * StringBuilder的实例对于多个线程使用是不安全的。如果需要同步,则建议使用StringBuffer

    @Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
} @Override
public StringBuilder append(String str) {
super.append(str);
return this;
}

  如果需要线程安全同步,建议使用StringBuffer类。

(๑′ᴗ‵๑) 完!

String、StringBuffer、StringBuilder 的区别?的更多相关文章

  1. String,StringBuffer,StringBuilder的区别

    public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...

  2. [置顶] String StringBuffer StringBuilder的区别剖析

    这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...

  3. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

  4. Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?

    Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...

  5. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  6. 深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)

    String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...

  7. Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用

    Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...

  8. 在JAVA中,String,Stringbuffer,StringBuilder 的区别

    首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String  不是线程安全的,这意味着在不同线程共享一个String ...

  9. String,StringBuffer,StringBuilder三者区别

    String:每次改变,String都会重新构造,内存指针都会改变 StringBuffer:主要用在全局变量中 StringBuilder:在线程内完成字符拼接,因为线程是不安全的,所以完成后可以丢 ...

  10. 从源码看String,StringBuffer,StringBuilder的区别

    前言 看了一篇文章,大概是讲面试中的java基础的,有如题这么个面试题.我又翻了一些文章看了下,然后去看源码.看一下源码大概能更加了解一些. String String类是final的,表示不可被继承 ...

随机推荐

  1. 解决ffmpeg源码不能编译ffplay问题

    虽然不是很大问题,还是记录一下,避免以后忘记!!! 总共两个原因影响了源码编译不能生成ffplay可执行文件,如下: 1.系统中没有安装SDL,直接去官网下载SDL源码编译安装http://www.l ...

  2. 希望所有计算机学生能看到这篇c语言教程

    大部分程序员走入编程世界第一个学习的语言就是C语言. 作为一门古老的编程语言,c语言拥有48年的发展历程. 为什么要学习 C语言? C语言是学习计算机程序设计语言的入门语言.最全面的编程面试网站 C语 ...

  3. Flutter 如何将代码显示到界面上

    前言 如何优雅的将项目中的代码,亦或是你的demo代码展示到界面上?本文对使用简单.便于维护且通用的解决方案,进行相关的对比和探究 为了节省大家的时间,把最终解决方案的相关接入和用法写在前面 预览代码 ...

  4. 【Redis】-使用Lua脚本解决多线程下的超卖问题以及为什么?

    一.多线程下引起的超卖问题呈现1.1.我先初始化库存数量为1.订单数量为0 1.2.开启3个线程去执行业务 业务为:判断如果说库存数量大于0,则库存减1,订单数量加1 结果为:库存为-2,订单数量为3 ...

  5. abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之下(六十四)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  6. 2023-04-19:给定一个非负数组arr 任何两个数差值的绝对值,如果arr中没有,都要加入到arr里 然后新的arr继续,任何两个数差值的绝对值,如果arr中没有,都要加入到arr里 一直到ar

    2023-04-19:给定一个非负数组arr 任何两个数差值的绝对值,如果arr中没有,都要加入到arr里 然后新的arr继续,任何两个数差值的绝对值,如果arr中没有,都要加入到arr里 一直到ar ...

  7. 2023-01-03:超过5名学生的课。编写一个SQL查询来报告 至少有5个学生 的所有班级,返回结果不限顺序。请问sql语句如何写? +---------+ | class | +-----

    2023-01-03:超过5名学生的课.编写一个SQL查询来报告 至少有5个学生 的所有班级,返回结果不限顺序.请问sql语句如何写? ±--------+ | class | ±--------+ ...

  8. 2022-08-21:以下go语言代码输出什么?A:0;B:panic;C:不知道。 package main var n = -99 func main() { m := make(map[

    2022-08-21:以下go语言代码输出什么?A:0:B:panic:C:不知道. package main var n = -99 func main() { m := make(map[stri ...

  9. AI DevOps | ChatGPT 与研发效能、效率提升(中)

    为啥 ChatGPT 突然火了? 简单概括就是:产品太过惊艳,体验超预期 之前人工智能发展多年,报道最多的也许就是曾经的李世石大战AlphaGo,现实中的特斯拉自动驾驶,还有波士顿动能放出的机器狗.对 ...

  10. TokenObtainPairView

    TokenObtainPairView是由Django REST framework的SimpleJWT库提供的视图.它用于生成JSON Web Token(JWT)