java中hashCode的作用

java中hashCode的作用:

1、Java对象的存储是存在内存当中,可当我们要查找一个对象时,按照常规思路,我们需要把要查找的对象与内存中的对象一一匹配.但是这样的匹配会占用较多的时间。
2、所以,加入我们把内存分为很多区域,一个区域又可以存放很多对象,在查找想要对象时,我们只需要知道对象在那块区域,然后在那块区域和其他对象一一匹配就行,这样极大节约了时间。
3、hashCode()方法就是计算在哪块区域的;equals()方法就是进行匹配
4、重写了equals()方法就必须重写hashCode()方法。原因:如果我们只重写equals()方法。不重写hashCode()方法就无法计算
得到我们要查找的对象和目标对象是否在同一块区域,没有在同一块区域计算机就没法调用equals()方法进行匹配。

下面举个例子:
Set类型的集合里面的对象不能重复。

package com.yiheng.Test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashTest {

    private int i;

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }

    //重写hashCode——找篮子
    @Override
    public int hashCode() {
        return 1%10;
    }

    //重写equals——具体匹配
    @Override
    public boolean equals(Object obj) {

        //返回true,计算机就认为该区域有和obj一样的对象了;
        //返回false,认为该区域没有和obj一样的对象
        if(obj==null){
            return false;
        }
        if(obj==this){
            return true;
        }
        if(!(obj instanceof HashTest)){
            return false;
        }
        HashTest other=(HashTest)obj;
        //判断b对象与a对象的i值是否相等,如果i值相等,两对象就一样,
        if(other.getI()==this.getI()){
            return true;
        }
        return false;

        //Java原装的equals()方法使用==来比较的,这样比较是比较内存中的地址。
        //显然a与b的内存是不一样的,所以当我们只重写了hashCode()方法,没重写equals方法,返回值是false;
        //return (this == obj);
    }

    public static void main(String[] args) {
        HashTest a = new HashTest();
        HashTest b = new HashTest();

        a.setI(1);
        b.setI(1);

        //Set集合就是不能含有相同的对象,如果有相同的对象,就不叫Set了
        Set<HashTest> set = new HashSet<HashTest>();

        set.add(a);
        set.add(b);

        System.out.println(a.hashCode()==b.hashCode());
        System.out.println(a.equals(b));

        System.out.println(set);//输出的集合里面只有一个对象a。

        //用迭代器输出集合里面的对象
        Iterator<HashTest> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值