• 面试长谈的String,StringBuffer,StringBuilder三兄弟有啥区别


    1.String:

     1 /** Strings are constant; their values cannot be changed after they
     2  * are created. String buffers support mutable strings.
     3  * Because String objects are immutable they can be shared. 
     4  * 字符串是不变的,他们的值在创造后不能改变。
     5  * 字符串缓冲区支持可变字符串,因为字符串对象是不可变的,所以它们可以共享。
     6  * 
     7  * @see StringBuffer
     8  * @see StringBuilder
     9  * @see Charset
    10  * @since 1.0
    11  */
    12 public final class String implements Serializable, Comparable<String>, CharSequence {
    13     private static final long serialVersionUID = -6849794470754667710L;
    14     private static final char REPLACEMENT_CHAR = (char) 0xfffd;

      这个是经是用的也是最早接触的,但是它的一大优点就是生成一个字符串如果下一次再创建相同的,则直接指向常量区里已经生成过的那个。

      其他的先不讲这个东西的优点就是省资源,至于String类的另一个特点就是它是final修饰的也就是说不可被继承的。(网上还说它是线程安全的这个我面试的时候是         没想到)。

    2.StringBuffer:

     1 public final class StringBuffer
     2     extends AbstractStringBuilder
     3     implements java.io.Serializable, Appendable, CharSequence
     4 {
     5     /**
     6      * Constructs a string buffer with no characters in it and an
     7      * initial capacity of 16 characters.
     8      */
     9     public StringBuffer() {
    10         super(16);
    11     }
    12     public synchronized StringBuffer append(int i) {
    13         super.append(i);
    14         return this;
    15     }
    16     public synchronized StringBuffer delete(int start, int end) {
    17         super.delete(start, end);
    18         return this;
    19     }
    20 }
      synchronized这个的出现就直接知道这个小东西是线程的安全的了。(经常会问是不是线程安全的,看一下代码记得快)。

    3.StringBuilder:
     1 public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, Appendable, CharSequence {
     2    public StringBuilder() {
     3         super(16);
     4    }
     5    public StringBuilder append(String str) {
     6         super.append(str);
     7         return this;
     8     }
     9     public StringBuilder delete(int start, int end) {
    10         super.delete(start, end);
    11         return this;
    12     }
    13 }

        他可以看成是StringBuffer的无synchronized版,线程不安全。

    4.三者之间的区别:

      4.1:String VS StringBuffer

        4.1.1 初始化:

          4.1.1.1String的初始化:

          String a = null;

          String a="asd";

            4.1.1.2 StringBuffer的初始化

           StringBuffer a = null; //结果警告:Null pointer access: The variable result can only be null at this location

          StringBuffer a = new StringBuffer();//通过,这个是创建了一个空对象

          StringBuffer a = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象

        4.1.2  效率方面

      

    1 //String效率是远要比StringBuffer快的:
    2 String S = “a” + “ s” + “ d”;
    3 StringBuffer Sb = new StringBuilder(“a”).append(“s”).append(“ d”);

        4.1.3 执行速度方面

    //String速度是非常慢的:
    String S1 = “a”;
    String S2 = “ s”;
    String S3 = “ d”;
    String S4 = S1 +S2 + S3;

           String对象不可变,重复新建对象需要花费很多时间;StringBuffer对象可变所以在插入删除方面有着很好的优势。

         PS: 注意在开头的代码可以看出StringBuilder与StringBuffer的区别在于方法的同步关键字的添加与否,所以效率与执行速度String与StringBuilder的比较                          是可以和上面String与StringBuffer比较做参照的。当然在初始化的方面同样可以。

         4.1.4 总结

          少量数据的操作为了追求效率可以用String;

          大量数据的拼接,插入,删除则建议使用StringBuffer;

      4.2 StringBuffer  VS StringBuilder

        4.2.1 线程安全

          这是这块知识最容易记住的,从上面的代码中就可看出StringBuffer是线程安全的,而StringBuilder是非线程安全的。

        4.2.2 执行速度

          在不考虑线程安全的情况下(单线程),StringBuilder的执行速度是快于StringBuffer,而且在大量的数据(这里指String字符串)需要进行插入,删除,       拼接的是执行速度也是远快于String的。

    5 总结

      a.如果要操作少量的数据用 String; 
      b.多线程操作字符串缓冲区下操作大量数据 StringBuffer; 
      c.单线程操作字符串缓冲区下操作大量数据 StringBuilder。

  • 相关阅读:
    java初学
    数据库命名及设计规范(转)
    转-ASP.NET页面之间传递值
    程序员个人职业规划
    如何学习别人的代码(转)
    可映射的CSV读取引擎
    iTween扩展
    Unity3d中NGUI加强版血条(Healthbar)的制作
    Unity3D中寻路Navmesh的简单介绍
    多人网络(Valve开发文档翻译[起源引擎])(一)
  • 原文地址:https://www.cnblogs.com/lucong-white/p/8658062.html
Copyright © 2020-2023  润新知