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

添加5个对象后,为什么这个集合的大小为1?

如何解决《添加5个对象后,为什么这个集合的大小为1?》经验,为你挑选了1个好方法。

我想弄清楚为什么这段代码输出1:

import java.util.HashSet;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        Set myFooSet= new HashSet(); 
        myFooSet.add(new Foo(2));
        myFooSet.add(new Foo(1));
        myFooSet.add(new Foo(3));
        myFooSet.add(new Foo(3));
        myFooSet.add(new Foo(2));
        System.out.print(myFooSet.size());
    }
}
class Foo {
     Integer code;
     Foo(Integer c) {
         code= c;
     }
     public boolean equals(Foo f) {
         return false;
     }
     public boolean equals(Object f) {
         return true;
     }
     public int hashCode() {
         return 17;
     }
}

Eran.. 17

你的定义public boolean equals(Object f)public int hashCode()在方法Foo类,基本上说,所有Foo情况下都彼此相等,所以只有一个实例Foo可以被添加到任何HashSet.

因此myFooSet.size(),无论Foo您尝试添加的元素数量是多少,都将返回1 (只要您添加了至少一个元素).

注意:您的public boolean equals(Foo f)方法永远不会被使用HashSet,因为HashSet只使用equalsObject类中声明的方法public boolean equals(Object obj)- 您覆盖的方法总是返回true.



1> Eran..:

你的定义public boolean equals(Object f)public int hashCode()在方法Foo类,基本上说,所有Foo情况下都彼此相等,所以只有一个实例Foo可以被添加到任何HashSet.

因此myFooSet.size(),无论Foo您尝试添加的元素数量是多少,都将返回1 (只要您添加了至少一个元素).

注意:您的public boolean equals(Foo f)方法永远不会被使用HashSet,因为HashSet只使用equalsObject类中声明的方法public boolean equals(Object obj)- 您覆盖的方法总是返回true.


显式的另一个重要细节是从不调用`equals(Foo)`重载,因为HashMap无法知道存在,所以`equals(Object)`是被调用的重载.因此,虽然`new Foo(1).equals(new Foo(1))`是假的,但实际上从未使用过.
推荐阅读
  • 将学生对象和学生的归属地通过键与值存储到map集合中。importjava.util.HashMap;importjava.util.Iterator;importjava.uti ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 如何解决《HashSetremoveAll方法非常慢》经验,为你挑选了1个好方法。 ... [详细]
  • TheHashSetclasshasanadd(Objecto)method,whichisnotinheritedfromanotherclass.TheJavado ... [详细]
  • HashMap:键值对(key-value):通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.默认是1:1关系:存在则覆盖,当key已经存在,则利用新的va ... [详细]
  • 我有3个来自RESEARCHS的映射值,指定要使用参考数据集填充的行中的范围。该研究 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • 类Hashtable<K,V>所有已实现的接口:Serializable,Cloneable,Map<K,V>此类实现一个哈希表,该哈希表将键映 ... [详细]
  • 本篇文章给大家分享的是有关Java中怎么对HashMap按键值排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
  • 01Map集合概述A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同a:Collection中的集合 ... [详细]
  • 写这篇文章起源于一道面试题,如何将自定义的类对象作为key存储到HashMap中,即考虑怎么判断key的唯一性。首先,我们看以下HashMap中put(…)方法的源码:public ... [详细]
  • 源码阅读之HashMap(JDK8)
    概述HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。HashMap最多只允许一条记录的键为null,允许多条记 ... [详细]
  • HashSet and HashMap
    HashSetandHashMap总体介绍之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说HashS ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
author-avatar
北斗盖全球
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有