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>,让每一个线程都有一个StringBuilder,兼顾线程安全和性能的方案

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐