jvm1.8 关于string的问题,求大老救助~

public static void main(String[] args) {
        System.out.println("1");
        System.out.println("2");
        System.out.println("3");
        System.out.println("4");
        System.out.println(new String("1"));

    }

用这样的在new string内堆中string对象数没有增加这是为啥?是对象被回收了吗

img

img

“1”的值放在常量池。new String对象放在堆中,指向常量池中的值。你new几个,就有几个String对象。直接“”是放在常量池中的。
==比较的是String对象的地址和”1“的值。所以不一样。

new String("1")是新创建了一个String对象。而代码里的字符串常量,比如"1" "2" "3",都会指向字符串常量池里的地址,所以
以下a是等于b的。因为a和b都是指向的同一个字符串常量池的对象。

String a = "1";
String b = "1";
System.out.println(a == b); //True

new String("1") 却是切切实实的重新创建了一个新对象,对于引用对象,==号比较内存地址,因为是新构建的对象,所以内存地址就会变化,自然就不会相等。比如:

String a = new String("1");
String b = new String("1");
System.out.println(a == b);// FALSE 因为a和b都是切切实实新建的对象,不是字符串常量池的东西。