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对象数没有增加这是为啥?是对象被回收了吗
“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都是切切实实新建的对象,不是字符串常量池的东西。