原文鏈接http://zhhll.icu/2020/06/14/java%E5%9F%BA%E7%A1%80/%E5%AD%97%E7%AC%A6%E4%B8%B2/java%E5%9F%BA%E7%A1%80%E4%B9%8B%E5%AD%97%E7%AC%A6%E4%B8%B2/
字串
String
String是一個final修飾的不可變類,,其屬性也是final的,底層使用char陣列存盤,
字串擁有字串常量池,對于String s = new String("xyz");
如果之前沒有用過xyz的話,需要創建兩個物件,一個是new String創建的物件,一個是常量xyz物件的內容創建的物件(常量池中一個,堆中一個)
public static void main(String[] args) {
String s = new String("zxc");
}
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/lang/String
3: dup
4: ldc #3 // String zxc
6: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
9: astore_1
10: return
}
如果之前就存在xyz的話,只需要創建一個物件new String物件
public static void main(String[] args) {
String ss = "zxc";
String s = new String("zxc");
}
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String zxc
2: astore_1
3: new #3 // class java/lang/String
6: dup
7: ldc #2 // String zxc
9: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
12: astore_2
13: return
}
Process finished with exit code 0
字串拼接
字串拼接的位元組碼,在java8中進行字串拼接時會編譯為StringBuilder,
public class TestString {
public static void main(String[] args) {
String s = null;
for(int i = 0;i<10;i++){
s = s + i;
}
}
}
public class com.zhanghe.study.stream.TestString {
public com.zhanghe.study.stream.TestString();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: aconst_null
1: astore_1
2: iconst_0
3: istore_2
4: iload_2
5: bipush 10
7: if_icmpge 35
10: new #2 // class java/lang/StringBuilder
13: dup
14: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
17: aload_1
18: invokevirtual #4 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: iload_2
22: invokevirtual #5 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
25: invokevirtual #6 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
28: astore_1
29: iinc 2, 1
32: goto 4
35: return
}
intern方法
在使用字串拼接之后生成的字串如果呼叫intern()方法,就會回傳該字串所對應的常量池中字串的地址值
String s1 = "aa";
String s2 = "bb";
String s3 = "aabb";
String s4 = s1+s2;
String s5 = "aa"+"bb";
String s6 = s4.intern();
System.out.println(s3 == s4);// false
System.out.println(s3 == s5);// true
System.out.println(s3 == s6);// true
System.out.println(s4 == s5);// false
System.out.println(s4 == s6);// false
System.out.println(s5 == s6);// true
StringBuilder和StringBuffer
與StringBuffer相比,StringBuilder是執行緒不安全的,在單執行緒上操作比StringBuffer性能損耗小,
默認初始值大小為16,如果進行擴容的話,會進行資料內容的賦值,增加性能損耗,如果確定資料大小,可以指定大小
由于本身的博客百度沒有收錄,博客地址http://zhhll.icu
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245981.html
標籤:其他
