检查对象集合是否包含指定字符串及Java代码逻辑分析
你的Java代码逻辑问题分析与修正
先直接点明核心问题:你的代码目前无法正确判断集合中是否已存在对应字符串的Types实例,主要有两个关键漏洞:
1. List.contains()的参数类型完全不匹配
在getShiftTypes()方法里,你调用了types.contains(shift)——但types是List<Types>类型,而shift是String类型。contains()方法会依赖Types类的equals()做比较,但你的equals()方法只判断传入对象是否是Types实例:当传入的是String时,object instanceof Types直接返回false,导致contains()永远返回false。这意味着不管shifts_arr_t里有没有重复字符串,循环都会每次创建新的Types对象加入集合,完全起不到去重作用。
2. 未完成且错误的equals()方法
你的Types.equals()方法不仅没写完,现有逻辑还有致命问题:
- 用
this.type == ((Types)object).type比较字符串是错误的——==比较的是字符串对象的引用地址,而非实际内容。如果两个字符串内容相同但不是同一个对象(比如通过new String()创建),==会返回false,正确做法是用this.type.equals(((Types)object).type)。 - 没有处理
this.type为null的情况,会触发空指针异常。 - 按照Java规范,重写
equals()必须同时重写hashCode(),否则会导致HashSet等集合的行为异常。
修正后的代码示例
第一步:完善Types类
import java.util.Objects; public class Types { String type; int count; public Types(String type) { this.type = type; } @Override public boolean equals(Object object) { // 先判断是否为同一对象引用 if (this == object) return true; // 判断是否为null或类型不匹配 if (object == null || getClass() != object.getClass()) return false; // 强转为Types类型 Types types = (Types) object; // 安全比较字符串内容(自动处理null) return Objects.equals(this.type, types.type); } @Override public int hashCode() { // 生成与equals逻辑匹配的hashCode return Objects.hash(type); } // 可选:增加getter方法,方便后续操作 public String getType() { return type; } }
第二步:修正getShiftTypes()方法
现在我们需要正确判断集合中是否存在type等于shift的Types实例,有两种简洁写法:
写法1:循环遍历判断(兼容所有Java版本)
private static List<Types> getShiftTypes() { List<Types> types = new ArrayList<>(); for (String shift : shifts_arr_t) { boolean exists = false; for (Types t : types) { if (Objects.equals(t.getType(), shift)) { exists = true; break; } } if (!exists) { types.add(new Types(shift)); } } return types; }
写法2:用Stream简化(Java 8+)
private static List<Types> getShiftTypes() { List<Types> types = new ArrayList<>(); for (String shift : shifts_arr_t) { boolean exists = types.stream() .anyMatch(t -> Objects.equals(t.getType(), shift)); if (!exists) { types.add(new Types(shift)); } } return types; }
如果你的需求只是去重,还可以用更简洁的流式写法:
import java.util.stream.Collectors; import java.util.Arrays; private static List<Types> getShiftTypes() { return Arrays.stream(shifts_arr_t) .distinct() // 先对字符串去重 .map(Types::new) // 转成Types对象 .collect(Collectors.toList()); }
内容的提问来源于stack exchange,提问作者Dim
相关产品推荐
相关产品推荐

