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时会不会改动另外一个引用的值。答案是不会。系统会首先在池中查找有没有相同的对象,如果没有,会实例化这个对象。
public static void main(String[] arg) {
String b = "1";
// String a=new String("a");
int c = 1;
String a = String.valueOf(c); // a!=b
// String a= String.valueOf("1"); //a=b
if (a == b) {
System.out.print("a");
}
}