JavaSe——6、String、StringBuffer、StringBuilder

来源:互联网 发布:网络宣传怎么做 编辑:程序博客网 时间:2024/05/23 14:08

java.lang.String

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    /** use serialVersionUID from JDK 1.0.2 for interoperability */    private static final long serialVersionUID = -6849794470754667710L;    /**     * Class String is special cased within the Serialization Stream Protocol.     *     * A String instance is written into an ObjectOutputStream according to     * <a href="{@docRoot}/../platform/serialization/spec/output.html">     * Object Serialization Specification, Section 6.2, "Stream Elements"</a>     */    private static final ObjectStreamField[] serialPersistentFields =        new ObjectStreamField[0];

这里写图片描述
这里写图片描述

  • String不可变:通过String类的源码可以看到, private final char value[];即String类通过char数组存储字符串,由于final修饰的这个成员变量,因此一旦给value(数组引用)赋值就不可变。
    比如String a=”abc”; 表示通过value数组存放”abc”,这个value数组是不可变的,如果执行a=”def”;相当于新建了一个字符串对象”def”,并通过新的value数组保存,然后a指向新的value地址。所以不可变是说,a指向的value数组里的内容不可变,但是a的引用可以变。
  • 初始化:
    • String a = “abc”;
    • String a =new String(“abc”);
  • 主要成员方法:
    • 若干个构造器。
    • charAt();返回特定位置的字符。
    • compareTo;比较两个字符串。
    • concat();连接两个字符串。
    • indexOf();某个字符第一次出现的位置。
    • valueOf();基本类型转为String类型。
    • public native String intern(); 本地方法,查看字符串常量池中是否有和该对象相等的对象,有就返回字符串常量池中的引用,没有就在字符串常量池新建一个对象,并返回该引用。
    String a = "abc";    String b =new String("abc");    a=b.intern();//true
  • 思考:String s = “a” + new String(“b”) + “c”;产生了那几个对象?
    解:等价于String s = new StringBuilder().append(“a”).append(new String(“b”)).append(“c”).toString(),会在String Pool中产生”a”、”b”、”c”三个对象,在Heap中产生”b”、”abc”两个对象。一共5个字符串对象。

java.lang.StringBuffer

public final class StringBuffer    extends AbstractStringBuilder    implements java.io.Serializable, CharSequence{     private transient char[] toStringCache;}
  • StringBuffer可变,指的是存放字符串的char数组没有用final修饰,因此可以改变。StringBuffer只能通过构造函数初始化,且类里自带append()、delete()、insert()等方法,方便字符串的变化,变为最终想要的字符串后,可以通过toString()转为String类型。

java.lang.StringBuilder

public final class StringBuilder    extends AbstractStringBuilder    implements java.io.Serializable, CharSequence{}
  • StringBuilder是可变类,可以看到虽然自己没有char数组的成员变量,但是在父类(abstract class AbstractStringBuilder)中找到了 char[] value属性,子类可以继承父类非private的属性和方法,因此自然继承过来。

对比

  • String由于是不可变的,因此在修改String字符串时,每次都会创建一个新的String对象,并改变原来的引用。
  • StringBuffer和StringBuilder有一样的父类和一样的接口,但是StringBuffer加了同步锁,线程安全,而StringBuilder线程不安全,StringBuilder的效率更高。
  • String的字符串拼接:
    • String a =”abc”; a+=”def”;
      String中通过”+”拼接字符串时,编译器会优化这种操作,即会通过StringBuilder的append方法处理,所以
      a+= “def”;实际是:
      a=new StringBuilder(a).append(“def”).toString();
    • 但是如果String a = “abc”+”def”;则jvm在编译时直接把”abc”+”def”转换为”abcdef”,速度比append都快哦!
    • concat连接字符串
  public String concat(String str) {        int otherLen = str.length();        if (otherLen == 0) {            return this;        }        char buf[] = new char[count + otherLen];        getChars(0, count, buf, 0);        str.getChars(0, otherLen, buf, count);        return new String(0, count + otherLen, buf);        }
  • StringBuffer的append:
 public synchronized StringBuffer append(String str) {        super.append(str);            return this;        }   public AbstractStringBuilder append(String str) {        if (str == null) str = "null";            int len = str.length();        if (len == 0) return this;        int newCount = count + len;        if (newCount > value.length)            expandCapacity(newCount);        str.getChars(0, len, value, count);        count = newCount;        return this;       }
  • 应用:

1、String:在字符串不经常变化的场景中可以使用 String 类,如:常量的声明、少量的变量运算等。如果需要运算,尽量一次性String a = “bcd”+b+”eff”;这种写法效率高。因为没执行一次加号,都创建一个StringBuilder对象。

2、StringBuffer:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用
StringBuffer,例如 XML 解析、 HTTP 参数解析和封装等。

3、StringBuilder:在频繁进行字符串的运算(拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用
StringBuffer,如 SQL 语句的拼装、JSON 封装等(貌似这两个我也是使用|StringBuffer)。

参考文献:
http://wiki.jikexueyuan.com/project/java-enhancement/java-fourteen.html

http://www.cnblogs.com/zuoxiaolong/p/lang1.html(左潇龙的博客)

阅读全文
0 0
原创粉丝点击