关注

427的java基础八股(持续更新)

string,string buffer,string builder对比分析

目录

string,string buffer,string builder对比分析

 

本质是有三个区别,可变性,线程安全,性能

一、可变性

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,兼顾线程安全和性能的方案


本质是有三个区别,可变性,线程安全,性能


一、可变性

  • 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

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--