You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集合存在指定值但contains方法仍返回false的问题排查

问题分析与修复建议

当前自定义的contains方法仅能在元素为string、null或特定int类型时返回正确结果,无法识别如0.5这类浮点型元素——即便集合中存在该值,调用contains(0.5)仍返回false。

问题代码

自定义contains方法

public boolean contains(Object arg0) {      
//       For loop that searchs are current collection for arg0
        for (Object c : data) {
            if (arg0 == null) {
                System.out.println(arg0 + " value");
                return true;
            } else if (arg0.equals(c)) {
                System.out.println("found " + c + " and " + arg0);
                return true;
            } else {
                System.out.println("couldint find " + arg0);
                return false;
            }
        }

        return false;
}

测试代码

@SuppressWarnings("unchecked")
@Test
void testToSortedList() 
{
    ArrayCollection arrayCollection = new ArrayCollection();
    ArrayCollection resultArray = new ArrayCollection();
    // add the objects to the collections

    arrayCollection.add("Test");
    
    resultArray.add(771);
    resultArray.add(.5);

    
    System.out.println(resultArray.addAll(arrayCollection));
    System.out.println(resultArray.contains(771));
    System.out.println(resultArray.contains(.5));
    System.out.println(resultArray.contains("Test"));
}

核心错误点

你的contains方法逻辑存在致命问题:循环仅执行一次就返回结果。

  • 如果第一个元素不匹配,直接进入else分支返回false,根本不会遍历后续元素。比如测试中resultArray的元素顺序是771、0.5、"Test",调用contains(0.5)时,第一个元素是771,和0.5不相等,方法直接返回false,完全没检查第二个元素。
  • null判断逻辑错误:只要arg0是null,不管集合里有没有null元素,直接返回true,不符合集合contains方法的语义。

修复方案

修正循环逻辑,遍历所有元素后再判断是否存在;同时修复null的判断逻辑:

public boolean contains(Object arg0) {      
    for (Object c : data) {
        if (arg0 == null) {
            // 只有当集合元素也是null时才匹配
            if (c == null) {
                System.out.println("found null value");
                return true;
            }
        } else if (arg0.equals(c)) {
            System.out.println("found " + c + " and " + arg0);
            return true;
        }
        // 不匹配就继续循环,不要直接返回false
    }
    // 遍历完所有元素都没找到,才返回false
    System.out.println("couldn't find " + arg0);
    return false;
}

额外说明

  • 浮点型的匹配:Double.equals()可以正确处理0.5这类值,修复后就能正常识别。
  • 测试代码中add(.5)会自动装箱为Double类型,调用contains(.5)时同样会装箱为Double,equals方法可以正确匹配。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:15:40