Java中字符串内存位置

前言

总结一下:基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,显式的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
    }
}

返回结果:

true
false

你可能感兴趣的:(java)