浅谈equals和==的关系和区别
1.在java的基本类型中,==用来比较值。(这也是我们最常用的)
普通类型用==比较即可
int ia=3;
int ib=3;
boolean g=(ia==ib);
System.out.println(g);
true
2.在普通类的对象引用,如果该类不重写equals方法,==和equal具有相同作用。
都用于比较的是对象的内存地址
//Objec类中,equal方法的定义
public boolean equals(Object obj) {
return (this == obj);
}
3.在String类的对象引用比较,==用于比较对象引用内存和equals用于比较对象的值
想在String中比较两个对象值是否相等,使用equals
下面使用==以及equals对String实例进行比较。可得equals是比较值,==用于比较对象引用指向的内存
public class StringApi {
public static void main(String[] args) {
//通过构造方法创建String实例
String string1=new String("cde");
String string2=new String("cde");
//通过直接给String对象赋值,等价于String(char[] c);
String string3="cde";
String string4="cde";
//通过把旧实例赋值给实例
String string5=string1;
String string6=string3;
System.out.println(string1==string2); //false
System.out.println(string1==string3); //false
System.out.println(string1==string5); //true
System.out.println(string2==string5); //false
System.out.println(string4==string6); //true
System.out.println();
System.out.println(string1.equals(string2)); //true
System.out.println(string1.equals(string3)); //true
System.out.println(string1.equals(string5)); //true
}
}
String类中重写了equals方法,用于比较字符串的值
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
//判断传入的对象是否String类实例或者子类实例
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
//判断传入对象与调用对象的内容是否一致
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
对于用==时,string1==string5比较结果相同的浅析
因为String太过常用,JAVA类库的设计者在实现时做了个小小的变化,即采用了享元模式,每当生成一个新内容的字符串时,他们都被添加到一 个共享池中,当第二次再次生成同样内容的字符串实例时,就共享此对象,而不是创建一个新对象,这样的做法仅仅适合于通过=符号进行的初始化。因此它们指向的地址是一致的,因此它们的比较出现结果相同
Java中,“==”运算符用来比较两个引用以查看它们是否指向同一个内存对象。而对于String实例,运行时状态会尽可能地确保任意两个具有相同字符信息的String字面值指向同一个内部对象。此过程称为驻留(interning),但是它并不有助于每个String的比较。一个原因是垃圾收集器线程删除了驻留值,另一个原因是String所在的位置可能被一个由String构造函数创建的新实例占用。如果是这样,“==”将总是返回false。