54、哈希值

一、哈希值:由本地操作系统给出的一个随机十进制数值(就是对象的逻辑地址,是模拟出来的地址,不是实际物理地址),在object里面有一个方法hashCode(),可以返回哈希值。
二、hashCode方法源码:
    public native int hashCode();
        native:代表该方法调用的是本地操作系统的方法
三、哈希表的特点就是速度非常快,JDK1.8之后:
    哈希表 = 数组 + 链表
    哈希表 = 数组 + 红黑树(JDK1.8) =》
    数组会将hash code相同的放在同一个数组位置,如果同一个哈希值数组下的元素超过8个,就会把链表转换成红黑树

四、有两个特殊字符的哈希值竟然相等:"重地"、“通话”

764977973
381259350
============================
cn.lwgk.Set05.HashCode02Person@2d98a335
cn.lwgk.Set05.HashCode02Person@16b98e56
==================================
字符st1:96354
字符st2:96354
==================================
重地:1179395
通话:1179395

public class HashCode02Person {
    /*任何类都继承了object类,它包含了hashCode()、toString()等方法,因此可以重载*/

    /*@Override
    public int hashCode() {
        System.out.println(1);
    }*/
}
public class HashCode02 {
    public static void main(String[] args) {
        HashCode02Person p1 = new HashCode02Person();
        HashCode02Person p2 = new HashCode02Person();

        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());
        System.out.println("============================");
        /*
        * object类的toString就调用了hashCode方法,这里打印的是十六进制
        * public String toString() {
            return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
        }
        * */
        System.out.println(p1);
        System.out.println(p2);

        //字符串类重写了hashcode方法,而字符串内容相同在字符串池的地址就一样,所以hashCode值一样
        System.out.println("==================================");
        String st1 = "abc";
        String st2 = "abc";
        System.out.println("字符st1:" + st1.hashCode());
        System.out.println("字符st2:" + st2.hashCode());

        //有两个特殊的字符,它们的hashCode值竟然一样
        System.out.println("==================================");
        System.out.println("重地:" + "重地".hashCode());
        System.out.println("通话:"+ "通话".hashCode());
    }
}

输出:

764977973
381259350
============================
cn.lwgk.Set05.HashCode02Person@2d98a335
cn.lwgk.Set05.HashCode02Person@16b98e56
==================================
字符st1:96354
字符st2:96354
==================================
重地:1179395
通话:1179395

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值