字符串常量池
概要
字符串常量池 是 JVM 为了提升性能和减少内存消耗,针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。
一、内存区域
1)JDK1.7之前
运行时常量池(字符串常量池也在里边)是存放在方法区,此时方法区的实现是永久代。
2)JDK1.7
字符串常量池被单独从方法区移到堆中,运行时常量池剩下的还在永久代(方法区)。
说明:主要是因为永久代(方法区实现)的 GC 回收效率太低,只有在整堆收集 (Full GC)的时候才会被执行 GC。Java 程序中通常会有大量的被创建的字符串等待回收,将字符串常量池放到堆中,能够更高效及时地回收字符串内存。
3)JDK1.8
永久代更名为元空间(方法区的新的实现),但字符串常量池池还在堆中,运行时常量池在元空间(方法区)。
二、字符串常量池的应用
1. 堆中创建字符串对象
1 // 在堆中创建字符串对象”ab“ 2 // 将字符串对象”ab“的引用保存在字符串常量池中 3 String aa = "ab"; 4 5 // 直接返回字符串常量池中字符串对象”ab“的引用 6 String bb = "ab"; 7 8 System.out.println(aa==bb);// true
2. String s1 = new String("abc");这句话创建了几个字符串对象?
会创建 1 或 2 个字符串对象。1、如果字符串常量池中不存在字符串对象“abc”的引用,那么它会在堆上创建两个字符串对象,其中一个字符串对象的引用会被保存在字符串常量池中。
示例代码(JDK 1.8):
String s1 = new String("abc");
参考链接:
https://javaguide.cn/java/basis/java-basic-questions-02.html
标签:ab,常量,对象,创建,字符串,String From: https://www.cnblogs.com/hld123/p/18338058