• Java基础知识(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对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:

    复制代码
    1 public synchronized StringBuffer reverse() {
    2     super.reverse();
    3     return this;
    4 }
    5 
    6 public int indexOf(String str) {
    7     return indexOf(str, 0);        //存在 public synchronized int indexOf(String str, int fromIndex) 方法
    8 }
    复制代码

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

     3.StringBuilder与StringBuffer共同点

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

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

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

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

    1、String,StingBuffer,StringBuilder是字符串变量还是常量?

    String                 ---->     字符串常量
    StringBuffer      ---->     字符串变量(线程安全的)
    StringBuilder    ---->     字符串变量(非线程安全的)
    ---------------------

    2、String,StingBuffer,StringBuilder效率如何呢?
           从高到底的顺序依次是:StringBuilder  >  StingBuffer > String
           有上知道了String是字符串常量,所以他的效率自然而然是最低的。对于StringBuffer和StringBuilder它们属于变量,是可以改变的对象,每次对字符串的操作,实际上实在一个对象上操作,所以效率更高一些。StringBuffer是线程安全的,考虑到安全问题,相对他的性能会更低一点。由此知道了从效率的角度看,StringBuilder最高,其次是StringBuffer,最后是String字符串常量。

    总结:
           当多个线程使用字符串缓冲区时,使用StringBuffer保证正确的操作,如果是单线程的,建议使用StringBuiler效率更高一些。

    作者:mmd0308
    来源:CSDN
    原文:https://blog.csdn.net/mmd0308/article/details/73335568   https://www.cnblogs.com/xudong-bupt/p/3961159.html
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    SpringBoot自动装配源码
    对称加密、非对称加密、数字签名
    k8s部署mysql数据持久化
    docker部署 springboot 多模块项目+vue
    ES入门及安装软件
    prometheus入门介绍及相关组件、原理讲解
    流水线 Sonar 代码扫描
    postgresql数据库 查询表名、备注及字段、长度、是否可控、是否主键等信息
    Helm中Tiller镜像下载失败的解决办法
    程序员孔乙己
  • 原文地址:https://www.cnblogs.com/sxjblogs/p/9868081.html
Copyright © 2020-2023  润新知