String ,StringBuilder,StringBuffer

一.String类使用字符数组保存字符串,数组有final修饰,不可变.线程安全

    String a="hello";String b=new String("hello");

    第一种在栈内存定义了一个a对象的引用,指向堆内存的值"hello"的内存地址

    第二种先在栈内存创建一个"hello"对象,new String又产生了另外一个对象.第一个对象无人引用

    

    

   

   上图的解释:String在Java中使用了共享设计,在Java形成一个对象池,这个对象池可以保存多个对象,如果新实例化的对象已经在对象池中存在,就不在重复定义,直接从    对象池中取出使用。

二.StringBuilder类继承AbstractStringBuilder,底层也是字符数组保存字符串,可变.线程不安全

    //无参构造,默认长度16的字符数组

      public StringBuilder() {
            super(16);
        }

    //带参数的构造函数

     public StringBuilder(String str) {
          super(str.length() + 16);
          append(str);
        }

    //没有实现同步

       public StringBuilder append(String str) {
            super.append(str);
            return this;
        }

三.StringBuffer类继承AbstractStringBuffer,底层也是字符数组保存字符串,可变.线程安全

    //无参构造,默认长度16的字符数组

      public StringBuffer() {
            super(16);
        }

    //带参数的构造函数

     public StringBuffer(String str) {
          super(str.length() + 16);
          append(str);
        }

  

    //和StringBuilder的区别就是同步

        public synchronized StringBuffer append(String str) {
            super.append(str);
            return this;
        }

四.总结:

     1.如果要操作少量的数据用 = String    

              2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

              3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

原文地址:https://www.cnblogs.com/2nao/p/6507571.html