首页 > 编程语言 >Java_SE之String类及其源代码剖析

Java_SE之String类及其源代码剖析

时间:2022-10-17 11:25:40浏览次数:81  
标签:available aaa String Doc Javadoc home Java 源代码

字符串特性

  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.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.

标签:available,aaa,String,Doc,Javadoc,home,Java,源代码
From: https://www.cnblogs.com/tangyouwei/p/analysis-of-the-string-class-and-its-source-code-of-j

相关文章

  • java开发环境搭建
    java开发环境搭建JDK下载与安装配置环境变量JDK目录介绍HelloWorld及简单语法规则下载安装JDK8JavaSEDevelopmentKit8u181#安装181版本https://www.ora......
  • Java介绍
    java初生1995年的网页简单而粗糙,缺乏互动性图表界面的程序(Applet)java2标准版(J2SE):去占领桌面java2移动版(J2ME):去占领手机java2企业版(J2EE):......
  • Java_SE_Lesson_2:多态与static和final关键字
    多态:父类型的引用可以指向子类型的对象。Parentp=newChild;当使用多态方式调用方法时,首先检查父类中是否有sing方法,如果没有则编译错误;如果有,再去调用子类的si......
  • Java_SE_Lesson_3:接口、单例模式、包与访问控制
    接口中所声明的方法都是抽象方法。接口中的方法都是public​的。接口中也可以定义成员变量。接口中的成员变量都是public,final,static的。一个类不能既是f......
  • Java_SE之Object类详解
    相等性的比较(==)对于原生数据类型,比较的是左右两边的值是否相等对于引用类型来说,比较的是左右两边的引用是否指向同一个对象,或者说左右两边的引用地址是否相同。java.l......
  • Java_SE_第八讲:理解面向对象程序设计
    break语句:经常用在循环语句中,用于跳出整个循环,执行循环后面的代码。continue语句:经常用在循环语句中,用于跳出当前的这个循环(或者是跳出本次循环),开始下一次循环的执......
  • java 自动补齐数值至指定位数
    如流水号需要在数字前自动补齐0,至指定位数。如果已经达到了指定位数,不会补齐,返回原数值。自定义/***自动补齐位数*@paramlength补齐后的位数*@paramnum待......
  • Java_SE_第九讲:面向对象之封装
    面向对象程序设计的三大基本特征:继承(Inheritence​)、封装(Encapsulation​)、多态(Polymorphism​)封装:类包含了数据与方法,将数据与方法放在一个类中就构成了封装。如何......
  • Java_SE之Java_SE平台与JDK
    Java平台JavaSE:JavaPlatform,StandardEditionJavaSE是一个计算平台,用于为桌面和服务器环境开发和部署可移植代码。JavaSE以前称为Java2Platform,StandardEd......
  • 【go】 golang 的文件写入和读取(Write()、WriteString(),bufio包:WriteString()、flush(
    1.os包1.1Write()/WriteString()方法语法打开文件funcOpenFile(namestring,flagint,permFileMode)(*File,error)写入func(f*File)WriteString(sstr......