Skip to content

Commit 0d308e7

Browse files
authored
Update java-basic-questions-02.md
修正字符串常量池引用的描述
1 parent d243984 commit 0d308e7

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

docs/java/basis/java-basic-questions-02.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -694,12 +694,12 @@ System.out.println(s);
694694
**字符串常量池**JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。
695695
696696
```java
697-
// 在堆中创建字符串对象”ab“
698-
// 将字符串对象”ab“的引用保存在字符串常量池中
697+
// 在字符串常量池中创建字符串对象 ”ab“
698+
// 将字符串对象 ”ab“ 的引用返回给引用 aa
699699
String aa = "ab";
700-
// 直接返回字符串常量池中字符串对象”ab“的引用
700+
// 直接返回字符串常量池中字符串对象 ”ab“,赋值给引用 bb
701701
String bb = "ab";
702-
System.out.println(aa==bb);// true
702+
System.out.println(aa==bb); // true
703703
```
704704
705705
更多关于字符串常量池的介绍可以看一下 [Java 内存区域详解](https://javaguide.cn/java/jvm/memory-area.html) 这篇文章。
@@ -708,7 +708,7 @@ System.out.println(aa==bb);// true
708708
709709
会创建 12 个字符串对象。
710710
711-
1、如果字符串常量池中不存在字符串对象“abc”的引用,那么它会在堆上创建两个字符串对象,其中一个字符串对象的引用会被保存在字符串常量池中。
711+
1、如果字符串常量池中不存在字符串对象 “abc”,那么它首先会在字符串常量池中创建字符串对象 "abc",然后在堆内存中再创建其中一个字符串对象 "abc"
712712
713713
示例代码(JDK 1.8):
714714
@@ -720,14 +720,14 @@ String s1 = new String("abc");
720720
721721
![](https://oss.javaguide.cn/github/javaguide/open-source-project/image-20220413175809959.png)
722722
723-
`ldc` 命令用于判断字符串常量池中是否保存了对应的字符串对象的引用,如果保存了的话直接返回,如果没有保存的话,会在堆中创建对应的字符串对象并将该字符串对象的引用保存到字符串常量池中
723+
`ldc (load constant)` 指令的作用是从常量池中加载常量,包括字符串常量、整数常量、浮点数常量、或者类引用。这里用于判断字符串常量池中是否保存了对应的字符串对象,如果保存了的话会将它的引用加载到操作数栈,如果没有保存的话,会在字符串常量池中创建对应的字符串对象,并将其引用加载到操作数栈中
724724
725-
2、如果字符串常量池中已存在字符串对象“abc”的引用,则只会在堆中创建 1 个字符串对象“abc”。
725+
2、如果字符串常量池中已存在字符串对象“abc”,则只会在堆中创建 1 个字符串对象“abc”。
726726
727727
示例代码(JDK 1.8):
728728
729729
```java
730-
// 字符串常量池中已存在字符串对象“abc”的引用
730+
// 字符串常量池中已存在字符串对象“abc”
731731
String s1 = "abc";
732732
// 下面这段代码只会在堆中创建 1 个字符串对象“abc”
733733
String s2 = new String("abc");

0 commit comments

Comments
 (0)