关于String、StringBuffer、StringBuilder的区别
来源:互联网 发布:手机录制gif软件 编辑:程序博客网 时间:2024/05/16 00:39
根据JDK中java.lang.String的源码进行分析,从中可以得出String类型的对象不可变的原因,大致上有如下两个:1、java.lang.String类型在实现时,其内部成员变量全部使用final来修饰,保证成员变量的引用值只能通过构造函数来修改;
如图,为String内部源码;也就是说,当用String = str + "1234567";来动态修改字符串时,由于String被final修饰,当修改该字符串时,会重新new 一个对象,将原String的值赋给新的对象。
2、java.lang.String类型在实现时,在外部可能修改其内部存储值的函数实现中,返回时一律构造新的String对象或者新的byte数组或者char数组;假如通过String类型的toCharArray方法可以直接访问String类型内部定义的char数组,那么即便String类型内部的char数组使用了final来修饰,也仅仅保证这个成员变量的引用不可变,而无法保证引用指向的内存区域不可变。由上述两点,保证外部不可能修改java.lang.String类型对象的内部属性,从而保证String对象是不可变的。3.StringBuffer和StringBuilder的共同点:1、都是可变对象,对象内的字符缓存会随着拼接操作而动态扩展;2、用来完成字符串拼接操作;3、构造时传入内部缓存大小时,可以降低缓存扩展的次数,明显提升字符串拼接操作的效率;如图,看一下StringBuffer源码:StringBuilder的源码如图StringBuffer和StringBuilder的区别:1、StringBuilder的方法都是线程不安全的,从另外一个角度讲,StringBuilder类型的对象在做字符串拼接操作时,由于少了线程同步的操作,执行效率上有很大提升;2、StringBuffer的方法都加上了synchronized关键字,因而在一定的场景下,StringBuffer类型的对象都是线程安全的,但在执行效率上,由于多了线程同步的操作,因而会有少许的损失;在大多数场景下,字符串拼接操作都是不需要考虑多线程环境下对结果的影响的,因而使用StringBuilder类型可以提升代码的执行效率。在多个线程的代码中共享同一个StringBuffer类型的对象时,需要关注synchronized关键字对最终结果的影响。由于StringBuffer类的实现中,仅仅对每个方法使用了synchronized修饰,这只能保证在多线程场景下,访问StringBuffer对象的同一个方法时可以保证最终结果的一致性,假如一个线程访问A方法,另外一个线程方法B方法,则由于加锁对象的不同,可能会出现不一致的现象
0 0
- Java关于String、StringBuffer、StringBuilder的区别
- 关于String和StringBuilder、StringBuffer的区别?
- 关于String、StringBuffer、StringBuilder的区别
- 关于String、StringBuffer、StringBuilder之间的区别
- 关于String StringBuilder StringBuffer的区别
- String,StringBuffer,StringBuilder的区别
- String StringBuffer StringBuilder的区别
- String, StringBuffer, StringBuilder的区别?
- String,StringBuffer, StringBuilder 的区别
- String,StringBuffer,StringBuilder的区别
- String , StringBuffer, StringBuilder的区别
- String 、 StringBuffer 、StringBuilder 的区别
- String StringBuffer StringBuilder的区别
- String、StringBuffer、StringBuilder的区别
- String, StringBuffer, StringBuilder的区别
- String StringBuffer StringBuilder的区别
- string、stringbuffer、stringbuilder的区别
- String、StringBuffer 、StringBuilder 的区别
- sed 语法深入
- git使用
- poj 2546 Circular Area
- SQL UNION 和 UNION ALL 操作符的区别
- 两村共饮一井水
- 关于String、StringBuffer、StringBuilder的区别
- FFmpeg参数说明
- Android NDK教程<二>-- Android.mk语法
- UIScrollView
- HDU 4451 简单搭配问题
- 项目结构图
- DateFormat类和SimpleDateFormat类
- jqxGrid 之 Default Functionality
- [译]RecyclerView.ViewHolder - getLayoutPosition vs getAdapterPosition