package chap6_2;
public class EqualTest {
public static void main(String[] args)
{
int it=65;
float f1=65.0f;
System.out.println("65和65.0f是否相等?"+(it==f1));
char ch='A';
System.out.println("65和'A'是否相等?"+(it==ch));
String str1=new String("hello");
String str2=new String("hello");
System.out.println("str1和str2是否相等?"+(str1==str2));
System.out.println("str1是否equals str2?"+(str1.equals(str2)));
// System.out.println("hello"==new EqualTest());
}
}
运行结果
65和65.0f是否相等?true
65和'A'是否相等?true
str1和str2是否相等?false
str1是否equals str2?true
对于str1和str2,因为他们都是引用类型变量,他们分别指向两个通过new关键字创建的String对象,因此str1和str2两个变量不相等。
当Java程序直接使用形如“hello”的字符串直接量,包括可以在编译时就计算出来的字符串值时,JVM将会使用常量池来管理这些字符串,当使用new String(“hello”)时,JVM会先使用常量池来管理”hello”直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。
package chap6_2;
public class StringCompareTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1="疯狂Java";
String s2="疯狂";
String s3="Java";
String s4="疯狂"+"Java";
String s5="疯"+"狂"+"Java";
String s6=s2+s3;
String s7=new String("疯狂Java");
System.out.println(s1==s4);
System.out.println(s1==s5);
System.out.println(s1==s6);
System.out.println(s1==s7);
}
}
运行结果
true
true
false
false
package chap6_2;
class Person {
public boolean equals(Object obj) {
return true;
}
}
class Dog {
};
public class OverrideEqualsError {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p = new Person();
System.out.println("Person对象是否equals Dog对象" + p.equals(new Dog()));
System.out.println("Person对象是否equals String对象"
+ p.equals(new String("Hello")));
}
}
运行结果
Person对象是否equals Dog对象true
Person对象是否equals String对象true
package chap6_2;
class Person
{
private String name;
private String idStr;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name,String idStr)
{
this.name=name;
this.idStr=idStr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdStr() {
return idStr;
}
public void setIdStr(String idStr) {
this.idStr = idStr;
}
public boolean equals(Object obj)
{
if(this==obj){
return true;
}
if(obj!=null&&obj.getClass()==Person.class)
{
Person personObj=(Person)obj;
if(this.getIdStr().equals(personObj.getIdStr()))
{
return true;
}
}
return false;
}
}
public class OverrideEqualsRight {
public static void main(String [] args)
{
Person p1=new Person("孙悟空","13234343554");
Person p2=new Person("孙行者","13234343554");
Person p3=new Person("孙悟饭","0043554");
System.out.println("p1和p2是否相等?"+p1.equals(p2));
System.out.println("p2和p3是否相等?"+p2.equals(p3));
}
}
p1和p2是否相等?true
p2和p3是否相等?false
对于重写equals()方法的要求而言,通常要求两个对象是同一个类的实例,因此使用instanceof运算符不太合适,改为使用t.getClass()==Person.class比较合适。
通常重写equals()方法应该满足下列条件
自反性
对称性
传递性
一致性
对任何不是null的x,x.equals(null)一定返回false