String和new String的那点事

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
 */
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 关键字,不管常量池中有没有相同的对象,都会在堆中创建一个新对象。

猜你喜欢

转载自www.cnblogs.com/springmorning/p/10232635.html