[software development] 求查看这两个list为何结果不是false
Tofloor
poster avatar
199******64
deepin
2024-10-09 07:42
Author

求助,我这边建立了两个list集合,分别是sublist,元素是AccounTantTemp(depNumber=1111, accNumber=20240917, bankBranches=756001, cnyDebitLedgerNumber=60110511, cnyDebitLedger=吸收存款-个人活期储蓄存款, cnyDebitCurrency=CNY, cnyDebitCashe=C, cnyDebitMoney=33.0, cnyDebit=0, cnyCreditLedgerNumber=40020306, cnyCreditLedger=货币兑换-结售汇-银行与个人间结售汇, cnyCreditCurrency=CNY, cnyCreditCashe=C, cnyCreditMoney=33.0, cnyCredit=1, usdDebitLedgerNumber=null, usdDebitLedger=null, usdDebitCurrency=null, usdDebitCashe=null, usdDebitMoney=null, usdDebit=null, usdCreditLedgerNumber=null, usdCreditLedger=null, usdCreditCurrency=null, usdCreditCashe=null, usdCreditMoney=null, usdCredit=null)

另外一个是另外一个是accounTantBookTempNumberList,元素是AccounTantBookTemp(accNumber=20240917, cnyDebitLedgerNumber=60110511, cnyDebitLedger=吸收存款-个人活期储蓄存款, cnyDebitCurrency=CNY, cnyDebitCashe=C, cnyDebit=0, cnyCreditLedgerNumber=40020306, cnyCreditLedger=货币兑换-结售汇-银行与个人间结售汇, cnyCreditCurrency=CNY, cnyCreditCashe=C, cnyCredit=1, usdDebitLedgerNumber=null, usdDebitLedger=null, usdDebitCurrency=null, usdDebitCashe=null, usdDebit=null, usdCreditLedgerNumber=null, usdCreditLedger=null, usdCreditCurrency=null, usdCreditCashe=null, usdCredit=null),

为何他们sublist.containsAll(accounTantBookTempNumberList)结果是false呢,不应该是true吗

两个都分别是两张表查询出来的数据,

c5e1c96c8770eda0f6fb8e4408f7621.png

62df9946c0cb02d784f2281b74ba8ec.png

idea 调试图片.zip

Reply Favorite View the author
All Replies
PurestAsh
deepin
2024-10-09 08:03
#1

重写equals方法呀

Reply View the author
pgxppp
deepin
2024-10-09 08:42
#2

现在小学三年级就学这些东西了,太牛了

Reply View the author
waittingsummer
deepin
2024-10-09 09:46
#3

应该是要严格相等才行,元素顺序不对也不行

Reply View the author
raspbian
deepin
2024-10-09 12:12
#4

你要问问题 最起码得写得让人愿意回答呀

描述和代码放在一坨

就是写到代码块里 也算你真心想问

不要把想帮你的人当成免费劳动力 不用白不用

Reply View the author
qianchen
deepin
2024-10-09 15:50
#5

deepin23集成了UOS AI,这个直接问AI 就好了

image.png

在 Java 中,List.containsAll(Collection c) 方法检查调用该方法的列表(在这个例子中是 sublist)是否包含指定集合(accounTantBookTempNumberList)中的所有元素。然而,这里的关键是理解“包含”的含义。在这个上下文中,“包含”意味着 sublist 中必须有与 accounTantBookTempNumberList 中每个元素相等(通过 equals 方法)的对象。

在你的情况下,即使 sublistaccounTantBookTempNumberList 中的元素看起来具有相同的字段和值,但如果 AccounTantTempAccounTantBookTemp 类没有正确覆盖 equals 方法和 hashCode 方法,那么 Java 默认会使用对象的内存地址来比较它们,这通常会导致 containsAll 方法返回 false

默认情况下,Java 类的 equals 方法是从 Object 类继承的,该方法比较的是对象的内存地址(即是否是同一个对象的引用)。由于 AccounTantTempAccounTantBookTemp 是不同的类,即使它们的字段值和类型相同,它们的默认 equals 方法也会认为它们是不相等的。

要解决这个问题,你需要在 AccounTantTempAccounTantBookTemp 类(或者如果它们是相关类并且可以通过某种方式被视为相等,则只在一个类中)中覆盖 equalshashCode 方法。这两个方法应该基于你认为相等的标准来比较对象(在这个案例中,可能是所有相关字段的相等性)。

例如,如果你认为只要 accNumbercnyDebitLedgerNumbercnyCreditLedgerNumber 等字段相同,两个对象就应该被认为是相等的,你应该在类中这样覆盖 equalshashCode 方法:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    AccounTantTemp that = (AccounTantTemp) o;
    return Objects.equals(accNumber, that.accNumber) &&
           Objects.equals(cnyDebitLedgerNumber, that.cnyDebitLedgerNumber) &&
           Objects.equals(cnyCreditLedgerNumber, that.cnyCreditLedgerNumber) &&
           // 添加其他相关字段的比较
           true;
}

@Override
public int hashCode() {
    return Objects.hash(accNumber, cnyDebitLedgerNumber, cnyCreditLedgerNumber);
    // 同样,添加其他相关字段到哈希计算中
}

注意:如果你决定在 AccounTantTemp 中覆盖这些方法,并且希望 AccounTantBookTemp 实例也能被视为相等(这假设这两个类是逻辑上等价的),你可能需要在 AccounTantTempequals 方法中做额外的类型检查,并相应地处理 AccounTantBookTemp 对象。然而,这通常不是最佳实践,因为它破坏了封装和类的独立性。更好的做法是在逻辑上等价的类中各自覆盖 equalshashCode 方法,或者使用另一个共同的接口或父类来实现这些方法。

Reply View the author
小小怪冲啊!
deepin
2024-10-09 19:14
#6

看不懂了

Reply View the author
Oli
deepin
2024-10-09 21:15
#7

agree agree

Reply View the author
小鱼贝壳
deepin
2024-10-10 00:50
#8

tail

Reply View the author
柠萌~
deepin
2024-10-10 21:27
#9

我也看不懂

Reply View the author