当前位置: 首页 > 面试题库 >

覆盖等于CopyOnWriteArraySet.add和remove

巫马劲
2023-03-14
问题内容

我有下面的课程

class A {
    @Override
    public boolean equals(Object other) { return true }
}

Class B extends A {
}

Class C extends A {
    @Override
    public boolean equals(Object other) { if ((other != null) || (other instanceOf B)) return false; }
}

In my main() I have this following code
Set<A> mySet = new CopyOnWriteArraySet<A>();

mySet.add(C);
I want mySet to contain C at this point

mySet.add(B); // #1
I want mySet to contain C & B at this point

mySet.remove(B); // #2
I want mySet to contain C at this point

我想创建一个全局队列,如果该对象存在于队列B中,则应该允许添加该全局队列,但反之则不行。因此,在#1之前,我循环遍历set内的元素,并在元素上添加了false。

但是1正在调用B.equals(C),它返回true,因此mySet在此行之后只有一个C对象

2再次调用返回真值的B.equals(C)并删除现有对象C。在这种情况下,它不是C.equals(B)吗?我希望这条线是无所作为

这是对CopyOnWriteArraySet的错误使用吗?

谢谢看


问题答案:

HashSet是适合我的情况的正确集合。除非存在hashCode匹配,否则添加元素时不会调用equals。这样,我仍然可以将equals方法用于特定目的。



 类似资料:
  • 问题内容: 在编写自己的类时,是否总是有必要重写? 如果我不这样做,它将自动检查所有字段是否相同?还是只是检查两个变量是否指向同一个对象? 问题答案: 如果正在编写将要以某种方式比较其对象的类,则应重写和方法。 不提供显式方法将导致从超类继承该方法的行为,并且在超类为类的情况下,它将成为Java API规范中针对该类设定的行为。 提供方法的一般约定可以在该类的文档中找到,特别是and 方法的文档。

  • 我试图为下面的代码编写一个JUnit,但我不知道如何覆盖用catch block语句编写的代码。请任何人为下面的代码编写一个示例JUnit。 这里我不想讨论任何异常,而是想讨论使用Mockito在catch块中编写的代码行。

  • 问题内容: 我有一个包含许多页面和不同背景图片的网站,并且通过CSS显示它们,例如: 但是,我想使用元素在一页上显示不同的(全屏)图片,并且我希望它们具有与上述属性相同的 属性(图像不能从CSS显示,它们必须从HTML文档显示)。 通常我使用: 要么: 使图片饱满且反应灵敏。但是,当屏幕变得太窄时,图片会缩小太多(),并在底部屏幕上显示主体的背景色。另一种方法只能使图像变大,而不响应屏幕大小。 有

  • 我有3个实体,学生,年级和班级。代码如下所示。这只是一个示例。 学生班级 学校班级: 等级等级: 所以我检查了hibernate文档中的hashcode和equals,它对于DB中存在的实体工作得非常好。我遇到的问题是,在保存到数据库之前,新的瞬态实体对象。我使用HashSet对学生和班级进行了单独的测试,如果它试图添加相同的对象,集合的大小不会增加。 这里我有一个新的成绩集,准备这个集并保存到数

  • 问题内容: 我正在尝试为参数化的类重写方法。 我如何确保该对象与相同? 问题答案: 您可以通过保留对类型的引用来实现。但是,我认为, 相等性测试应该针对对象表示的值,而不是针对这些值表示的具体类型 。 一个典型的例子是Collections API。 返回。尽管它们具有完全不同的类型,但是它们表示相同的值,即“空集合”。 就个人而言,代表一个相同数据(例如)的两个s是否应该不相等,因为一个是类型,

  • 问题内容: 假设我在课堂上说两种方法 和 那是什么感觉 重载还是重载? 问题答案: 重载是指两个或多个具有相同名称但参数不同的方法,就像您的示例一样。重载是从接口或抽象类实现一个方法的,因此超类中的方法具有实现,而子类中的方法具有不同的实现,它们仍然具有相同的方法名称和参数。