zoukankan      html  css  js  c++  java
  • Java基础(40)String、StringBuilder和StringBuffer的区别(TODO)

      一、String

      String实现了Serializable接口、Comparable<String>接口和CharSequence接口,并且使用final char value[]不可变字符数组保存字符串。

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
      ...
      }

      二、AbstractStringBuilder

      AbstractStringBuilder抽象类实现了Appendable接口、CharSequence接口,并且使用char[] value数组保存字符串。

    abstract class AbstractStringBuilder implements Appendable, CharSequence {
         * The value is used for character storage.
        char[] value;
      }

      三、StringBuilder

      StringBuilder继承了AbstractStringBuilder抽象类并且实现了Serializable接口、CharSequence接口。

    public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{}

      四、StringBuffer

      StringBuffer也继承了AbstractStringBuilder抽象类并且实现了Serializable接口、CharSequence接口

     public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{}

      五、区别

      1.可变性  

      String不可变,因为是用final字符数组保存字符串,而StringBuilder和StringBuffer可变,因为是用普通字符数组保存字符串

      2.线程安全性

      StringBuilder和StringBuffer都继承了AbstractStringBuilder的方法,例如

      AbstractStringBuilder中的方法是:

        public int indexOf(String str, int fromIndex) {
            return String.indexOf(value, 0, count, str, fromIndex);
        }

      而StringBuilder中同样的方法表示为:

        @Override
        public int indexOf(String str, int fromIndex) {
            return super.indexOf(str, fromIndex);
        }

      而StringBuffer中同样的方法表示为:

        @Override
        public synchronized int indexOf(String str, int fromIndex) {
            return super.indexOf(str, fromIndex);
        }

      synchronized关键字修饰实例方法是作用于当前实例加锁,进入同步代码前要获得当前实例的锁。

      因此,StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

      3.速度比较

      

  • 相关阅读:
    Activiti系列——如何在eclipse中安装 Activiti Designer插件
    C语言 二维数组与指针笔记
    Ubuntu linux设置从当前目录下加载动态库so文件
    Ubuntu14.04安装nfs服务器
    Ubuntu14.04 搭建FTP服务器
    Linux备忘命令
    Java实现对xml文件的增删改查
    Java利用jacob实现打印Excel文件
    git操作列表
    swiper 窗口宽度变化,页面宽度高度变化 导致自动滑动 解决方案
  • 原文地址:https://www.cnblogs.com/BigJunOba/p/9621119.html
Copyright © 2011-2022 走看看