string,string buffer,string builder对比分析
目录
string,string buffer,string builder对比分析
string的底层在java8之前是用final char[] value,在Java9之后用final byte[] value,所以是一旦创建就是不可变的
string是天然线程安全的,不可变对象,多线程下的修改操作只会创建新对象,不会对原对象造成影响
stringbuilder底层结构跟stringbuffer完全一致,但是所有修改方法都没有加锁,是非线程安全的
stringbuffer底层的所有修改方法是有synchronized修饰,synchronized对于非静态方法锁住的是实例本身,所以是线程安全的
stringbuilder > stringbuffer > string
stringbuffer因为有锁所以比stringbuilder要慢
线程安全的替代方案,ThreadLocal ,让每一个线程都有一个StringBuilder,兼顾线程安全和性能的方案
本质是有三个区别,可变性,线程安全,性能
一、可变性
-
string的底层在java8之前是用final char[] value,在Java9之后用final byte[] value,所以是一旦创建就是不可变的
-
stringbuffer和stringbuilder都是可变的,都继承AbstractStringBuilder,java8之前底层都是用的char[],在java9以后使用byte[],都是可变数组,可以直接修改内容,拼接、插入等都有对应方法。
二、线程安全
-
string是天然线程安全的,不可变对象,多线程下的修改操作只会创建新对象,不会对原对象造成影响
-
stringbuilder底层结构跟stringbuffer完全一致,但是所有修改方法都没有加锁,是非线程安全的
-
stringbuffer底层的所有修改方法是有synchronized修饰,synchronized对于非静态方法锁住的是实例本身,所以是线程安全的
三、性能
-
stringbuilder > stringbuffer > string
-
string每次拼接都会创建新对象,频繁触发gc性能最差
-
stringbuffer因为有锁所以比stringbuilder要慢
-
stringbuilder无锁最快
四、优化
-
都改为byte[],因为在存储单字节字符的时候能够节省内存
-
线程安全的替代方案,ThreadLocal<StringBuilder>,让每一个线程都有一个StringBuilder,兼顾线程安全和性能的方案
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2403_88932257/article/details/156564763



