public class test {
public static void main(String[] args) {
String a=new String("123");
String b=new String("123");
String c="123";
String d="123";
System.out.println(a==b); //false
System.out.println(a.equals(b)); //true
System.out.println(c==d); //true
System.out.println(c.equals(d)); //true
}
}这两种定义变量有什么区别呢?为什么第一个是false,后面的两个是true。
a, b 是两个不同的引用
String s = “aaa”与 String s = new String(“aaa”);区别:
前者是在String Pool中检查是否有aaa这个对象,如果有,则在地址池中把地址返回给s这个引用,如果没有,则在地址池中生成aaa这个对象,同时把地址返回给s这个引用。
后者是判断在String Pool中检查是否有aaa这个对象,如果有,就直接在heap堆中生成一个“aaa”的对象,然后把地址返回给s这个引用,如果没有,首先在String Pool中生成创建一个“aaa”对象,然后再堆heap中再创建这个aaa对象,把地址返回来,赋给s这个引用。String a=new String("123");
String b=new String("123");
结果为false,因为a和b指向堆中的对象不同,尽管他们在String Pool 字符串池中的对象是一样的。String c="123";
String d="123";
结果为true,因为执行String c = "123"时候,在字符串池中生成了“123”这个对象,第二语句String d="123";由于检查String Pool中存有“123”这个对象了,所以直接把地址返回赋个d,这样c和d就具有相同的地址了,所以他返回true注意String Pool是在内存的栈中,new一个对象的话是在 heap堆中生成对象的。
http://bbs.csdn.net/topics/390290120
String类型的比较最好是用equals比较,很多时候用==会报错。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
String a=new String("123");
String b=new String("123");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
String b = new String("123"); String c = "123";
String d = "123"; System.out.println(a == b); // false
//a VS b 不相等是因为new的时候,在堆中都会创建对应的对象,它们的引用都指向独自的对象,a VS b也就是对象地址值,当然不相等。
System.out.println(a.equals(b)); // true
// 你可以查看源代码,String类重写了 Object 类的equals()方法,也就是说如果它们的字符串的值相等就会返回true。
System.out.println(c == d); // true
//当创建c时,会在常量池中检查有没有"abc"的字符串字面量,因为没有则创建,同理创建d时,因为已经有了,所以不再创建,所以 c 和 d 都指向同一个对象.
System.out.println(c.equals(d)); // true
//只要是 字符串字面量相等,equals方法就会return true.说的很清楚了哦。
String.intern()
的说明,也有点意思。
两个不同的对象拥有相同的值 这时==为true,equals为false
两个不同的对象拥有不同的只 这时==为false,equals为false
两个相同的对象不可能拥有不同的值 所以这时==为true,equals为true
当字符串不是通过new String();得到的话,可以用 == 比较,也可以用equals()方法比较。
当字符串是通过new String();得到的话,一定要用equals()方法。总结:
== 是用来比较地址或者引用;
equals() 是用来比较字符串的值或引用。 希望对你有帮助!
String b=new String("123");
分别创建了两个对象 a 和 bString c="123";
String d="123";
为两个指针指向了虚拟机堆中的同一个对象。==比较的是对象在堆中的地址,所以a 和 b 的地址不同,而c 和 d 的地址相同。在看看String的equals方法 先比较地址,如果地址不等再比较对象的相同位置的字符。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
String b=new String("123");
虽然在内存中有两个对象,但是线程池中只有一个123 这样做是为了节约资源,一般判断字符串相同用equals
String c="123";
String d="123";
为什么这两个用==判断会是true,
如果按照上面几位的说法,难道改c的值d也会跟着变?
但是测试的话是不会变的。
这个String也不可能是基本类型。
这个问题有深入的讲解。