• [Java复习]Hashcode


    昨天面试被问到Object中的hashcode的作用,之前并没有注意到。今天做一个总结

    hashcode():返回对象的hash码值。从object中继承过来,默认使用对象的地址计算散列码及hash地址。

    在java的Collection中大体分为:Set、List、Map三种体系,其中Set是无序不可重复集合,List为有序重复集合,Map代表键值对。

    对于不可重复的集合,是如何实现元素不重复的呢?JVM通过hash的方式,查看hash地址上是否有内容,如果没有的话就认为不存在相同的内容。

    在object类中定义为:public native int hashCode();可见是native方法,实现是根据本地机器相关的。

    注意,hash后的地址不一定是实际的内存地址

    equals():谈到hashcode就不能不关注equals,equals方法对两个对象的地址进行比较,判断是否相同。(注意对于String,Math,Integer,Double这些封装类在使用equals时已经覆盖了object的equals方法)

    在object中定义为:

    public boolean equals(Object obj) { 
        return (this == obj); 
    }

    对于hashcode和equals我理解一个是逻辑地址,一个是实际地址。equlas相等必须是对象值相同,且地址也是相同的。如果两个对象equals,java环境会认为他们的hashcode一定相等,所以如果重写equals方法那么一定要重写hashcode方法。但是两个对象不equals,但是hashcode有可能相等。hashcode是否相等,跟equals是否相等无关。

    从hashcode有引申到最近的hashdos攻击:在多数web容器的设计中,request是依靠相应语言的hashtable/hashmap实现的,当不同的key存入是如果hash值相同则每次都要解决冲突hash表被变为一个普通链表,原来的O(1)读取会变成O(n)的读取。
    官方解决办法:限制最大请求body大小,限制请求的参数个数 
    我给出的解决方法:把大hash表变成n个小hash表,一个key值先做一次hash计算要放到哪个小hash表中,然后再做一次hash得到真实的hash地址。这样做的好处是,增加攻击难度即使有攻击影响的范围也不大。但是有一个问题是hash地址将由两部分组成,存储和计算都要重新设计。
  • 相关阅读:
    vue2 在methods 中无法获取this对象
    mysql-set
    laravel 模板
    laravel save() 返回 null
    如何设置电脑允许远程访问并修改电脑用户密码?
    laravel报错:Unable to detect application namespace.
    b站操作系统2程序的顺序执行与并发执行
    b站计算机网络谢希仁4物理层
    b站计算机网络谢希仁2性能
    b站J数据库13之封装通用的增删改查方法
  • 原文地址:https://www.cnblogs.com/doublesong/p/3360972.html
Copyright © 2020-2023  润新知