浅谈Java对象的比较
在Java中,对象的比较可以分为两种:==运算符和equals()方法比较。
== 运算符
== 运算符比较的是两个对象在内存中的引用地址是否相同,如果两个对象的引用地址相同,那么返回true,否则返回false。在实际应用中,== 运算符主要用于判断两个对象是否是同一个对象。
下面是一个示例,我们创建两个Person对象,然后用 == 运算符比较它们的引用地址:
Person person1 = new Person("Tom", 18);
Person person2 = new Person("Tom", 18);
System.out.println(person1 == person2); // false
由于person1和person2是两个不同的对象,即使它们的属性值相同,但是它们的引用地址不同,因此 == 运算符返回false。
equals() 方法
equals() 方法比较的是两个对象的内容是否相同,如果两个对象的内容相同,那么返回true,否则返回false。在实际应用中,equals() 方法用于比较两个对象是否等价。
Java中的所有类都继承了Object类,Object类中的equals()方法实现的比较是两个对象的引用地址是否相同,因此如果我们希望实现equals()方法的比较,需要在子类中重写equals()方法。
下面是一个示例,我们创建一个Person类并重写其equals()方法,然后创建两个Person对象,用equals()方法比较它们的内容是否相同:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
}
Person person1 = new Person("Tom", 18);
Person person2 = new Person("Tom", 18);
System.out.println(person1.equals(person2)); // true
由于我们在Person类中重写了equals()方法,对name和age进行了比较,因此person1和person2的内容相同,equals()方法返回true。
总结
在实际应用中,我们需要根据具体的需求选择使用 == 运算符或equals()方法进行对象的比较。如果我们希望比较两个对象是否为同一对象,使用==运算符;如果我们希望比较两个对象的内容是否相同,使用equals()方法。
另外,需要注意的是,在重写equals()方法时需要同时满足以下条件:
- 自反性:对于任意的引用值x,x.equals(x)的结果应该为true。
- 对称性:对于任意的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)也应该返回true。
- 传递性:对于任意的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也应该返回true。
- 一致性:如果两个对象的值没有发生变化,多次调用equals()方法应该返回相同的结果。
- 非空性:对于任意的非空引用值x,x.equals(null)的结果应为false。
示例
下面是一个字符串比较的示例,使用==运行符进行比较:
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
由于字符串常量池的存在,s1和s2引用的是同一个字符串对象,因此使用==运算符比较返回true。而s3是动态生成的字符串对象,因此和s1不是同一个对象,返回false。
再来一个字符串比较的示例,使用equals()方法进行比较:
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
System.out.println(s1.equals(s2)); // true
System.out.println(s1.equals(s3)); // true
由于String类已经重写了equals()方法,因此可以直接使用它进行字符串的比较。s1和s2的内容相同,因此返回true。s1和s3的内容也相同,因此返回true。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈java对象的比较 - Python技术站