问题:如何理解
String str=new String("x");
和
String str="x";
在计算机的内存中有堆和栈两块空间,其中栈中存放所有对象、函数、变量等的饮用;而堆中存放对象、值等。
不管是new出的对象还是用类似String str = "x";这类的对象,都是放在堆中的。
举一个简单的例子:
String str1 = "x" ;
String str2 = "x" ;
String str3 = new String("x") ;
表面上看这三句回实例化3个String对象,实际上是两个。在java中有一个叫“字符数据池”的内存管理机制,在对str2赋值之前,会检查池中有没有相同的数据,如果有,则直接引用;若没有,系统会实例化这个String的对象;而执行到String str3 = new String("x") ;系统会直接实例化该对象,而不会在池中查找。也不会将这个对象放在池中。
你可能会问,如果改动str1或str2时会不会改动另外一个引用的值。答案是不会。系统会首先在池中查找有没有相同的对象,如果没有,会实例化这个对象。
补充一:
注意,对于new出来的对象则要小心。
如
String str3 = new String("x") ;
String str4 = new String("x") ;
System.out.println(str4==str3);
它的打印结果肯定是false;因为此时new出来的对象并不在一个位置,并不用去检查字符数据池。所以为false。
只有在执行:
System.out.println(str3.equals(str4));时其值才为true。