如何通过ID属性查找自定义类对象在ArrayList中的索引
嘿,这个需求我太懂了——不想写一堆冗余的代码,就想直接用字符串ID拿到对应MyClass对象的索引对吧?给你几个实用的方案:
方案1:自定义工具方法(最直观,无侵入)
这个方法不需要修改你的MyClass,直接写个静态工具方法遍历集合就行,逻辑清晰还不会影响其他业务:
public class MyClassUtils { public static int findIndexById(List<MyClass> list, String targetId) { for (int i = 0; i < list.size(); i++) { MyClass item = list.get(i); // 注意空值判断,避免NullPointerException if (targetId != null && targetId.equals(item.getId())) { return i; } } // 没找到返回-1,和原生indexOf行为一致 return -1; } }
使用的时候直接调用:
int i = MyClassUtils.findIndexById(yourList, someObjectsID);
方案2:重写equals()和hashCode()(适配原生indexOf)
如果你坚持想用list.indexOf(someObjectsID)这种写法,其实可以重写MyClass的equals()和hashCode(),但只基于ID属性——毕竟你的ID是唯一的,完全可以这么做:
public class MyClass { private String ID; private String name; private String userName; private String position; // 构造器、getter、setter省略 @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof MyClass)) { // 这里判断如果传入的是String类型,直接对比ID if (o instanceof String) { return ID != null && ID.equals(o); } return false; } MyClass myClass = (MyClass) o; return Objects.equals(ID, myClass.ID); } @Override public int hashCode() { return Objects.hash(ID); } }
现在你就可以直接调用原生方法了:
int i = list.indexOf(someObjectsID);
⚠️ 注意:这种方式要确保ID确实是全局唯一的,而且重写equals()可能会影响其他依赖equals()的场景(比如HashMap、contains()等),如果你的项目里其他地方需要用全属性对比,这个方法就不太适合了。
方案3:Java 8+ Stream API(简洁优雅)
如果你的项目用的是Java 8及以上,用Stream一行代码就能搞定,非常清爽:
int i = IntStream.range(0, yourList.size()) .filter(index -> someObjectsID.equals(yourList.get(index).getId())) .findFirst() .orElse(-1);
这个方法既不需要修改实体类,也不用写额外的工具方法,代码可读性也很高,推荐在Java 8+的项目里用。
内容的提问来源于stack exchange,提问作者Sapta lyksmusic
相关产品推荐
相关产品推荐

