A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 闪电博尔特 中级黑马   /  2014-7-30 11:51  /  1183 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

既然hashCode只在实现哈希算法的集合中使用那么实际开发中一个类到底要不要复写hashCode呢,对于没有实现哈希算法的类 写与不写有何区别,

6 个回复

倒序浏览
具体情况是需求而定,毕竟以后代码扩展谁也不知道是否需要实现哈希算法,写了总比不写强压
回复 使用道具 举报
由于Object类是所有类的父类  所以我们自己写的类也是继承这个类的 这个类中本身就已经实现了hashCode()方法    我们不写hashCode()方法 那就是没有覆盖父类的hashCode()方法     当实现hash算法的时候 可以选择重写 这个方法     
回复 使用道具 举报
按照规范,如果你重写了equals,就必须重写hashCode。就像String类做的那样
回复 使用道具 举报
在使用了哈希算法的集合里,只要你覆写了equals方法,就一定要覆写hashcode方法
回复 使用道具 举报
如果你用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:15
7#
如果目前不需要用到哈希算法,则写与不写都可以,但一般情况下,建议还是复写hashCode()方法,实现了这样一个功能后,利于以后的功能扩展。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马