首页 > 其他分享 >String、StringBuffer和StringBuilder类的区别

String、StringBuffer和StringBuilder类的区别

时间:2023-08-02 11:25:46浏览次数:317  
标签:String StringBuffer 线程 CharSequence 字符串 StringBuilder

String

在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
String 类是不可变类,即当一个 String 变量被创建时,它将被存储在 Constant String Pool 中。
String之所以是不可变量,是因为,该类被 fainal 修饰
在 Java 中,每一个非易失的变量都是线程安全的,因此 String 变量也是线程安全的。String 变量是不能被两个线程同时拥有的,并且一旦被赋值便不能被修改。

String demo = "hello";
上面这个对象被存储在Constant String Pool当中,它的值不能被改变

demo = "Bye"; // 新的字符串变量"Bye"在Constant String Pool中被创建,但仍然被demo引用
而String "hello"仍然存在于Constant String Pool中,它的值并没有被重写,只不过并没有任何变量费用它

StringBuffer&StringBuilder

Java 提供了两个可变字符串类 StringBuffer 和 StringBuilder,中文翻译为“字符串缓冲区”。两者的对象都是创建在堆上,并且其值可以修改
因为两者继承的同一个接口AbstractStringBuilder,所以拥有相同的方法。
两者不同点在于StringBuffer上每个方法都是使用 synchronized 来修饰的,因此 StringBuffer 是线程安全的。而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用 StringBuilder 类。
StringBuffer、StringBuilder、String 中都实现了 CharSequence 接口。CharSequence 是一个定义字符串操作的接口,它只包括 length()、charAt(int index)、subSequence(int start, int end) 这几个 API。
StringBuffer、StringBuilder、String 对 CharSequence 接口的实现过程不一样,如下图所示:

可见,String 直接实现了 CharSequence 接口,StringBuilder 和 StringBuffer 都是可变的字符序列,它们都继承于 AbstractStringBuilder,实现了 CharSequence 接口。

总结

String 是 Java 中基础且重要的类,被声明为 final class,是不可变字符串。因为它的不可变性,所以拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。
StringBuffer 就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。它提供了 append 和 add 方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列。
在很多情况下我们的字符串拼接操作不需要线程安全,所以 StringBuilder 登场了。StringBuilder 是 JDK1.5 发布的,它和 StringBuffer 本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。

线程安全:

StringBuffer:线程安全
StringBuilder:线程不安全

速度:

一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。

使用环境:

操作少量的数据使用 String。
单线程操作大量数据使用 StringBuilder。
多线程操作大量数据使用 StringBuffer。

标签:String,StringBuffer,线程,CharSequence,字符串,StringBuilder
From: https://www.cnblogs.com/love-x/p/17599910.html

相关文章

  • 让nlohmann json支持std::wstring和嵌套结构的序列化与反序列化
    nlohmannjson是一个star很高的C++json解析库。要让nlohmannjson支持某个类型T,只要给这个类型T实现一个偏特化的structadl_serializer<T>即可。adl_serializer是这个库里面针对泛型T预定义的适配器。而嵌套结构,本身就支持的。使用预定义的宏NLOHMANN_DEFINE_TYPE_NON_INTRUSI......
  • MySQL字符串截取之substring_index
    substring_index(str,delim,count)str:要处理的字符串delim:分隔符count:计数 例子:str=www.wikibt.comsubstring_index(str,'.',1)结果是:wwwsubstring_index(str,'.',2)结果是:www.wikibt也就是说,如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容相......
  • C# HttpUtility.UrlEncode与 Uri.EscapeDataString区别
    相同点均是对url进行编码区别HttpUtility.UrlEncode会将空格转换为加号(+)Uri.EscapeDataString会将空格转换为%20适用场景HttpUtility.UrlEncode适用于url是查询参数Uri.EscapeDataString适用于url是作为文件路径使用......
  • Performance improvement techniques in String and StringBuffer
    ThistopicillustratestheperformanceimprovementtechniquesinStringandStringBufferwiththefollowingsections:OverviewofStringandStringBufferBetterwayofcreatingStringsOptimizationbyinterningStringsOptimizationtechniqueswhenConcatenati......
  • Educational Codeforces Round 152 (Rated for Div. 2) C. Binary String Copying
    题目大意为给定一个01字符串,给定m个区间,对于每个区间进行一次局部排序,求能得到的字符串种类数解法:因为字符串只包含0,1两个字符,我们观察可以得到,对于不同的区间来说如果排序后一样则说明肯定是某些位置在排序过程中无贡献,因此我们只需找出有贡献的位置即可对于一个区间[l,r],来说......
  • Java之String系列--String, StringBuffer, StringBuilder区别
    简介本文介绍Java的String,StringBuffer,StringBuilder的区别。项StringStringBufferStringBuffer线程安全性不可变。原因:value数组是final类型。因为不可变,所以每次操作生成新对象。因为不可变,所以每次操作生成新对象。原因:value数组是final类型。原因:其父类(AbstractStringBuilder......
  • 深入理解String
    深入理解StringString是Java中的一个类,是一个引用类型,用于表示字符串。它是不可变的(immutable),即一旦创建,其值就不能被修改。任何对String对象的修改操作都会创建一个新的String对象,而不是在原有字符串上进行修改。1.基本特点不可变性(Immutability):String对象一旦被创建,其值就不......
  • 《字符串篇》string类进行转换等操作
    C++中的string类用法简介原文链接:https://blog.csdn.net/liitdar/article/details/80498634概述string是C++标准库的一个重要的部分,主要用于字符串处理。c_str(),string转换为char*//方法一:使用c_str()方法,代码(stringsimple.cpp)如下:#include<string>#include<iostream......
  • 在 Eclipse Galileo 中更快地编写 Java 代码使用新的 toString() 生成器
    http://www.ibm.com/developerworks/cn/opensource/os-eclipse-codegen/这个代码生成技巧使用EclipseGalileo中的新特性。但是,您也可以使用在这里介绍的、旧版本Eclipse(如Ganymede)中的某些技巧(如生成getters和setters)。代码生成概述在日常使用的Eclipse特性中,Source菜单......
  • Binary String Copying
    Smiling&Weeping----第一次见你的时候,在我的心里已经炸成了烟花,需要用一生来打扫灰炉。题目链接:Problem-C-Codeforces题目大意不难,就是把每种......