String-StringBuffer-StringBuilder区别


妈咪妈咪哄

只是介绍了三者概念和区别,三者详细方法可看参考Java API文档,如果对概念比较清晰可直接拉到最后!

一、String介绍

String

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现,字面量也是对象。

String底层源码中是存储的char数组(jdk1.8及之前版本,jdk1.9之后底层以byte数组存储),但不管是哪种数据类型数组,在底层源码中都是final关键字修饰的,也就是说只能赋值一次,所以String类创建的变量每次赋值运算会创建新的String对象,由于String提供的大多操作字符串方法返回的都是字符串(一个新对象)。如:

在这里插入图片描述

如上,String对字符串的操作常常产生新对象,即浪费时间,也浪费空间。详细存储结构参考:
String创建对象的存储结构

二、StringBuffer和StringBuilder介绍

1、StringBuffer

​ 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

2、StringBuilder

​ 一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

3、源码分析

  • String Buffer和StringBuilder都是final修饰,都不能被继承。

  • StringBuffer和StringBuilder都是继承于抽象类AbstractStringBuilder,该抽象类将基础的字符串操作方法都已书写,两个子类只需要实现自己的特色功能,基础操作方法调用父类的。

  • StringBuffer和StringBuilder存储字符串也是以char数组(或byte数组),但都是继承的父类AbstractStringBuilder中的属性,且该属性未被final修饰,所以StringBuffer和StringBuilder可以对已保存字符串对象进行操作而不新建对象。

  • 两者方法基本相同,只是StringBuilder没有做同步处理。

  • 两者在创建对象时都可以设置缓存大小,其实就是创建保存字符串的数组长度,默认是16字符。如:

    StringBuilder sb = new StringBuilder();
    //获取缓存容量方法
    int i = sb.capacity(); 		//i = 16
    
    StringBuilder sb = new StringBuilder("abc");
    int i = sb.capacity(); 		//i = 16+3 = 19
    
    StringBuilder sb = new StringBuilder(34);
    int i = sb.capacity(); 		//i = 34
    

三、三者区别

StringStringBufferStringBuilder
概念String是不可变类,每次对字符串操作都生成新的对象,影响执行效率,浪费存储空间StringBuffer是可变类,对操作字符串方法进行了同步处理,对字符串操作不会产生新对象,每个对象都有一个对应的缓存区,当存储数据长度超出缓存区容量时会自动扩容。StringBuilder是可变类,未对操作字符串方法进行同步处理,对字符串操作不会产生新对象,当存储数据长度超出缓存区容量时会自动扩容。
线程安全安全。所有不可变类都是线程安全的安全不安全
适用情况只是定义,基本不操作字符串多线程时操作字符串单线程操作字符串
运行速度一般情况:String < StringBuffer < StringBuilder

(不可变类的意思是创建该类的实例后,该实例的属性是不可以改变的。Java提供的8个包装类和java.lang.String都是不可变类,当创建它们的实例后,其实例的属性不可变)
祝,变得更强!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值