Java_SE之String类及其源代码剖析
字符串特性
-
String
是常量,其对象一旦创建就无法改变。 - 当使用
+
拼接字符串时,会生成新的String
对象,而不是向原有的String
对象追加内容。
查看字节码
javap
javap -c com.terwergreen.str.StringNewTest
java 源代码
public class StringNewTest {
public static void main(String[] args) {
String str = new String("abc");
}
}
字节码:
➜ javase-test git:(master) ✗ javap -c -constants com.terwergreen.str.StringNewTest
Compiled from "StringNewTest.java"
public class com.terwergreen.str.StringNewTest {
public com.terwergreen.str.StringNewTest();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #16 // class java/lang/String
3: ldc #18 // String abc
5: invokespecial #20 // Method java/lang/String."<init>":(Ljava/lang/String;)V
8: return
}
idea
选中 .class
文件,View->Show bytecode
字符串池
String Pool(字符串池)
-
String s = "aaa";
采用字面值的方式赋值- 查找 Spring Pool 中是否存在 "aaa" 这个对象,如果不存在,则在 Spring Pool 中创建一个 "aaa" 对象,然后将 Spring Pool 中的这个 "aaa" 对象的地址返回来,赋给变量 s ,这样 s 会指向 String Pool 中的这个 "aaa" 字符串对象。
- 如果存在,则不创建任何对象,直接将 Spring pool 中的这个 "aaa" 对象地址返回来,赋给 s 引用。
-
String s = new String("aaa");
- 首先在 String Pool 中查找有没有 "aaa" 这个字符串对象,如果有,则不在 String Pool 中再去创建 "aaa" 这个对象了,直接在堆中(heap)创建一个 "aaa" 字符串对象,然后将堆中的这个 "aaa" 字符串对象返回来,付给 s 引用,导致 s 指向了堆中创建的这个 "aaa" 字符串对象。
- 如果没有,则首先在 String Pool 中创建一个 "aaa" 对象,然后再在堆中(heap)创建一个 "aaa" 对象,然后将堆中的这个 "aaa" 对象返回来,付给 s 引用,导致 s 指向了堆中所创建的这个 "aaa" 对象。
intern
参考
https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10
https://docs.oracle.com/javase/specs/jls/se17/html/jls-3.html#jls-StringLiteral
参考
各个版本的 JDK 文档下载地址
Links to JDK documentation
Java SE | Download | Web | Other |
---|---|---|---|
19 (current) | Downloads page | Javadoc | Doc home |
18 | Downloads page | Javadoc | Doc home |
17 (LTS) | Downloads page | Javadoc | Doc home |
16 | no longer available | Javadoc | Doc home |
15 | no longer available | Javadoc | Doc home |
14 | no longer available | Javadoc | Doc home |
13 | no longer available | Javadoc | Doc home |
12 | no longer available | Javadoc | Doc home |
11 (LTS) | Downloads page | Javadoc | Doc home |
10 | no longer available | Javadoc | Doc home |
9 | no longer available | Javadoc | Doc home |
8 (LTS) | Downloads page | Javadoc | Platform home Doc home |
7 | no longer available | Javadoc | Doc home |
6 | no longer available | Javadoc | Doc home |
By the way, a history of Java SE versions.
历史版本