黑马程序员技术交流社区

标题: 关系hashCode [打印本页]

作者: 闪电博尔特    时间: 2014-7-30 11:51
标题: 关系hashCode
既然hashCode只在实现哈希算法的集合中使用那么实际开发中一个类到底要不要复写hashCode呢,对于没有实现哈希算法的类 写与不写有何区别,
作者: 南柯一梦    时间: 2014-7-30 14:27
具体情况是需求而定,毕竟以后代码扩展谁也不知道是否需要实现哈希算法,写了总比不写强压
作者: 刘沙    时间: 2014-7-30 14:32
由于Object类是所有类的父类  所以我们自己写的类也是继承这个类的 这个类中本身就已经实现了hashCode()方法    我们不写hashCode()方法 那就是没有覆盖父类的hashCode()方法     当实现hash算法的时候 可以选择重写 这个方法     
作者: fantacyleo    时间: 2014-7-30 15:06
按照规范,如果你重写了equals,就必须重写hashCode。就像String类做的那样
作者: DSY    时间: 2014-7-30 16:33
在使用了哈希算法的集合里,只要你覆写了equals方法,就一定要覆写hashcode方法
作者: java—family    时间: 2014-7-30 16:58
如果你用hashSet集合存储元素(对象),你不在元素那个类中复写hashcode 和equals 那么就不能保证元素的唯一性。   
那这个hashset集合就没意思了。
和你分享哈在hashset中存person对象

public class HashSetText {
//1.建立一个集合hashset  向里面添加元素
//2.往hashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。 hashSet  里用hashcode  equale 方法。
        public static void main(String[] args) {
                 //定义一个HashSet 类
                HashSet<Person>  hs = new HashSet<Person>();
                //添加元素
                hs.add(new Person("lisi", 25));
                hs.add(new Person("李四", 26));
                hs.add(new Person("旺旺", 21));
                hs.add(new Person("王五", 35));
                hs.add(new Person("狗蛋", 29));
                hs.add(new Person("lisi", 25));
                //迭代取出
                Iterator<Person> it = hs.iterator();
                while(it.hasNext()){
                        Person p = (Person)it.next();
                        System.out.println(p.getName()+":"+p.getAge());
                }


person类
package cn.itcast.collection;

public class Person extends Object/*implements Comparable*/ {
    private String name;
    private int age;
        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 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;
        }
       



}

如果你不在person类中复写  hashcode  和equlas  那么集合中就有两个 lisi   25.


作者: 晓风    时间: 2014-7-30 18:05
如果目前不需要用到哈希算法,则写与不写都可以,但一般情况下,建议还是复写hashCode()方法,实现了这样一个功能后,利于以后的功能扩展。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2