String和new String的那点事
阅读原文时间:2023年09月05日阅读:2

String a= "test";

此语句含义是:在常量池中创建test字符串对象,变量aa是对常量池中此对象的引用

String aa = new String("test");

此语句含义是:如果常量池中没有test字符串对象,会在常量池中创建,并且还会在堆中创建一个test对象,变量aa是对堆中此对象的引用

String aaa= aa.intern() ;

此语句的含义是:如果常量池中有test字符串对象(判断条件是equal方法返回true),就直接返回常量池中该对象引用给aaa;如果没有,就会在常量池中创建test,再返回常量池中该对象的引用给aaa。

用以下代码运行结果验证一下:

package org.springmorning.demo.javabase.string;

/**
* @author 春晨
* @date 2019/1/7 9:05
* Copyright 2019 春晨 https://www.cnblogs.com/springmorning/p/10232635.html
*/
public class StringAndNewStringDiff {
public static void main(String[] args) {
String a = "test"; //在常量池中创建test字符串对象,变量aa是对常量池中此对象的引用
String aa = new String("test"); //由于前面语句已经在常量也中创建了test字符串对象,那么只会在堆中创建一个test对象,变量aa是对堆中此对象的引用
String aaa = new String("test");//在堆中再创建一个test字符串对象,变量aaa是对堆中此对象的引用

    System.out.println("判断它们是否为同一对象(内存地址是否一致):");  
    System.out.println("a和aa:" + (a == aa));   //false  
    System.out.println("a和aaa:" + (a == aaa));   //false  
    System.out.println("aa和aaa:" + (aa == aaa));  //false

    System.out.println("判断它们常量池中的对象是否为同一对象(内存地址是否一致):");  
    System.out.println("a和aa:" + (a.intern() == aa.intern()));   //true  
    System.out.println("a和aaa:" + (a.intern() == aaa.intern()));  //true  
    System.out.println("aa和aaa:" + (aa.intern() == aaa.intern()));   //true

    System.out.println("判断它们引用的值字符串是否相等:");  
    System.out.println("a和aa:" + a.equals(aa));   //true  
    System.out.println("a和aaa:" + a.equals(aaa));  //true  
    System.out.println("aa和aaa:" + aa.equals(aaa));   //true

}  

}

总结:

new 关键字,不管常量池中有没有相同的对象,都会在堆中创建一个新对象。