当前位置: 代码迷 >> J2SE >> 容器的小疑点
  详细解决方案

容器的小疑点

热度:156   发布时间:2016-04-24 01:46:43.0
容器的小问题
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个字符才发现,哦这两个字符串不相等。
  相关解决方案