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

    1. String 为字符串常量,StringBuffer、StringBuilder为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。(他们三个都是不可变类)
      //代码来自JDK源码
    //String
     public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];
        }
    
        //JDK中StringBuffer和StringBuilder都继承AbstractStringBuilder
        abstract class AbstractStringBuilder implements Appendable, CharSequence {
        /**
         * The value is used for character storage.
         */
        char[] value;
    }
    
    
    1. 速度String<StringBuffer<StringBuilder
      以下代码为例说明String字符串相加的JVM处理,进而说明其速度为什么慢。
      运行以下代码先输出abc后输出abcde,好像str被更改了,其实jvm在处理的时候是又实例化一个String对象然后把abcde放进新的对象,然后把str指向新的对象,最后把原来的存放abc的对象空间释放。
      而StringBuffer和StringBuilder在对字符串修改时不需要另外再实例化对象,所以他们来个速度比String快。但是StringBuilder为啥比StringBuffer快呢 ?继续往下看
     String str="abc";
     System.out.println(str);
      str=str+"de";
     System.out.println(str);
    
    1. StringBuffer线程安全,StringBuilder线程不安全
      由JDK源码可知StringBuffer方法有synchronized关键词修饰 是线程安全的。
      StringBuilder 没有加锁所以是线程不安全的。
      由于StringBuffer加锁开销导致他的速度比StringBuilder慢。
    //StringBuffer
     @Override
        public synchronized StringBuffer append(String str) {
            toStringCache = null;
            super.append(str);
            return this;
        }
    
    //StringBuilder
     @Override
        public StringBuilder append(String str) {
            super.append(str);
            return this;
        }
    
  • 相关阅读:
    第四周学习总结
    第三周学习总结
    第二周学习总结
    第一周学习总结
    解决pycharm中导入Wordcloud库的时候失败的问题
    开发报告5
    TypeError: _cache_value_encoder: not supported type: <class 'numpy.ndarray'>
    pandas中的rename_axis用法
    金叉死叉量化交易--matplotlib绘图案例
    一、EDA分析
  • 原文地址:https://www.cnblogs.com/jiaorenzhan/p/10623948.html
Copyright © 2011-2022 走看看