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;
        }
    
  • 相关阅读:
    Quartz.Net 作业调度后台管理系统,基于Extjs
    [备份]EntityFramework
    WebMisSharp升级说明,最新版本1.6.0
    AllPay(欧付宝)支付接口集成
    Paypal Rest Api自定义物流地址(跳过填写物流地址)
    根据IP获取国家
    ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?
    Extjs4 DateTimeField,日期时间控件完美版
    IOS Swift 训练
    .Net集成PayPal的Demo
  • 原文地址:https://www.cnblogs.com/jiaorenzhan/p/10623948.html
Copyright © 2011-2022 走看看