美文网首页
String、StringBuilder与StringBuffe

String、StringBuilder与StringBuffe

作者: pianpianboy | 来源:发表于2018-03-13 22:37 被阅读0次

    String、StringBuilder与StringBuffer区别

    时间:20180313


    String:String/StringBuffer/StringBuilder三者的功能区别
      String作为最基础的引用数据类型,日常的开发中被大量的使用。基于不可变的特性,一旦被过度的使用,堆内存就会负荷不堪,甚至影响性能,为此,java设计者特意为String在方法区中开辟了字符串常量池,以减少String的实例创建,然后,在面对大数量的情况下,字符串常量池也未必能解决问题。因此AbstractStringBuilder应运而生,就是为了解决String频繁创建而引发的内存性能下降的问题。
    我们先要记住三者的特征:

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

    带着两个问题去看看String/StringBuffer/StringBuilder的区别

    • String VS AbstractStringBuilder
    • StringBuffer VS StringBuilder
    • String/StringBuffer/StringBuilder的使用策略

    String vs AbstractStringBuilder
    String: 不可变性:重新创建一个对象
    String代码的底层代码实现:

    • String类被final修饰,该类不能被继承
    • Value[] 属性被final修饰,引用不能被修改
    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
        /** The value is used for character storage. */
        private final char value[];   //
    
        /** Cache the hash code for the string */
        private int hash; // Default to 0```
        
        //other codes
    

    测试代码:

     String str = new String("a");
            str = str  + “b” ;
    
    内存模型

    AbStractStringBuilder:可变性
    AbstractStringBuilder底层代码实现:
    valu[]相当于String,没有final修饰

    public class TestString {
        //测试testString
        public static void testString() {
            long start = System.currentTimeMillis();
            String str = null;
            for(int i = 0; i < 20000; i++) {
                str = str + i + ","; 
            }
            System.out.println(System.currentTimeMillis()-start);
        }
        //测试testStringBuffer
        public static void testStringBuffer() {
            long start = System.currentTimeMillis();
            StringBuffer sbuf = new StringBuffer();
            for(int i=0; i <20000; i++) {
                sbuf.append(i + ",");
            }
            System.out.println(System.currentTimeMillis()-start);
        }
        
        //测试testStringBuilder
        public static void testStringBuilder() {
            long start = System.currentTimeMillis();
            StringBuilder sbuild = new StringBuilder();
            for(int i = 0; i < 20000; i++) {
                sbuild.append(i+",");
            }
            System.out.println(System.currentTimeMillis()-start);
        }
        
        public static void main(String[] args) {
            testString();
            testStringBuffer();
            testStringBuilder();
        }
    }
    

    测试结果:


    运行结果

    相关文章

      网友评论

          本文标题:String、StringBuilder与StringBuffe

          本文链接:https://www.haomeiwen.com/subject/ytpzfftx.html