我必须在这里缺少一些东西…我有以下代码和输出。您能看到为什么Category categoryToBeDeleted
未从其中的每本书的类别集中删除result
吗?
谢谢!!
码:
List<Book> result = ... //get list from database
final Category categoryToBeDeleted = ... //get category from database
System.out.println("categoryToBeDeleted id: " + categoryToBeDeleted.getId() + " name: " + categoryToBeDeleted.getName());
for (Book book : result) {
System.out.println("before remove :");
for (Category category : book.getCategories()) {
System.out.println("category id: " + category.getId() + " name: " + category.getName() + " equals: " + category.equals(categoryToBeDeleted));
}
System.out.println("-----------------------");
book.getCategories().remove(categoryToBeDeleted);
System.out.println("after remove :");
for (Category category : book.getCategories()) {
System.out.println("category id: " + category.getId() + " name: " + category.getName() + " equals: " + category.equals(categoryToBeDeleted));
}
System.out.println("-----------------------");
}
输出:
categoryToBeDeleted id: 10 name: cosmetics
before remove :
category id: 10 name: cosmetics equals: true
category id: 1 name: cleaning equals: false
-----------------------
after remove :
category id: 10 name: cosmetics equals: true
category id: 1 name: cleaning equals: false
-----------------------
before remove :
category id: 9 name: junk-2 equals: false
category id: 10 name: cosmetics equals: true
-----------------------
after remove :
category id: 9 name: junk-2 equals: false
category id: 10 name: cosmetics equals: true
-----------------------
before remove :
category id: 6 name: knick-knacks equals: false
category id: 4 name: baby equals: false
category id: 9 name: junk-2 equals: false
category id: 10 name: cosmetics equals: true
-----------------------
after remove :
category id: 6 name: knick-knacks equals: false
category id: 4 name: baby equals: false
category id: 9 name: junk-2 equals: false
category id: 10 name: cosmetics equals: true
-----------------------
PS类别包含:
@Override
public boolean equals(Object obj) {
if (obj instanceof Category) {
Category thatCategory = (Category) obj;
return this.id.equals(thatCategory.id);
}
return false;
}
Java文档
去掉
布尔值remove(Object o)
如果存在指定元素,则从该集合中删除该元素(可选操作)。更正式地讲,如果此集合包含这样的元素,则删除元素(e == null?e ==
null:o.equals(e))。如果此集合包含元素(或者等效,如果此集合由于调用而更改),则返回true。(一旦调用返回,此集合将不包含该元素。)
您的集合实际上是一个HashSet
。类别未实现hashCode
。结果,当您删除对象时,对象标识符用作哈希码,并且对于每个不同的对象,即使它在语义上是等效的,最终也会使用不同的哈希码,从而在对象中查找错误的位置。哈希集,但找不到合适的匹配对象。
加
@Override
public int hashCode() {
return id.hashCode();
}
到Category
所有应该很好。
hashCode
可以在JavaDoc中读取java.lang.Object#equals的覆盖要求:
请注意,通常有必要在重写此方法时重写hashCode方法,以维护hashCode方法的常规协定,该协定规定相等的对象必须具有相等的哈希码。
就像本文所暗示的那样,用于hashCode的JavaDoc对此进行了更详细的介绍。
尽管关于JavaDoc remove
的主题可能会更清楚,但它仅equals
将其删除的对象作为规范的一部分进行引用-
但这并不是equals
唯一的用途。
最后,如果您使用的是Eclipse,则可以打开一个警告,如果您在equals
不覆盖而不进行覆盖的情况下进行了警告,则会发出警告hashCode
。
问题内容: 包括: all Spring libs, Apache Tomcat 7.0 library 在构建路径中 但它仍然给出错误: 在“ org.sprintframework.web-3.1.0.M1.jar”中,我可以看到“ org.springframework.web.context.ContextLoaderListener”。 Google上的某个人说应该包含spring.ja
问题内容: 我使用非常简单的代码返回XML 但是,出现以下错误 请帮忙。谢谢 问题答案: 运行时出现NoSuchMethodError表示你使用的库版本与生成代码所针对的版本不同。 在你的情况下,Spring是元凶。在运行时检查类路径上的内容,并确保以下各项: 版本与编译时间罐相同 如果存在多个版本,请删除不需要的版本
问题内容: 我不明白注释和之间的实际区别是什么? 扩展名还是它们具有完全不同的含义?什么时候应该使用它们?在服务层中使用Spring ,在DAO 中使用javax? 谢谢回答。 问题答案: 几年前,Spring定义了自己的Transactional注释以使Spring bean方法具有事务性。 Java EE 7终于做了同样的事情,现在除了EJB方法外,还允许CDI bean方法是事务性的。因此,
我在CentOS虚拟机中安装了RabbitMQ,该虚拟机的网络适配器被定义为Bridge。我正在尝试配置RabbitMQ管理,以便通过机器的IP地址访问WebApp。配置如下:
这个FAQ的最新版本总是可以从Apache主站点得到,位于<http://httpd.apache.org/docs/2.2/faq/> 如果你的问题在这里没有找到答案,你也可以看看Apache 1.3 FAQ ,看你的问题是否在那里有了答案。 主题 背景 关于 Apache HTTP Server 的背景知识。 支持 我遇到问题该怎么办? 错误信息 这些错误信息是什么意思? 背景 什么是Apac
发布问题 更新问题 设置问题悬赏 获取问题列表 获取一个问题详情 删除一个问题 获取用户发布的问题列表 发布问题 POST /questions 输入 字段 类型 描述 subject 字符串 必须,问题主题或者说标题,不能超过 255 字节 ,必须以 ? 结尾。(不区分全角或者半角) topics 数组 必须,绑定的话题,数组子节点必须符合 { "id": 1 } 的格式。 body 字符串