深入剖析java中String、StringBuffer、StringBuilder的区别

 更新时间:2016年05月15日 15:35:31   投稿:jingxian  
下面小编就为大家带来一篇深入剖析java中String、StringBuffer、StringBuilder的区别。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。

1. 可变与不可变

String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。

private final char value[];

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

char[] value;

2. 是否多线程安全

String中的对象是不可变的,也就可以理解为常量,显然线程安全。

AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:

public synchronized StringBuffer reverse() {
  super.reverse();
  return this;
}

public int indexOf(String str) {
  return indexOf(str, 0);    //存在 public synchronized int indexOf(String str, int fromIndex) 方法
}

StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

3. StringBuilder与StringBuffer共同点

StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。

抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。

StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。

最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

以上这篇深入剖析java中String、StringBuffer、StringBuilder的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot初始化启动报错Error creating bean with name 'dataSource' defined in class path resource

    Springboot初始化启动报错Error creating bean with name 'da

    这篇文章主要为大家介绍了Springboot初始化启动报Error creating bean with name 'dataSource' defined in class path resource解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • java web实现邮箱发送功能

    java web实现邮箱发送功能

    这篇文章主要为大家详细介绍了java web实现邮箱发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Java实现一键获取Mysql所有表字段设计和建表语句的工具类

    Java实现一键获取Mysql所有表字段设计和建表语句的工具类

    这篇文章主要为大家详细介绍了如何利用Java编写一个工具类,可以实现一键获取Mysql所有表字段设计和建表语句,感兴趣的小伙伴可以了解一下
    2023-05-05
  • spring boot simple类型cache使用详解

    spring boot simple类型cache使用详解

    这篇文章主要介绍了spring boot simple类型cache使用,这里用的不是 redis 的缓存,simple 的缓存默认用的是java的ConcurrentHashMap, 单纯的simple缓存,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • 什么是Java自旋锁

    什么是Java自旋锁

    这篇文章主要介绍了什么是Java自旋锁,在有些场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的花费可能会让系统得不偿失,下面来了解具体内容介绍吧
    2022-01-01
  • java图片验证码生成教程详解

    java图片验证码生成教程详解

    这篇文章主要为大家详细介绍了java图片验证码生成教程,从简单到复杂,从本地到前后台,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Jmeter如何添加循环控制器

    Jmeter如何添加循环控制器

    这篇文章主要介绍了Jmeter如何添加循环控制器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • springboot下添加日志模块和设置日志文件输出的方法

    springboot下添加日志模块和设置日志文件输出的方法

    日志的使用将通过SLF4J来使用,SLF4J是一个为Java应用提供简单日志记录的接口,在Spring框架中,SLF4J常常用于处理框架本身以及应用程序的日志记录,本文给大家介绍springboot下添加日志模块和设置日志文件输出的相关知识,感兴趣的朋友一起看看吧
    2023-12-12
  • Javaweb获取表单数据的多种方式

    Javaweb获取表单数据的多种方式

    这篇文章主要为大家详细介绍了Javaweb获取表单数据的多种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Java中Scanner用法实例解析

    Java中Scanner用法实例解析

    Scanner 指的是java.util包下的Scanner类,可以接收控制台输入的数据,下面这篇文章主要给大家介绍了关于Java中Scanner用法实例的相关资料,文中通过实例代码以及图文介绍的非常详细,需要的朋友可以参考下
    2022-11-11

最新评论