String字符串在内存中的存储(java)

相关内容见我的另一篇博客:《java中的不可变类与String的不可变机制》
《java虚拟机 内存模型之常量池》

本篇文章主要是对String字符串在内存中的存储进行一个详细的介绍,整理一下思路。

JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)

java中对String对象特殊对待,所以在heap区域分成了两块,一块是字符串常量池(String constant pool),用于存储java字符串常量对象,另一块用于存储普通对象及字符串对象。

String的创建

首先创建一个字符串的方式:

public static void main(String[] args) {
    String a = "abc";  //第一种 在字符串常量池中创建对象
    String b=new String("abc"); //第二种
    String c = "abc";
    System.out.println(a == b);//false
    System.out.println(a == c);//true
}

其中,第一种方式的过程为:
jvm会首先在String constant pool 中寻找是否已经存在"abc"常量,如果没有则创建该常量,并且将此常量的引用返回给String a;如果已有"abc" 常量,则直接返回String constant pool 中“abc” 的引用给String a。故 a==c

对于第二种,new就是在堆中创建一个新的String对象,不管"abc"在内存中是否存在,都会在堆中开辟新空间。

String.intern()

直接上代码

String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2); //false
System.out.println(s1.intern() == s2); //true
System.out.println(s1.intern() == s1); //false
System.out.println(s2.intern() == s2); //true

当一个String实例调用intern()方法时,会查找常量池中是否有相同的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个等于str的字符串并返回它的引用,由于s2已经在常量池中,所以s1.intern()不会再创建,而是直接引用同一个"abc"。

在内存的情况

存疑。

public static void main(String[] args) {
        String s1 = "abc";//字符串常量池,编译时确定
         
        String s2 = "xyz";//字符串常量池
         
        String s3 = "123";//字符串常量池
         
        String s4 = "A";//字符串常量池
        
        String s5 = new String("abc"); //堆里,运行时确定
         
        char[] c = {'J','A','V','A'};
         
        String s6 = new String(c);//堆里
         
        String s7 = new String(new StringBuffer());//堆里
    }

在这里插入图片描述
涉及到,new出来的String对象,在堆中存储毋庸置疑,但是既然相同内容的字符串只会在常量池中存在一个,那么堆中的对象实例是否存有指向常量池中的地址,还是只是简单的常量池中的字符串的拷贝对象?

有的文章说,String str=new String(“abc”);//如果常量池中没有"abc"的话,就相当于创建了两个对象,一个存在堆中一个在常量池中,这种说法目前我的理解是,常量池中存的是一个String字符串常量,java中的字符串其实就是一个对象(一切皆对象)。堆中存的就是new出来的String对象。

但是存疑的是,如果原来常量池中没有"abc",new的时候,真的会在常量池中新建一个String字符串"abc"吗?会的! 堆中的对象和常量池中的对象到底有没有联系。下图中的语句是否准确?在这里插入图片描述

在这里插入图片描述

自己敲了一遍代码,证明基本信息。具体在内存中的存储依然存疑。求指点。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mulinsen77/article/details/88633632