比较俩个对象是否相等
2014-05-19 22:22
155 查看
检查对象是否相等
关系运算符==和!=也适用于所有对象,但它们的含义通常会使初涉Java领域的人找不到北。下面是一个例子:
其中,表达式System.out.println(n1 == n2)可打印出内部的布尔比较结果。一般人都会认为输出结果肯定先是true,再是false,因为两个Integer对象都是相同的。但尽管对象的内容相同,句柄(可以理解为两个对象在内存中的地址)却是不同的,而==和!=比较的正好就是对象句柄。所以输出结果实际上先是false,再是true。这自然会使第一次接触的人感到惊奇。
若想对比两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都适用的特殊方法equals()。但这个方法不适用于“主类型”,那些类型直接使用==和!=即可。下面举例说明如何使用:
正如我们预计的那样,此时得到的结果是true。但事情并未到此结束!假设您创建了自己的类,就象下面这样:
此时的结果又变回了false!这是由于equals()的默认行为是比较句柄。所以除非在自己的新类中改变了equals()和 hashcode()方法,否则不可能表现出我们希望的行为。
重写equals()和 hashcode()方法
但要注意equals()的这种行为方式同时或许能够避免一些“灾难”性的事件。
对于Object类,它提供了一个最最严密的实现,那就是只有是同一对象是,equals方法才返回true,也就是人们常说的引用比较而不是值比较。这个实现严密得已经没有什么实际的意义,所以在具体子类(相对于Object来说)中,如果我们要进行对象的值比较,就必须实现自己的equals方法。
大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄。
关系运算符==和!=也适用于所有对象,但它们的含义通常会使初涉Java领域的人找不到北。下面是一个例子:
//: Equivalence.java public class Equivalence { public static void main(String[] args) { Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1 == n2); System.out.println(n1 != n2); } }
其中,表达式System.out.println(n1 == n2)可打印出内部的布尔比较结果。一般人都会认为输出结果肯定先是true,再是false,因为两个Integer对象都是相同的。但尽管对象的内容相同,句柄(可以理解为两个对象在内存中的地址)却是不同的,而==和!=比较的正好就是对象句柄。所以输出结果实际上先是false,再是true。这自然会使第一次接触的人感到惊奇。
若想对比两个对象的实际内容是否相同,又该如何操作呢?此时,必须使用所有对象都适用的特殊方法equals()。但这个方法不适用于“主类型”,那些类型直接使用==和!=即可。下面举例说明如何使用:
//: EqualsMethod.java public class EqualsMethod { public static void main(String[] args) { Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1.equals(n2)); } }
正如我们预计的那样,此时得到的结果是true。但事情并未到此结束!假设您创建了自己的类,就象下面这样:
//: EqualsMethod2.java class Value { int i; } public class EqualsMethod2 { public static void main(String[] args) { Value v1 = new Value(); Value v2 = new Value(); v1.i = v2.i = 100; System.out.println(v1.equals(v2)); } }
此时的结果又变回了false!这是由于equals()的默认行为是比较句柄。所以除非在自己的新类中改变了equals()和 hashcode()方法,否则不可能表现出我们希望的行为。
重写equals()和 hashcode()方法
public int hashCode() { final int prime = 31; int result = 1; result = prime * result + i; return result; } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Value other = (Value) obj; if (i != other.i) return false; return true; }
但要注意equals()的这种行为方式同时或许能够避免一些“灾难”性的事件。
对于Object类,它提供了一个最最严密的实现,那就是只有是同一对象是,equals方法才返回true,也就是人们常说的引用比较而不是值比较。这个实现严密得已经没有什么实际的意义,所以在具体子类(相对于Object来说)中,如果我们要进行对象的值比较,就必须实现自己的equals方法。
大多数Java类库都实现了equals(),所以它实际比较的是对象的内容,而非它们的句柄。
相关文章推荐
- java 比较两个对象是否相等
- 对象之间如何比较是否相等?
- Set 判断俩个对象是否相等
- JS中如何比较两个Json对象是否相等
- JS中如何比较两个Json对象是否相等实例代码
- 比较BigDecimal对象是否相等
- JavaScript比较两个对象是否相等
- 比较两个对象的内容是否相等 重写object 的equals方法
- C#使用Equals()方法比较两个对象是否相等的方法
- 比较两个Json对象是否相等
- 比较二个对象值是否相等
- 关于直接比较两个对象是否相等或则说List集合里是否包含某个对象的问题
- 比较二个对象的每个值是否相等
- 比较两个Image对象是否相等、xib中设置自定义整个cell的高度
- 验证是否是类,对象是否对消息有回复,是否是接口,,比较两个对象是否相等,复制对象
- 比较一个对象list中的id值和List<Integer>的值是否相等
- 深入java的equals方法,怎么比较两个对象的内容是否相等?对象的内容指的是什么?
- 比较任意两个JSON串是否相等(比较对象是否相等)JAVA版
- Java 比较两个对象是否相等【含字符串,区分与不区分大小写】
- 比较两个Json对象是否相等