java - 为什么Java Set包含一个要添加的对象,但没有Set元素等于该对象

标签 java collections openjpa

首先,我使用 OpenJPA JPQL 查询获取 Product 类对象的列表。 Product 类对应于 OpenJPA 映射的数据库表。它来自Elastic Path 软件。

然后我尝试从这些对象创建一个集合。无法添加最后一个对象,因此 contains 表示该对象已在集合中。为了理解,我迭代了 Set,但没有任何现有元素等于新对象。

此外,所有对象的 hashCode 都不同。

这是简化的代码:

    List<Product> allProductsForPass = storeProductService.getProducts();
    Set<Product> sortProducts = new TreeSet<Product>(new ProductSort());

    for (Product iterProduct : allProductsForPass) {
        if (sortProducts.contains(iterProduct)) {
            for (Product sortProduct : sortProducts) {
                log.debug("SortProductHashCode" + sortProduct.hashCode()
                        + "; iterProductHashCode"
                        + iterProduct.hashCode());
                if (sortProduct.equals(iterProduct)) {
                    log.debug("SortProductFoundEqual:")
                }
            }
        }
        sortProducts.add(product);
    }

最佳答案

TreeSet 不使用 hashCodeequals。它使用Comparatorcompare 方法来确定两个元素是否相同。在您的情况下,确定两个 Product 元素是否相同的 ComparatorSdiProductSort 的实例。

关于java - 为什么Java Set包含一个要添加的对象,但没有Set元素等于该对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31325189/

相关文章:

java - 自 Java5 + 菱形运算符以来初始化通用集合的方法

java - 只能从数组中索引 0 处删除对象

java - 按 MENU 按钮时应用程序崩溃

ios - UICollectionView 索引

magento - 从 magento 模型集合中获取单个实体

java - 在 JPQL 中将属性与聚合选择的结果进行比较的正确语法是什么?

java - 是否可以调用默认构造函数而不是零参数构造函数?

java - 限制 jsoup 检索的内容

ant - 使用 Gradle 时如何执行 OpenJPA Enhancement?

java - OpenJPA 增强 Spring ROO 批处理应用程序