集合存在指定值但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
相关产品推荐
相关产品推荐

