Java 遍历并从列表中查找对象字段的最佳方法

Java 遍历并从列表中查找对象字段的最佳方法,java,list,equals,Java,List,Equals,我有一个自定义对象列表,我想通过给定一个Id(自定义对象中的一个字段)找到一个对象。我为此编写了代码,所以在比较字段时发现了两种解决方案 一, 私有产品getProduct(字符串productId,列表productList){ 对于(int i=0;iproductId.equals(p.getId()) .findFirst() .orElse(空); 我知道结果有一些,但我认为equals有一些东西,这取决于它是如何实现的used@AdnanAli别担心,equals被定义为x.equa

我有一个自定义对象列表,我想通过给定一个Id(自定义对象中的一个字段)找到一个对象。我为此编写了代码,所以在比较字段时发现了两种解决方案

一,

私有产品getProduct(字符串productId,列表productList){
对于(int i=0;i
二,

私有产品getProduct(字符串productId,列表productList){
对于(int i=0;i

区别在于
如果
条件,我想知道哪一个更好,为什么,何时使用第一种方法,何时使用第二种方法?

第一种方法调用
等于
参数
productId
,而第二个函数从
productList
对当前列表元素调用
equals
。结果是相同的,因为是对称的:

对于任何非空参考值
x
y
x.equals(y)
应在且仅当
y.equals(x)
返回true时返回true

您也可以为此使用流,因此不必关心实现细节(此外,它是空安全的):


查看问题以获取更多信息。

第一个调用参数
productId
上的
equals
,而第二个调用
productList
中当前列表元素上的
equals
。结果是相同的,因为是对称的:

对于任何非空参考值
x
y
x.equals(y)
应在且仅当
y.equals(x)
返回true时返回true

您也可以为此使用流,因此不必关心实现细节(此外,它是空安全的):

查看一个问题以获取更多信息。

由于Java将
equals()
定义为对称,因此这两个代码段之间没有区别

这两个代码段都是次优的,因为它们通过数值索引进行迭代,并在返回之前检索
productList.get(i)
两次。按索引进行迭代尤其危险,因为传递
LinkedList
会大大降低搜索速度

更好的方法是对每种形式的循环使用:

for (Product p : productList) {
    if (p.getId().equals(productId)) {
        return p;
    }
}
return null;
由于Java将
equals()
定义为对称,因此这两个代码段之间没有区别

这两个代码段都是次优的,因为它们通过数值索引进行迭代,并在返回之前检索
productList.get(i)
两次。按索引进行迭代尤其危险,因为传递
LinkedList
会大大降低搜索速度

更好的方法是对每种形式的循环使用:

for (Product p : productList) {
    if (p.getId().equals(productId)) {
        return p;
    }
}
return null;

当您确定产品id从不为空时,这并不重要

但总的来说,以一种防御的方式编程总是好的,所以例如,更喜欢使用

"SomeString".equals(aString)
而不是

aString.equals("SomeString")
因为您知道“SomeString”永远不会
null

或使用

Objects.equals(object1, object2)

当两个对象都可能为
null

时,当您确定产品id永远不为null时,这并不重要

但总的来说,以一种防御的方式编程总是好的,所以例如,更喜欢使用

"SomeString".equals(aString)
而不是

aString.equals("SomeString")
因为您知道“SomeString”永远不会
null

或使用

Objects.equals(object1, object2)

当两个对象都可能为
null

时,两个实现中的问题都是在null值上调用.equals的可能性

如果您可以保证它们都不是空的,那么它们是等价的

如果您使用的是Java8,流可能是更好的选择

private Product getProduct(String productId,List<Product> productList){
    return products.stream()
        .filter(p-> productId.equals(p.getId())
        .findFirst()
        .orElse(null);
私有产品getProduct(字符串productId,列表productList){
return products.stream()
.filter(p->productId.equals(p.getId())
.findFirst()
.orElse(空);

两种实现中的问题都是在空值上调用.equals的可能性

如果您可以保证它们都不是空的,那么它们是等价的

如果您使用的是Java8,流可能是更好的选择

private Product getProduct(String productId,List<Product> productList){
    return products.stream()
        .filter(p-> productId.equals(p.getId())
        .findFirst()
        .orElse(null);
私有产品getProduct(字符串productId,列表productList){
return products.stream()
.filter(p->productId.equals(p.getId())
.findFirst()
.orElse(空);

我知道结果有一些,但我认为equals有一些东西,这取决于它是如何实现的used@AdnanAli别担心,
equals
被定义为
x.equals(y)=y.equals(x)
,所以顺序不重要。我知道结果是有一些,但我认为equals有一些东西,这取决于它是怎样的used@AdnanAli别担心,
equals
被定义为
x.equals(y)=y.equals(x)
,所以顺序并不重要。