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

Set<>。contains和hashCode的问题-ProblemswithSet<>.containsandhashCode

IhaveaSet<SelectDTO>withasingleelementandImfailingwhenusing.containswithitand

I have a Set with a single element and I'm failing when using .contains with it and a new SelectDTO, as follows:

我有一个带有单个元素的Set ,当我使用.contains和一个新的SelectDTO时,我失败了,如下所示:

Set setDTOs = new HashSet
//processing where an element with  is added.

SelectDTO selectDTO = new SelectDTO();
selectDTO.setName("ME101");
selectDTO.setId(102);
if (!setDTOs.contains(selectDTO)){
     throw new Exception();
}

I have override SelectDTO's .hashCode(), so that it's calculated as the sum of the parameters id and name. I have debugged and confirmed that the execution goes through .hashCode() two times: the first when the element is added to the set and the second when calling .contains(). Both elements' hashCode is -2024486876. But also, when debugging, I see that the table within the set has a single element, its "hash" being -1909995738.

我已经覆盖SelectDTO的.hashCode(),因此它被计算为参数id和name的总和。我已经调试并确认执行过两次.hashCode():第一次将元素添加到集合中,第二次调用.contains()时。两个元素的hashCode是-2024486876。但是,在调试时,我看到集合中的表有一个单独的元素,其“哈希”为-1909995738。

This is the code for my hashCode, although I don't think the problem's there:

这是我的hashCode的代码,虽然我不认为问题在那里:

@Override
public int hashCode() {
    int result = 0;
    result += this.getName() != null ? this.getName().hashCode() : 0;
    result += this.getId() != null ? this.getId() : 0;
    return result;
}

I guess that .contains() is using this 'hash' value to compare, but I don't know why.

我想.contains()正在使用这个'hash'值进行比较,但我不知道为什么。

2 个解决方案

#1


4  

From the Set.contains() documentation:

从Set.contains()文档:

Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).

如果此set包含指定的元素,则返回true。更正式地,当且仅当此集合包含元素e时才返回true(o == null?e == null:o.equals(e))。

In other words, you do not only need to implement hashCode(), but also equals().

换句话说,您不仅需要实现hashCode(),还需要equals()。

#2


0  

It seems you forgot to add the selectDTO element in Set:

您似乎忘了在Set中添加selectDTO元素:

setDTOs.add(selectDTO);

Assuming you have added the element somewhere in your code, then you need to override the equals method and not hashCode. As contains() method uses equals() method to determine whether an element exist or not in the set. Interestingly, i believe this is how Set makes sure it does not push a duplicate element in the Set.

假设您已在代码中的某处添加了元素,那么您需要覆盖equals方法而不是hashCode。由于contains()方法使用equals()方法来确定集合中是否存在元素。有趣的是,我相信这就是Set确保它不会在Set中推送重复元素的方式。


推荐阅读
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文探讨了在Java中实现系统托盘最小化的两种方法:使用SWT库和JDK6自带的功能。通过这两种方式,开发者可以创建跨平台的应用程序,使窗口能够最小化到系统托盘,并提供丰富的交互功能。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本文介绍了如何通过配置 Android Studio 和 Gradle 来显著提高构建性能,涵盖内存分配优化、并行构建和性能分析等实用技巧。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • MySQL DateTime 类型数据处理及.0 尾数去除方法
    本文介绍如何在 MySQL 中处理 DateTime 类型的数据,并解决获取数据时出现的.0尾数问题。同时,探讨了不同场景下的解决方案,确保数据格式的一致性和准确性。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • 本文详细介绍了 MySQL 数据库中的基础操作,包括创建、查询、修改和删除数据库、表及数据的命令。通过具体的 SQL 语句示例,帮助读者快速掌握 MySQL 的基本操作。 ... [详细]
author-avatar
手机用户2502901265_642
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有