热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

当equals()使用相似性度量时,覆盖hashCode()以与equals()一致

如何解决《当equals()使用相似性度量时,覆盖hashCode()以与equals()一致》经验,请帮忙看看怎么搞?

假设我有一个带有颜色和模型字段的汽车.我需要将汽车存放在一个集合中,我将不会重复(没有2辆相同的汽车).在下面的示例中,我使用的是HashMap.

根据Java文档,如果我们有2个Car对象car1和car2这样car1.equals(car2) == true,那么它也必须持有它car1.hashCode() == car2.hashCode().因此,在这个例子中,如果我想只是它们的颜色比较汽车,那么我会只用色域的equals()hashCode(),正如我在我的代码做了,而且它完美的罚款.

public class Car {
String color;
String model;

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((color == null) ? 0 : color.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Car other = (Car) obj;
    if (color == null) {
        if (other.color != null)
            return false;
    } else if (!color.equals(other.color))
        return false;
    return true;
}

public Car(String color, String model) {
    super();
    this.color = color;
    this.model = model;
}

@Override
public String toString() {
    return color + "\t" + model;
}

public static void main(String[] args) {
    Map cars = new HashMap();
    Car a = new Car("red", "audi");
    Car b = new Car("red", "bmw");
    Car c = new Car("blue", "audi");
    cars.put(a, a);
    cars.put(b, b);
    cars.put(c, c);
    for(Car car : cars.keySet()) {
        System.out.println(cars.get(car));
    }

}

}

输出是:

红宝马

蓝色奥迪

正如所料.

到目前为止这么好.现在,我正在尝试比较2辆汽车的其他方法.我提供了测量2辆车之间相似性的功能.为了论证,我想有一个方法double similarity(Car car1, Car car2)在区间[0,1]中返回一个double值.如果它们的相似函数返回大于0.5的值,我认为2辆汽车是相同的.然后,我重写equals方法:

@Override
public boolean equals(Object obj) {
    Car other = (Car) obj;
    return similarity(this, other) > 0.5;
}

现在,我不知道如何覆盖hashCode()以确保始终保持hashCode - equals合约,例如2个相等的对象始终具有相等的hashCodes.

我一直在考虑使用TreeMap而不是HashMap,只是为了避免覆盖hashCode,因为我不知道如何正确地执行它.但是,我不需要任何排序,所以我发现在这个问题中使用TreeMap是不合适的,而且我认为在复杂性方面它会更昂贵.

如果你可以建议我,那将是非常有帮助的:一种覆盖hashCode或替代不同结构的方法,这种结构更适合我的问题.

先感谢您!


推荐阅读
  • 一、equals方法的作用1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Objec ... [详细]
  • -------------------------------------------------android培训、java培训期待与您交流!--------------------------- ... [详细]
  • Whenoverridingtheequals()functionofjava.lang.Object,thejavadocssuggestthat,当重写java.lang. ... [详细]
  • Java集合类中常见的hashSet,hashMap,hashTable(现已很少用,几乎都采用hashMap替代)的实现都离不开散列表,而散列表的优势在于O(1)级别的查找,而has ... [详细]
  • 案例packagecn.itcast_02;importjava.util.HashSet;**需求:存储自定义对象,并保证元素的唯一性* ... [详细]
  • 我正在尝试使用带有自定义类和哈希码方法的自定义类的哈希映射进行测试:publi ... [详细]
  • 还要谈谈Equals和GetHashcode
    这篇随笔和上篇随笔《从两个数组中查找相同的数字谈Hashtable》都是为了下面分析Dictionary的实现做的铺垫一.两个逻辑上相等的实例对象。两个对象相等,除了指两个不同变量引用了 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • Java多线程售票案例分析
    本文通过一个售票系统的实例,深入探讨了Java中的多线程技术及其在资源共享和并发控制中的应用。售票过程涉及查询、收款、找零和出票等多个步骤,其中对总票数的管理尤为关键。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 探索equals()和hashCode()方法  在根类Object中,实现了equals()和hashCode()这两个方法,默认:  equals()是对两个对象的地址值进行的比较(即比较引用是否 ... [详细]
  • java散列与散列码探讨,简单HashMap实现散列映射表执行各种操作示列packageorg.rui.collection2.maps;***散列与散列码*将土拔鼠对象与预报对象联系 ... [详细]
  • 你知道一个对象的唯一标志不能仅仅通过写一个漂亮的equals来实现太棒了,不过现在你也必须实现hashCode方法。让我们看看为什么和怎么做才是正确的。相等和哈希码相等是从一般的方面 ... [详细]
author-avatar
初升的太阳1866
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有