如何根据ID属性值获取ArrayList中Book对象的索引?
嘿,这个需求很常见嘛!我给你整理几种靠谱的实现方式,你可以根据自己的Java版本来选:
方法1:传统for循环(全Java版本兼容)
这是最基础也最稳妥的路子,不管你用的是Java 5还是更高版本都能跑通。核心思路就是逐个遍历ArrayList里的Book对象,对比它们的ID,找到匹配的就返回当前索引。
假设你的Book类有getId()方法来获取ID值,代码示例如下:
public int getBookIndexById(ArrayList<Book> bookList, int targetId) { for (int i = 0; i < bookList.size(); i++) { Book currentBook = bookList.get(i); // 划重点:如果ID是字符串类型,一定要用equals()比较,别用==! if (currentBook.getId() == targetId) { return i; } } // 没找到匹配的ID就返回-1,代表该对象不存在于列表中 return -1; }
方法2:Java 8+ 流API(更简洁优雅)
如果你用的是Java 8及以上版本,用流来处理会更清爽,代码可读性也更高:
import java.util.stream.IntStream; public int getBookIndexById(ArrayList<Book> bookList, int targetId) { return IntStream.range(0, bookList.size()) .filter(index -> bookList.get(index).getId() == targetId) .findFirst() // 没找到的话返回-1,也可以用orElseThrow()抛出异常,看你业务需求 .orElse(-1); }
这个方法的逻辑是生成从0到列表长度的索引流,过滤出ID匹配的索引,然后取第一个匹配项;如果没有匹配的,就返回-1。
方法3:用List.indexOf()?先踩坑预警!
你可能会想到直接用bookList.indexOf(targetBook),但这里有个前提:你的Book类必须正确重写了equals()方法,而且这个方法是根据ID来判断两个Book对象是否相等的。
如果你的Book类还没重写equals()和hashCode(),得先补上:
import java.util.Objects; public class Book { private int id; // 其他属性、构造方法、getter/setter @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Book book = (Book) o; return id == book.id; } @Override public int hashCode() { return Objects.hash(id); } public int getId() { return id; } }
之后就可以这样用:
// 创建一个仅ID匹配的Book对象(因为equals只对比ID) Book tempBook = new Book(); tempBook.setId(targetId); int index = bookList.indexOf(tempBook);
不过这种方法不如前两种直接,毕竟还要额外创建一个临时对象,除非你本来就持有这样的对象,否则不太推荐。
额外提醒
- 如果列表里存在多个ID相同的Book对象,上面的方法都会返回第一个匹配项的索引;如果需要找到所有匹配的索引,把返回类型改成
List<Integer>,收集所有符合条件的索引即可。 - 记得处理返回-1的情况,避免后续操作因为索引越界抛出异常。
内容的提问来源于stack exchange,提问作者M.khanousse
相关产品推荐
相关产品推荐

