java 基础——String、StringBuffer、StringBuffer

String

/**
 * String 为 final 修饰的类,所以一旦初始化不可修改
 */
public final class String{
 public String() {
        this.value = new char[0];
    }

}

StringBuffer:

public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{
    static final long serialVersionUID = 3388685877147921107L;

    public StringBuffer() {
    super(16);
    }
public synchronized char charAt(int index) {//StringBuffer 所有方法都用 synchronized 修饰,多线程时比较安全
        if ((index < 0) || (index >= count))
            throw new StringIndexOutOfBoundsException(index);
        return value[index];
    }
}



StringBuilder:

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
{
    static final long serialVersionUID = 4383685877147921099L;
    public StringBuilder() {
        super(16);
    }

StringBuilder 一般用在单线程。

String 和 StringBuilder 的使用方法。

1.有循环

class String2{
	//每次在循环内部都会产生一个StringBuilder的一个对象
	public String fun1(String[] str){
		String str1 = "";
		for(int i = 0;i < str.length;i++){
			str1 = str1+str[i];
		}
		return str1;
	}
}

我们对这个类进行反汇编


/**
 * StringBuilder
 */
class String3{
	
	public String fun1(String[] str){
		//我只生成一个StringBuilder对象
		StringBuilder str2 = new StringBuilder();
		for(int i = 0;i < str.length;i++){
			str2.append(str[i]);
		}
		return str2.toString();
	}
}

通过对 String 和StringBuffer 的反汇编,我们可以看出 StringBuffer 的效率比较高。

String 中

新建一个 StringBuilder对象,传给String 对象。

扫描二维码关注公众号,回复: 2334899 查看本文章

调用 StringBuilder的 append();方法

调用StringBuilder的 toString()方法返回一个新的 String 对象。

StringBuilder 也进行在同样的步骤,但是不同的是 String 是在循环内进行的,StringBuilder 是在循环外进行的,StringBuilder 只初始化一个对象,String 初始化多对象,所以StringBuilder 效率比较高。String.intern();

String.intern();

  public native String intern();

String.intern()是native方法

String.intern() 的工作原理

先去常量池里找是有当前字符串的引用。

返回该字符串在常量池当中的引用。

让我们看下面的例子

public static void main(String[] args) {

		String str4 = "abcd";
		String str5 = new String("ab") + new String("cd");
		String str6 = str5.intern();
		System.out.println(str6 == str5);//false
		System.out.println(str4 == str6);//true
}

猜你喜欢

转载自blog.csdn.net/alyson_jm/article/details/80459734