• J2EE 第八周(04.23-04.29)


    1.分析代码

    public final class LineItemKey implements Serializable {
    private Integer customerOrder;
    private int itemId;
    public LineItemKey() {}
    public LineItemKey(Integer order, int itemId) {
    this.setCustomerOrder(order);
    this.setItemId(itemId);
    }
    @Override
    public int hashCode() {
    return ((this.getCustomerOrder() == null
    ? 0 : this.getCustomerOrder().hashCode())
    ^ ((int) this.getItemId()));
    }
    @Override
    public boolean equals(Object otherOb) {
    if (this == otherOb) {
    return true;
    }
    if (!(otherOb instanceof LineItemKey)) {
    return false;
    }
    LineItemKey other = (LineItemKey) otherOb;
    return ((this.getCustomerOrder() == null
    ? other.getCustomerOrder() == null : this.getCustomerOrder()
    .equals(other.getCustomerOrder()))
    && (this.getItemId() == other.getItemId()));
    }
    @Override
    public String toString() {
    return "" + getCustomerOrder() + "-" + getItemId();
    }
    /* Getters and setters */
    }

    什么是HashCode:

    1、HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的

    2、如果两个对象equals相等,那么这两个对象的HashCode一定也相同

    3、如果对象的equals方法被重写,那么对象的HashCode方法也尽量重写

    4、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置

    HashCode有什么用

    回到最关键的问题,HashCode有什么用?不妨举个例子:

    1、假设内存中有0 1 2 3 4 5 6 7 8这8个位置,如果我有个字段叫做ID,那么我要把这个字段存放在以上8个位置之一,如果不用HashCode而任意存放,那么当查找时就需要到8个位置中去挨个查找

    2、使用HashCode则效率会快很多,把ID的HashCode%8,然后把ID存放在取得余数的那个位置,然后每次查找该类的时候都可以通过ID的HashCode%8求余数直接找到存放的位置了

    3、如果ID的HashCode%8算出来的位置上本身已经有数据了怎么办?这就取决于算法的实现了,比如ThreadLocal中的做法就是从算出来的位置向后查找第一个为空的位置,放置数据;HashMap的做法就是通过链式结构连起来。反正,只要保证放的时候和取的时候的算法一致就行了。

    4、如果ID的HashCode%8相等怎么办(这种对应的是第三点说的链式结构的场景)?这时候就需要定义equals了。先通过HashCode%8来判断类在哪一个位置,再通过equals来在这个位置上寻找需要的类。对比两个类的时候也差不多,先通过HashCode比较,假如HashCode相等再判断equals。如果两个类的HashCode都不相同,那么这两个类必定是不同的。

    当我们向一个集合中添加某个元素,集合会首先调用hashCode方法,这样就可以直接定位它所存储的位置,若该处没有其他元素,则直接保存。若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,相同则不存,不同则散列到其他位置。这样处理,当我们存入大量元素时就可以大大减少调用equals()方法的次数,极大地提高了效率。

    所以hashCode在上面扮演的角色为寻域(寻找某个对象在集合中区域位置)。hashCode可以将集合分成若干个区域,每个对象都可以计算出他们的hash码,可以将hash码分组,每个分组对应着某个存储区域,根据一个对象的hash码就可以确定该对象所存储区域,这样就大大减少查询匹配元素的数量,提高了查询效率。这里由于customerOrder和itemId一起组成一个复合键来标示一个实体,所以如果customerOrder不存在则返回0,如果存在则返回customerOrder的hash值^itemId的数值。

    equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。这里是比较两个对象是否相同,如果相同则返回true,如果不相同则返回false。

  • 相关阅读:
    tomcat的部署的三种方式
    烤肉说
    抽象思维
    如何沟通
    如何学习
    道别信
    不要将预感抹杀
    OpenCV 用cv::IMREAD_GRAYSCALE与cv::cvtColor转灰度得到灰度图不一致问题
    Qt 文件夹不存在,创建文件夹,文件不存在,创建文件
    Qt 一个信号对应多个槽,多个信号对应一个槽的执行顺序
  • 原文地址:https://www.cnblogs.com/cactus20/p/9035785.html
Copyright © 2020-2023  润新知