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
}