远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)

Terwer Green

一个后端老菜鸟
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)
  • JavaSE

    • Java_SE之Java_SE平台与JDK
    • Java_SE_第二讲:原生数据类型
    • Java_SE_第三讲:原生数据类型使用陷阱
    • Java_SE_第四讲:运算符
    • Java_SE_第五讲:运算符续
    • Java_SE_第六讲:流程控制语句
    • Java_SE_第七讲:流程控制续
    • Java_SE_第八讲:理解面向对象程序设计
    • Java_SE_第九讲:面向对象之封装
    • Java_SE_第十讲:面向对象之封装续
    • Java_SE_第十一讲:面向对象之封装续二
    • Java_SE_Lesson_1:面向对象高级
    • Java_SE_Lesson_2:多态与static和final关键字
    • Java_SE_Lesson_3:接口、单例模式、包与访问控制
    • Java_SE之Object类详解
    • Java_SE之String类及其源代码剖析
      • 字符串特性
      • 查看字节码
        • javap
        • idea
      • 字符串池
      • intern
      • 参考
    • 包装类与数组
    • 冒泡排序、交换排序与快速排序
    • Java数组的查找方式及二分查找
    • 常量与Java集合框架简介
    • 常用的Java开发IDE
    • ArrayList深入分析
    • LinkedList源代码深入剖析
    • 数据结构中的基本结构分析
    • 《Java语言新特性》

  • 开源框架

  • Linux

  • Struts2

  • Hibernate

  • Webservice

  • 分布式

  • 分布式框架

  • 后端开发
  • JavaSE
terwer
2022-10-15
目录

Java_SE之String类及其源代码剖析

# 字符串特性

  1. ​String​​ 是常量,其对象一旦创建就无法改变。
  2. 当使用 +​​​ 拼接字符串时,会生成新的 String​​​ 对象,而不是向原有的 String​​​ 对象追加内容。

# 查看字节码

# javap

javap -c com.terwergreen.str.StringNewTest
1

java 源代码

public class StringNewTest {
    public static void main(String[] args) {
        String str = new String("abc");
    }
}
1
2
3
4
5

字节码:

➜  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
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 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 (opens new window)

https://docs.oracle.com/javase/specs/jls/se17/html/jls-3.html#jls-StringLiteral (opens new window)

# 参考

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

Links to JDK documentation

Java SE Download Web Other
19 (opens new window) (current) Downloads page (opens new window) Javadoc (opens new window) Doc home (opens new window)
18 (opens new window) Downloads page (opens new window) Javadoc (opens new window) Doc home (opens new window)
17 (opens new window) (LTS (opens new window)) Downloads page (opens new window) Javadoc (opens new window) Doc home (opens new window)
16 (opens new window) no longer available Javadoc (opens new window) Doc home (opens new window)
15 (opens new window) no longer available Javadoc (opens new window) Doc home (opens new window)
14 (opens new window) no longer available Javadoc (opens new window) Doc home (opens new window)
13 (opens new window) no longer available Javadoc (opens new window) Doc home (opens new window)
12 (opens new window) no longer available Javadoc (opens new window) Doc home (opens new window)
11 (opens new window) (LTS (opens new window)) Downloads page (opens new window) Javadoc (opens new window) Doc home (opens new window)
10 (opens new window) no longer available Javadoc (opens new window) Doc home (opens new window)
9 (opens new window) no longer available Javadoc (opens new window) Doc home (opens new window)
8 (opens new window) (LTS (opens new window)) Downloads page (opens new window) Javadoc (opens new window) Platform home (opens new window)
Doc home (opens new window)
7 (opens new window) no longer available Javadoc (opens new window) Doc home (opens new window)
6 (opens new window) no longer available Javadoc (opens new window) Doc home (opens new window)

By the way, a history of Java SE versions (opens new window).

历史版本

https://javadoc.allimant.org/ (opens new window)

‍

编辑 (opens new window)
#对象#字符串#字节#特性#常量#string
上次更新: 2023/02/22, 13:47:25
Java_SE之Object类详解
包装类与数组

← Java_SE之Object类详解 包装类与数组→

最近更新
01
解决css部分border被圆角切掉之后圆角的边框消失问题
03-18
02
使用TypeScript开发一个自定义的Node-js前端开发脚手架
03-08
03
Github-Actions使用release-please实现自动发版
03-06
更多文章>
Theme by Vdoing | Copyright © 2011-2023 Terwer Green | MIT License | 粤ICP备2022020721号-1 | 百度统计
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式