- Java code
//Person类public class Person { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return name + "===========" + age; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }}
- Java code
//Test(主类)import java.util.HashSet;import java.util.Set;public class Test { public static void main(String[] args) { Set<Person> set = new HashSet<Person>(); set.add(new Person("李四",3)); set.add(new Person("张三",2)); set.add(new Person("张三",2)); set.add(new Person("王五",4)); System.out.println(set.toString()); }}
为什么Set去重复的时候,必须重写equals和hashCode方法,只重写equals把比较地址改变为比较内容不就够了吗?
就算要重写equals,重写的里面是什么意思呢?
------解决方案--------------------
因为一般情况下认为:hashCode的比较性能比equals高一个数量级,所以先用hashCode做比较能大大提升效率,尤其是不相等的情况。
举例来说:假设两个String:A B,长度都为 1000 字符。
那么hashCode比较就是一次 int 等值比较,这里要先说明String的hashCode是早就生成好的,且由于String是不可修改的,因此hashCode也不需要再次计算了。
而再想想equals,最坏情况下则是必须遍历999个字符才发现,哦这两个字符串不相等。