String、StringBuffer与StringBuilder之间区别

##String、StringBuffer与StringBuilder之间区别

这里写图片描述

它们三个都是通过字符数组char[]实现,而String在在字符数组前加了final修饰,使其长度不可变.


分析一:

记住一点,String类型字符串一旦被创建,就不能被更改。

 String str =new String("Hello");
 str=str+"word"; 

首先,创建值为"Hello"的str对象,后来对str对象追加字符串“word”,形成新的str对象,咦?不是说字符串一旦创建,不能更改吗?
其实,第一行代码是我们程序员自己创建了str对象,但当执行到第二行代码时,因为str值一旦创建不能更改,而我们代码中仍然使用str这个变量名,系统内部又重新创建新的str对象,(用str="值"方式进行赋值,在编译前就会在常量池中创建好)对之前的str对象进行覆盖,而之前的str对象将由GC进行回收。
那试想,如果进行频繁的字符串更改,对内存是无比的浪费啊,而StringBuffer和StringBuilder正好解决此问题,创建一个此类对象,可以在原内存中对对象进行更改,类似于普通类对于属性的操作。

借助jvm内存分析来深入理解String

jvm为了节省字符串重复创建而造成内存浪费,特别维互一个叫常量池的区域,当使用String str ="值"形式创建字符串对象时,就会去查找常量池中有无这个的值,如有,直接引用返回,如果没有系统会在常量池创建,然后引用返回。当使用String str =new String(“值”)时,既然有new关键词,势必会在进行堆中进行new对象3步骤(1.在堆中开辟内存空间 2,调用构造器初始化对象 3.返回引用地址值),每次new都会产生新的对象。

分析二:

Sring对象的更改(主要指new方式创建),会频繁的在堆中开垦内存,造成内存浪费,效率也会大大在降低,并且会有很多脏屁股让GC去帮忙擦。 StingBuffer和StingBuilder不同,一个对象只需要开辟一块内存空间,那效率就会高很多。
但要细说StringBuffer和StringBuilder,它们在效率上应该不会有大的区别,但因为StringBuffer内中的方法,很多用了synchronized锁,所有在多线程下,会稍慢于StringBuilder.

也正因为 StringBuffer类中方法中多代有synchronized,线程安全,所有在多线程环境下,我们要舍StringBuilder而用StringBuffer

使用总结:
(1)如果要操作少量的数据用 String;

(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;

(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。

另外,分享一下别人的文章,补充本文不足之处

https://www.cnblogs.com/Wilange/p/7570633.html
String,StringBuffer,StringBuilder的区别及其源码分析(一)

https://www.cnblogs.com/Wilange/p/7572125.html
String,StringBuffer,StringBuilder的区别及其源码分析(二)

End!
希望有帮助到你。


![这里写图片描述](https://img-blog.csdn.net/20180913210446716?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RlZF9jcw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值