• Java中的String,StringBuilder,StringBuffer的区别


    String,StringBuilder,StringBuffer这三个类在Java都能用来操作字符串,但是在性能与线程安全上稍有差异,需要根据使用的业务场景加以注意。以下为差异的详述:

    一、String:

      1.查看源码发现String类拥有的成员变量value为final,因此一旦创建就无法改变其对象。

            每次操作String字符串时都是会创建一个新的对象。

    1 public final class String
    2     implements java.io.Serializable, Comparable<String>, CharSequence {
    3     /** The value is used for character storage. */
    4     private final char value[]; //value 是一个数组,且是final的,不可修改
    5 
    6     /** Cache the hash code for the string */
    7     private int hash; // Default to 0
    8 
    9 }

    二、StringBuilder & StringBuffer:

      1.查看源码发现StringBuilder & StringBuffer对字符串操作,不会创建新的对象,只是修改成员变量value对象

      的值。因此操作字符串 StringBuilder & StringBuffer 会比 String 性能高。

     1 /* 1 */
     2 public final class StringBuilder
     3     extends AbstractStringBuilder
     4     implements java.io.Serializable, CharSequence{
     5   /*累计字符串的方法 不会创建行的对象,直接修改value对象*/
     6   @Override
     7     public StringBuilder append(String str) {
     8         super.append(str);
     9         return this;
    10     }      
    11 }
    12 
    13 /* 2 */
    14 abstract class AbstractStringBuilder implements Appendable, CharSequence {
    15    
    16    /*value 引用一个数组 */  
    17     char[] value;
    18 
    19     int count;
    20     
    21     /*累加字符串的方法 */
    22    @Override
    23     public AbstractStringBuilder append(CharSequence s, int start, int end) {
    24         if (s == null)
    25             s = "null";
    26         if ((start < 0) || (start > end) || (end > s.length()))
    27             throw new IndexOutOfBoundsException(
    28                 "start " + start + ", end " + end + ", s.length() "
    29                 + s.length());
    30         int len = end - start;
    31         ensureCapacityInternal(count + len);
    32         for (int i = start, j = count; i < end; i++, j++)
    33             value[j] = s.charAt(i);
    34         count += len;
    35         return this;
    36     }
    37     
    38    /*修改 value*/
    39    private void ensureCapacityInternal(int minimumCapacity) {
    40         // overflow-conscious code
    41         if (minimumCapacity - value.length > 0) {
    42             value = Arrays.copyOf(value,
    43                     newCapacity(minimumCapacity));
    44         }
    45     }
    46 
    47 }

      2.StringBuilder & StringBuffer 的提供的方法基本一致,但是通过查看源码发现StringBuffer提供的方法都是线程安全的。

     1  public final class StringBuffer
     2     extends AbstractStringBuilder
     3     implements java.io.Serializable, CharSequence
     4 {   ...
     5     @Override
     6     public synchronized StringBuffer append(Object obj) {
     7         toStringCache = null;
     8         super.append(String.valueOf(obj));
     9         return this;
    10     }
    11 }

    三、总结:

           1.String:适用于少量操作字符串的情况

      2.StringBuilder:适用于单线程下大量操作字符串的情况

      3.StringBuffer:适用于多线程下大量操作字符串的情况

  • 相关阅读:
    图形设计 X11
    软件安装 RPM SRPM YUM
    如何将excel表格中的纯数字删掉 空白行,然后删除
    考试机
    程序编译与运行
    基础设定与备份策略
    开机流程 模块管理 Loader
    让所有Excel数据格全部乘 某个数
    转:JDK1.8-Stream()使用详解
    转:IK分词原理
  • 原文地址:https://www.cnblogs.com/haiyangwu/p/10310380.html
Copyright © 2020-2023  润新知