Java_SE之String类及其源代码剖析

Terwer...大约 3 分钟后端开发JavaSE对象字符串字节特性常量string

字符串特性

  1. String​​ 是常量,其对象一旦创建就无法改变。
  2. 当使用 +​​​ 拼接字符串时,会生成新的 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(字符串池)

  1. String s = "aaa";​​ 采用字面值的方式赋值

    1. 查找 Spring Pool 中是否存在 "aaa" 这个对象,如果不存在,则在 Spring Pool 中创建一个 "aaa" 对象,然后将 Spring Pool 中的这个 "aaa" 对象的地址返回来,赋给变量 s ,这样 s 会指向 String Pool 中的这个 "aaa" 字符串对象。
    2. 如果存在,则不创建任何对象,直接将 Spring pool 中的这个 "aaa" 对象地址返回来,赋给 s 引用。
  2. String s = new String("aaa");

    1. 首先在 String Pool 中查找有没有 "aaa" 这个字符串对象,如果有,则不在 String Pool 中再去创建 "aaa" 这个对象了,直接在堆中(heap)创建一个 "aaa" 字符串对象,然后将堆中的这个 "aaa" 字符串对象返回来,付给 s 引用,导致 s 指向了堆中创建的这个 "aaa" 字符串对象。
    2. 如果没有,则首先在 String Pool 中创建一个 "aaa" 对象,然后再在堆中(heap)创建一个 "aaa" 对象,然后将堆中的这个 "aaa" 对象返回来,付给 s 引用,导致 s 指向了堆中所创建的这个 "aaa" 对象。

intern

参考

https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10open in new window

https://docs.oracle.com/javase/specs/jls/se17/html/jls-3.html#jls-StringLiteralopen in new window

参考

各个版本的 JDK 文档下载地址

Links to JDK documentation

Java SEDownloadWebOther
19open in new window (current)Downloads pageopen in new windowJavadocopen in new windowDoc homeopen in new window
18open in new windowDownloads pageopen in new windowJavadocopen in new windowDoc homeopen in new window
17open in new window (LTSopen in new window)Downloads pageopen in new windowJavadocopen in new windowDoc homeopen in new window
16open in new windowno longer availableJavadocopen in new windowDoc homeopen in new window
15open in new windowno longer availableJavadocopen in new windowDoc homeopen in new window
14open in new windowno longer availableJavadocopen in new windowDoc homeopen in new window
13open in new windowno longer availableJavadocopen in new windowDoc homeopen in new window
12open in new windowno longer availableJavadocopen in new windowDoc homeopen in new window
11open in new window (LTSopen in new window)Downloads pageopen in new windowJavadocopen in new windowDoc homeopen in new window
10open in new windowno longer availableJavadocopen in new windowDoc homeopen in new window
9open in new windowno longer availableJavadocopen in new windowDoc homeopen in new window
8open in new window (LTSopen in new window)Downloads pageopen in new windowJavadocopen in new windowPlatform homeopen in new window
Doc homeopen in new window
7open in new windowno longer availableJavadocopen in new windowDoc homeopen in new window
6open in new windowno longer availableJavadocopen in new windowDoc homeopen in new window

By the way, a history of Java SE versionsopen in new window.

历史版本

https://javadoc.allimant.org/open in new window

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.14.9