String StringBuffer与StringBuilder之间的区别

   以下内容来自网络内容整理,欢迎批评指正。
  在java中,jdk很好的封装了关于字符串的操作。三个类
Java.lang.
String 、
Java.lang.
StringBuffer 、
Java.lang.
StringBuilder,三个类基本上满足了在不同情景下使用字符串的需求。

   1、

String:字符串常量,即不可改变的对象。

可以多线程之间访问,因为只读不写)

        StringBuffer:字符串变量,(多线程安全的字符串类型)

        StringBuilder:字符串变量

   在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,之前对象s并没有变化,所以经常对String类型的字符进行操作时,生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的GC 就会开始工作,那速度是一定会相当慢的。

   而StringBuffer与StringBuilder是字符串变量,是可改变的对象,当用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作,速度快。

特例:

此时生str对象的速度很快,StringBuffer不占优势。这是因为对于jvm来说:

就是
但是字符串是来自另外的String对象的话,速度就没那么快,如下:
这时JVM的操作时一样的

  2、StringBuilder与 StringBuffer的区别:
 

StringBuffer:线程安全的  速度慢
StringBuilder:线程非安全的  速度快
    当字符串缓冲流被多个线程使用时,JVM不能保证StringBuilder的操作是安全的,而StringBuffer是可以正确操作的。但大多数情况下是在单线程下进行操作,所以常用StringBuilder而不用StringBuffer,就是速度的原因。
    对于三者使用的总结:
     1.如果要操作少量的数据用 = String
     2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder 
     
3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer 
    原因: 因为堆的好处是可以动态的增加空间,劣势就是分配新的空间消耗很大 ,
需要对一个字符串不断的修改的话,效率是非常的低的,

3、String类型
   一般情况下可以以下面两种方式创建一个String对象 
String str1 = “abcd”; 使用字符串常量自动创建String实例。
String str2 = new String(“abcd”); 通过String 对象或字符串常量传递给构造方法。
public String (char value[],int offset, int count);
   将字符数组一部分赋给String 构造方法,offset 为起始下表, count 为数组长度。
   前两种方式的区别:这和java的内存管理有关,因为string创建之后是不可变,所以第一种创建的字符串放在栈里(常量池中:用来保存在编译阶段确定好了大小的数据)。 具体流程就是:编译器首先检查常量池,看看有没有一个“string”,如果没有则创建。如果有的话,则则直接把str1指向那个位置。 
  第二种创建字符串的方法是通过new关键字,还是java的内存分配,java会将new的对象放在堆中,这一部分对象是在运行时创建的对象。所以每一次new的时候,都会创建不同的对象,即便是堆中已经有了一个一模一样的。

解释:
    ①两个字符串的内容完全相同,因而指向常量池中的同一个区域  
    ②每一次new都会创建一个新的对象  
    ③注意==比较的是地址,不仅仅是内容  
    ④intern方法,这个方法会返回一个字符串在常量池中的地址,如果常量池中有与str3内容相同的string则返回那个地址,如果没有,则在常量池中创建一个string后再返回。实际上,str3现在指向了str1的地址 。

4、StringBuffer类型
   
StringBuffer 是一个线程安全的,是多线程访问的可靠保证。同时是可变的,也就是说要操作一个经常变化的字符串,可以使用这个类,基本的方法就是
append和insert方法。
  查看jdk源代码就会发现,StringBuffer就是在各个方法上加上了关键字syncronized。
  StringBuffer 线程安全的可变字符序列。类似于 String 的字符串缓冲区,但不能修改。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
   每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
    StringBuffer类可以用于创建String类,StringBuffer建立后可以用toString()方法将其转换为String类,以后,就可以使用String 类方法来操作。


5、StringBuilder类型
    StringBuffer是线程同步的,但是当使用一个线程,同步会引起效率问题,StringBuilder就是StringBuffer的非线程同步的版本,二者的方法差不多,只是
StringBuffer
线程安全(适用于多线程),
StringBuilder
没有线程安全(适用于单线程)。 
  StringBuilder也是一个可变的字符串对象,他与StringBuffer不同之处就在于它是线程
不安全的,基于这点,它的速度一般都比StringBuffer快。StringBuider的主要操作也是append与insert方法。这两个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。

6、当进行字符拼接时,使用StringBuffer类而非String类的底层解释
    
    程序运行内部发生了哪些事情:
    经编译后程序的bytecode(字节码)展示出了实质: 在用String类对象直接拼接时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将"hi,"和"let's go."创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为一个String.可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的str了,这个引用的名称没变,但它指向了新的String对象。
   而如果直接使用StringBuffer类,程序将只产生两个对象:最初的StringBuffer和拼接时的String("
let's go
."),不再需要创建临时的StringBuffer类对象而后还得将其转换String对象。
可见,当字符串要被循环拼接若干段时,用String类直接操作会减少额外的系统开销(临时StringBuffer对象,强制类型转换)。
   StringBuffer类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多。因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。




1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;、本 3项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看ReadmE.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、资 1源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READMe.m文件(如d有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值