String str1="sdfdsf";
String str2="sdfdsf";System.out.println(str1==str2);
//结果是true啊,很奇怪了的啊
String str1=new String("sdfdsf");
String str2=new String("sdfdsf");
System.out.println(str1==str2);
//这是false我是知道的。
==不是原生类型的才比值的吗?
String str2="sdfdsf";和String str2=new String("sdfdsf");
有什么不同的啊
String str2="sdfdsf";System.out.println(str1==str2);
//结果是true啊,很奇怪了的啊
String str1=new String("sdfdsf");
String str2=new String("sdfdsf");
System.out.println(str1==str2);
//这是false我是知道的。
==不是原生类型的才比值的吗?
String str2="sdfdsf";和String str2=new String("sdfdsf");
有什么不同的啊
String str2="sdfdsf";他们在运行加载类的时候,会从常量池里找是否有相同的(为了节省空间), 所以地址是相同的第二个 new 的,因为从堆里面重新分配了,当然就不等(==)了,这也是 new 的特性
String str2="sdfdsf"; System.out.println(str1==str2); //所以相等
//结果是true啊,很奇怪了的啊
String str1=new String("sdfdsf"); //把"sdfdsf"做构造函数参数,在堆中申请2块内存,把字符串拷贝过去,str1和str2指向堆中不同的地方,所以不相等
String str2=new String("sdfdsf");
System.out.println(str1==str2);
//这是false我是知道的。
==不是原生类型的才比值的吗?
String str2="sdfdsf";和String str2=new String("sdfdsf");
有什么不同的啊
一个指向常量区
一个指向堆
String str2 = "sted"; 而言,你是把两个object instance都指向堆里的同一个对象。对于String str1=new String("sdfdsf");
String str2=new String("sdfdsf"); 而言,你是创建了四个object,其中str1指向第一个"sdfdsf” object,而str2指向第二个"sdfdsf" object.
详细请看:
http://z6688.com/info/42046-1.htm。
String str1="sdfdsf";
String str2="sdfdsf";
str1 == str2為true,因為兩個常量字符串相同,常量字符串放在string pool中,str2賦常量值時,會從string pool中查找,結果找到,故將池中的對象賦予str2引用
String str1="sdfdsf";
String str2="sdfdsf"; 应该是指向在同一个地址了 没有重新新建
String str2="sdfdsf";//这个是去常量池找有没有"sdfdsf",如果有的话直接把str2引用指向它,如里没有,就建一个,然后指向它
String str2=new String("sdfdsf"); //这个是在堆里开个空间存储"sdfdsf",每次new都会开一个
第二种情况是在堆中创建对象的同时,在常量池中也创建了一个对象,最后str1指向堆中创建的对象,str2指向另一个在堆中创建的对象所以不等
在第二种情况下是创建了三个对象,两个堆中,一个常量池中。
常量池的作用就是节省内存空间,而堆没有这个功能。
1楼的已经说的很清楚了,嘿嘿
看点书就会明白
这样就不会存在你上面的疑惑了。
String str2=new String("sdfdsf"); //同样的str2在stack创建临时变量,"sdfdsf"则是在heap区分配内存,然后str2指向该字符串