文档章节

hashCode方法总结

J
 J_Stone
发布于 2016/04/13 18:17
字数 432
阅读 38
收藏 0

hashCode

public class Object {
    public native int hashCode(); // 是Object对象的方法,有默认实现,但是native的。由内存地址计算而来。
}

所有

的类要么重写hashCode方法,要么调用Object的hashCode()方法。

public class _hashCodeTest {
    public static void main(String[] args) {
        System.out.println(new Integer(10).hashCode());//数字,返回自身  10
        System.out.println(new Integer(-10).hashCode());//数字,返回自身  -10
        System.out.println(new Boolean(true).hashCode());//1237
        System.out.println(new Boolean(false).hashCode());//1231
        System.out.println("5".hashCode()); // 字符串 53
        System.out.println("50".hashCode()); //字符串 1691

        System.out.println(new Student().hashCode());// 自定义1314
        System.out.println(new _hashCodeTest().hashCode()); //没有自定义,对象的内存地址计算而来
    }
}

class Student {
    @Override
    public int hashCode() {
        return 1314;
    }
}


Integer:

public final class Integer extends Number implements Comparable<Integer> {
    private final int value;
    public Integer(int value) {
        this.value = value;
    }
    @Override
    public int hashCode() {
        return Integer.hashCode(value);
    }
    //返回自身的值
    public static int hashCode(int value) {
        return value;
    }
}

Long类型:

public final class Long extends Number implements Comparable<Long> {
    //1 保证了 如果value在int范围内,则hash值不变
public static int hashCode(long value) {
    return (int)(value ^ (value >>> 32)); // 如果在int范围内,则高位的32位都是0, 通过无符号右移32位后,变为0
    // 和原来的值做异或运算.(两个操作数的位中,相同则结果为0,不同则结果为1).
}
    @Override
    public int hashCode() {
        return Long.hashCode(value);
    }
}


Boolean:

public final class Boolean implements java.io.Serializable,
                                      Comparable<Boolean> {
     @Override
    public int hashCode() {
        return Boolean.hashCode(value);
    }    
    //返回固定的值。true:1231 false:1237 , 为什么是这两个数
    public static int hashCode(boolean value) {
        return value ? 1231 : 1237;
    }                                 
}

String类型:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    
        public int hashCode() {
        int h = hash;
        //1 hash作为一个成员, 每次调用hashCode(), 都检查h == 0,优化性能,避免重复计算
        if (h == 0 && value.length > 0) {
            char val[] = value;
           
            //2 遍历整个字符数组
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i]; //3 字符就是整数
            }
            hash = h;
        }
        return h;
    }
}


© 著作权归作者所有

J
粉丝 2
博文 167
码字总数 30214
作品 0
朝阳
私信 提问
hashCode和identityHashCode

参考网页 https://www.jianshu.com/p/ebf4d0b142ac hashCode参见 https://my.oschina.net/u/3866531/blog/3008217 identityHashCode:返回对象的hashCode,不管对象是否重写hashCode方法 id......

karma123
02/02
5
0
java中的==、equals()、hashCode()源码分析

在java编程或者面试中经常会遇到 == 、equals()的比较。自己看了看源码,结合实际的编程总结一下。 1. ==   java中的==是比较两个对象在JVM中的地址。比较好理解。看下面的代码: public c...

ForingY
2016/02/28
36
0
hashmap重写key的hashcode问题

今天看到这样一个问题: /*补充完该类,不修改main方法,使得get()方法可以取到值/ package test; import java.util.HashMap; import java.util.Map; public class StudentTest { private stat...

令飞
2015/04/12
1K
0
hashcode和equals的理解

属性值相等的两个对象,分别放进List和Set Set集合: 两个对象的equals和hashcode都相等,才认为是同一个对象; 如果equals为false,则不管hashcode什么结果,Set size为2; 如果equals为tru...

Nob
2014/08/19
154
0
为什么覆盖equals时也要覆盖hashCode方法

看了《effective java》第九条。特此对equals方法和hashCode方法做此总结 现在假设我们有一个矩形类Rectangle public class Rectangle { } 先回顾下我们为什么要覆盖equals方法呢?现在我们有...

gkmmg
2018/05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何有效地计算JavaScript中对象的键/属性数量?

计算对象的键/属性数的最快方法是什么? 是否可以在不迭代对象的情况下执行此操作? 即不做 var count = 0;for (k in myobj) if (myobj.hasOwnProperty(k)) count++; (Firefox确实提供了一...

技术盛宴
20分钟前
2
0
百度网址安全中心拦截解除的办法分享

临近2019年底,客户的公司网站被百度网址安全中心拦截了,公司网站彻底打不开了,影响范围很大,于是通过朋友介绍找到我们SINE安全公司寻求帮忙解封,关于如何解除百度的安全拦截提示,下面就...

网站安全
32分钟前
3
0
Tomcat8源码分析-启动流程-start方法

上一篇:Tomcat8源码分析-启动流程-load方法 前面讲了启动流程中的Catalina.load,进一步调用绝大部分组建的init操作,主要完成对server.xml解析,并根据解析的结果结合设置的Rule(规则)构造...

特拉仔
40分钟前
6
0
Xamarin.FormsShell基础教程(7)Shell项目关于页面的介绍

Xamarin.FormsShell基础教程(7)Shell项目关于页面的介绍 轻拍标签栏中的About标签,进入关于页面,如图1.8和图1.9所示。它是对应用程序介绍的页面。 该页面源自Views文件夹中的AboutPage.x...

大学霸
47分钟前
3
0
一步一步理解Impala query profile(一)

很多Impala用户不知道如何阅读Impala query profile来了解一个查询背后正在执行的操作,从而在此基础上对查询进行调优以充分发挥查询的性能。因此我想写一篇简单的文章来分享我的经验,并希望...

九州暮云
48分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部