当前位置: 首页 > 知识库问答 >
问题:

为什么覆盖等于不能在地图中添加相同的对象?

从智明
2023-03-14

如果您看一下这个程序,在Location类中,我们分别用return false和110重写了两个方法(equals和hashcode)。我们正在创建Location类的一个实例,并在map中放置两次。当我们从equals方法返回false时,为什么要用key映射覆盖last value?

class Location {

        long latitude;
        long longitude;

        public Location(long latitude,int longitude) {
            this.latitude = latitude;
            this.longitude = longitude;
        }

        @Override
        public boolean equals(Object obj) {
            return false;
        }

        @Override
        public int hashCode() {
            return 110;
        }

        @Override
        public String toString() {
            return String.format("Latitude := %d , Longitude :=%d ", latitude,longitude);
        }

    }

    Map<Location, String> locations = new HashMap<>();

    Location l1 = new Location(2,3); 
    locations.put(l1, "Mumbai");
    locations.put(l1,"Pune");       

    System.out.println(locations+ " with size of :"+locations.size());

共有1个答案

单于皓轩
2023-03-14

我查看了hashmap实现。显然,您的Location::equals从未被调用,因为==用于测试键的相等性。
原因是--多亏了chrylis--您添加了两次相同的位置。
更改您的代码:

Location l1 = new Location( 2, 3 );
locations.put( l1, "Mumbai" );

Location l2 = new Location( 2, 3 );
locations.put( l2, "Pune" );
 类似资料:
  • 下面是产生散列集大小为3而不是2的代码 您可以看到这两个对象在输出中具有相同的代码,但被计算为不同的,并且产生的代码被计算为3 请协助我如何工作。

  • 问题内容: 似乎以下代码应返回true,但返回false。 这有什么意义? 问题答案: 常规()和严格()相等之间的唯一区别是,严格相等运算符禁用类型转换。由于已经在比较两个相同类型的变量,因此使用的相等运算符的类型无关紧要。 不管您使用常规相等还是严格相等,对象比较仅 在您比较相同的精确对象时得出 。 也就是说,给定,,,但。 两个不同的对象(即使它们都具有零或相同的精确属性)也永远不会相等地进

  • 我有一个具有2种口味的android应用程序:-味道1-味道2 我的目录树是: main有默认的源集。味道1和味道2目录有自己的源集,它会自动获取。如果我将资源文件添加到味道目录中,它会从main覆盖它,并且工作正常。 但是,如果我在snorty2中添加一个java类以覆盖“main”中的另一个类(例如,一个需要在slavor2中不同的活动),它不会替换它,并且它说我的项目中有一个重复的类。我只能

  • 问题内容: (用Python shell编写) 为什么不允许对象向其添加属性? 问题答案: 请注意,实例没有属性: 一个在派生类中说明此行为的示例: 引用以下文档: […]声明采用一系列实例变量,并在每个实例中仅保留足够的空间来为每个变量保存一个值。因为未为每个实例创建空间,所以节省了空间。 编辑:要从评论中回答ThomasH,OP的测试类是“旧式”类。尝试: 您会注意到有一个实例。对象类可能没有

  • 我创建了的两个实例,如下所示。一个是从创建的,另一个是相同的,但在开头加上了一些附加的数字。使用方法比较它们时,它返回: 我认为添加的数字被丢弃了,并且两者给出了相同的UUID字符串值。为什么会这样?