对于字符串String的学习一直是迷迷糊糊,但这块知识却也是重点,要想真正的搞懂不仅要清楚的知道Java中的内存模型,也要能准确区分各种创建好的对象的存储位置。在自己看了深入理解Java虚拟机这本书后,结合多篇博客,才感觉稍微入门,用这篇博客总结记录一下自己理解下的字符串常量池。
String
一、关于String类
之前写过关于String类的简单认识—>字符串String类可供参考
二、常量池
关于Java内存模型参照—>Java虚拟机中的内存区域
这里再着重说一下常量池的概念。运行时常量池和字符串常量池之间有什么关系呢?
在Java虚拟机中常见的几种常量池:class文件常量池、运行时常量池、字符串常量池
- Class文件常量池:主要运用编译时期产生的字面量和符号引用
其中,字面量类似常量包括String类型的值和final修饰的变量。 - 运行时常量池:Class文件会在类加载后进入方法区,就称之为运行时常量池
- 字符串常量池:在jdk1.6时,字符串常量池就存在与方法区中,在jdk1.7版本后,字符串常量被移到了堆中。因此1.7版本后,字符串常量池就没有存在于运行常量池中了。
接下来,让我们看一段代码:
三、代码分析
让我们看看下面一段代码中的问题:
问题一:
public class StringDemo {
public static void main(String[] args) {
String s1 = "abc";
String s2 = new String("abc");
String s3 = new String("abc");
String s4 = "a" + "bc";
String s5 = new String("a")+new String("bc");
String s6 = new String("a");
String s7 = new String("bc");
String s8 = s6 + s7;
String s9 = s2.intern();
System.out.println(s1 == s2); // false
System.out.println(s2 == s3);