Java中字符串内存位置

来源:互联网 发布:我的失恋 知乎 编辑:程序博客网 时间:2024/05/29 19:04

前言

总结一下:基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,显式的String常量放在常量池,String对象放在堆中。

常量池的说明

常量池之前是放在方法区里面的,也就是在永久代里面的,从JDK7开始移到了堆里面。

String内存位置说明

  1. 显式的String常量

    String a = "test";String b = "test";
  • 第一句代码执行后就在常量池中创建了一个值为test的String对象;
  • 第二句执行时,因为常量池中存在test所以就不再创建新的String对象了。
  • 此时该字符串的引用在虚拟机栈里面。
  1. String对象

    String a = new String("testObj");String b = new String("testObj");
  • Class被加载时就在常量池中创建了一个值为testObj的String对象,第一句执行时会在堆里创建new String("testObj")对象;
  • 第二句执行时,因为常量池中存在testObj所以就不再创建新的String对象了,直接在堆里创建new String("testObj")对象。

验证一下

/** *  */public class Client {    public static void main(String[] args){        String str1 = "abcd";        String str2 = "abcd";        System.out.println(str1==str2);//true                String str3 = new String("abcdabcd");        String str4 = new String("abcdabcd");        System.out.println(str3==str4);//false    }}

返回结果:

truefalse