Java中存储HashMap的ArrayList如何用contains方法匹配指定键值对?
解决方案
ArrayList的contains方法底层依赖元素的equals逻辑做匹配,而JDK原生HashMap的equals要求所有键值对完全一致才返回true,所以直接用默认的contains肯定满足不了只匹配单个键值的需求。如果一定要用contains实现,需要自定义HashMap子类重写匹配规则,具体方案如下:
方案1:自定义HashMap子类(实现contains调用)
首先重写HashMap的equals和hashCode方法,仅判断taskGroupName字段:
import java.util.HashMap; import java.util.Objects; public class TaskGroupMap extends HashMap<String, Object> { @Override public boolean equals(Object o) { if (this == o) return true; // 只要是HashMap类型就参与比对 if (!(o instanceof HashMap)) return false; HashMap<?, ?> otherMap = (HashMap<?, ?>) o; // 仅比对taskGroupName字段值,自动处理null场景 return Objects.equals(this.get("taskGroupName"), otherMap.get("taskGroupName")); } @Override public int hashCode() { // 哈希值仅和taskGroupName绑定,和equals逻辑保持一致 return Objects.hash(get("taskGroupName")); } }
之后你需要把原来ArrayList里存储的对象都替换为TaskGroupMap的实例,再调用contains即可:
// 构造匹配用的目标对象 TaskGroupMap target = new TaskGroupMap(); target.put("taskGroupName", "Fitness"); // 直接调用contains即可得到匹配结果 boolean isExist = t.contains(target);
注意:该方案会修改HashMap的默认相等判断逻辑,如果你业务其他场景需要完整比对HashMap的所有键值对,不要用这个方案,避免出现逻辑异常。
方案2:更推荐的替代实现(无需强用contains)
实际开发中完全没必要为了用contains强行修改数据结构,直接用循环或者Java 8+的Stream API实现即可,逻辑更清晰也不会侵入原有数据结构:
// Stream写法,一行完成判断,自动规避空指针风险 boolean isExist = t.stream() .anyMatch(map -> "Fitness".equals((String) map.get("taskGroupName"))); if (isExist) { // 匹配成功后执行的代码 }
内容的提问来源于stack exchange,提问作者CodeRich
相关产品推荐
相关产品推荐

