Java - hashCode() - equals()

来源:互联网 发布:网络协议分析实验步骤 编辑:程序博客网 时间:2024/05/17 20:31

理论

Object类的equals()特点自反省:x.equals(x)返回真;对称性:x.equals(y)返回真,那么y.equals(x)也返回真传递性:x.equals(y)返回真,y.equals(z)返回真,那么x.equals(z)也返回真一致性:x.equals(y)第一次调用返回真,那么不管调用多少次都应该返回真,前提是x和y不修改对于非空引用x:x.equals(null),都返回falseObject类的hashCode()的特点如果我们重写了equals(),那么也需要重写hashCode(),反之亦然在Java应用程序一次执行过程当中,对于同一个对象的hashCode()的多次调用,他们应该返回同样的值(前提是该对象的信息没有发生变化)对于两个对象来说,如果使用equals()返回true,则hashCode值一定相同如果使用equals()返回false,则hashCode可以相同也可以不同,不同的话则可以提高性能对于Object来说,不同Object对象的hashCode值是不相同的,因为Object类的hashCode值表示的是对象的地址

案例

import java.util.HashSet;import java.util.Set;public class MyHashSet {public static void main(String[] args) {Set<Person> set1 = new HashSet<Person>();set1.add(new Person("lwc"));set1.add(new Person("lwc"));System.out.println(set1);// 增加个两// String也重写了equals()和hashCode()Set<String> set2 = new HashSet<String>();set2.add(new String("aaa"));set2.add(new String("aaa"));System.out.println(set2);// 增加一个// 重写了equals()和hashCode()Set<Student> set3 = new HashSet<Student>();set3.add(new Student("lwc"));set3.add(new Student("lwc"));System.out.println(set3);// 增加一个}}class Person {String name;public Person(String name) {this.name = name;}}class Student {String name;public Student(String name) {this.name = name;}@Overridepublic int hashCode() {return this.name.hashCode();}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (null != obj && obj instanceof Student) {Student stu = (Student) obj;name.equals(stu.name);return true;}return false;}}

== VS equals()

两个基本类型使用==,比较值是否相等两个引用类型使用==,比较是否是同一个对象两个字符串类型使用equals(),是比较内容是否相同两个其他引用类型使用equals(),如果没有重写equals(),默认比较是否是同一个对象

原创粉丝点击