zoukankan      html  css  js  c++  java
  • String, StringBuffer,StringBuilder的区别

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

    • String 字符串常量 
    • StringBuffer 字符串变量(线程安全) 
    • StringBuilder 字符串变量(非线程安全)
    • String < StringBuffer < StringBuilder

    1.可变与不可变

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

      private final char value[];

          String 为不可变对象,一旦被创建,就不能修改它的值. .对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.

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

    char[] value;

         StringBuffer:是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象 , 它只能通过构造函数来建立,  

      如:StringBuffer sb = new StringBuffer();

      不能通过赋值符号对他进行付值. , 如 sb = "welcome to here!";//error 
      对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中赋值的时候可以通过它的append方法. sb.append("hello");

    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。

    4、效率比较

      String < StringBuffer < StringBuilder,但是在String S1 =“This is only a”+“simple”+“test”时,String效率最高。

  • 相关阅读:
    《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
    .NET Core中文分词组件jieba.NET Core
    .NET Core 2.0及.NET Standard 2.0
    Visual Studio 2017 通过SSH 调试Linux 上.NET Core
    Visual Studio 2017 ASP.NET Core开发
    Visual Studio 2017正式版离线安装及介绍
    在.NET Core 上运行的 WordPress
    IT人员如何开好站立会议
    puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
    puppeteer(一)环境搭建——新Web自动化工具(同selenium)
  • 原文地址:https://www.cnblogs.com/zeze/p/6611993.html
Copyright © 2011-2022 走看看