
在java中,arraylist 的 contains(object o) 方法用于判断列表中是否包含指定元素。其底层实现依赖于元素对象的 equals() 方法。具体来说,它会遍历列表中的每个元素 e,如果存在 e.equals(o) 返回 true 的情况,则 contains() 方法返回 true。
当尝试在一个存储 Product 对象的 ArrayList 中搜索一个 String 类型的名称时,例如 al.contains(name),会遇到以下问题:
鉴于上述原因,直接使用 ArrayList.contains(String) 无法实现通过产品名称查找 Product 对象的需求,它将始终返回 false。
最直接且易于理解的方法是遍历 ArrayList 中的每一个 Product 对象,然后检查其 name 属性是否与搜索条件匹配。
示例代码:
立即学习“Java免费学习笔记(深入)”;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Optional; // 引入Optional类,虽然此方案未使用,但Stream API会用到
// 定义产品类
class Product {
int id;
String name;
int price;
public Product(int i, String name, int price) {
this.id = i;
this.name = name;
this.price = price;
}
// 重写toString方法,便于打印产品信息
@Override
public String toString() {
return "Product{id=" + id + ", name='" + name + "', price=" + price + "}";
}
}
public class ProductSearchExample {
public static void main(String[] args) {
ArrayList<Product> productList = new ArrayList<>();
productList.add(new Product(1, "Samsung", 10000));
productList.add(new Product(2, "Apple", 20000));
productList.add(new Product(3, "Nokia", 30000));
productList.add(new Product(4, "Sony", 40000));
productList.add(new Product(5, "LG", 50000));
System.out.println("当前产品列表:");
for (Product p : productList) {
System.out.println(p);
}
Scanner scanner = new Scanner(System.in);
System.out.println("\n请输入要搜索的产品名称:");
String searchName = scanner.nextLine();
Product foundProduct = null;
// 遍历列表查找匹配的产品
for (Product product : productList) {
// 使用equalsIgnoreCase进行大小写不敏感的精确匹配
// 如果需要大小写敏感,使用 product.name.equals(searchName)
// 如果需要模糊匹配(包含子字符串),使用 product.name.contains(searchName)
if (product.name.equalsIgnoreCase(searchName)) {
foundProduct = product;
break; // 找到第一个匹配项后即可退出循环
}
}
if (foundProduct != null) {
System.out.println("产品已找到: " + foundProduct);
} else {
System.out.println("未找到名称为 '" + searchName + "' 的产品。");
}
scanner.close();
}
}要点与注意事项:
Java 8 引入的 Stream API 提供了一种更简洁、更具函数式风格的方式来处理集合数据。通过 filter() 和 findFirst() 方法,可以优雅地实现查找逻辑。
示例代码:
立即学习“Java免费学习笔记(深入)”;
import java.util.ArrayList;
import java.util.Optional;
import java.util.Scanner;
// Product 类定义同上
public class ProductSearchStreamExample {
public static void main(String[] args) {
ArrayList<Product> productList = new ArrayList<>();
productList.add(new Product(1, "Samsung", 10000));
productList.add(new Product(2, "Apple", 20000));
productList.add(new Product(3, "Nokia", 30000));
productList.add(new Product(4, "Sony", 40000));
productList.add(new Product(5, "LG", 50000));
Scanner scanner = new Scanner(System.in);
System.out.println("\n请输入要搜索的产品名称 (Stream API):");
String searchName = scanner.nextLine();
// 使用Stream API查找产品
Optional<Product> foundProductOptional = productList.stream()
.filter(p -> p.name.equalsIgnoreCase(searchName)) // 过滤出名称匹配的产品
.findFirst(); // 获取第一个匹配的产品,结果封装在Optional中
if (foundProductOptional.isPresent()) {
System.out.println("产品已找到: " + foundProductOptional.get());
} else {
System.out.println("未找到名称为 '" + searchName + "' 的产品。");
}
scanner.close();
}
}要点与注意事项:
如果需要频繁地根据某个唯一属性(如产品名称或ID)进行查找,并且数据量较大,可以考虑使用 HashMap。HashMap 提供了平均 O(1) 的查找时间复杂度,显著优于 ArrayList 的 O(n)。
示例代码:
立即学习“Java免费学习笔记(深入)”;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
// Product 类定义同上
public class ProductSearchHashMapExample {
public static void main(String[] args) {
// 构建一个以产品名称为key,Product对象为value的HashMap
Map<String, Product> productMap = new HashMap<>();
// 注意:HashMap的key是大小写敏感的,如果需要忽略大小写,
// 建议在存储时将key统一转换为小写或大写。
productMap.put("Samsung", new Product(1, "Samsung", 10000));
productMap.put("Apple", new Product(2, "Apple", 20000));
productMap.put("Nokia", new Product(3, "Nokia", 30000));
productMap.put("Sony", new Product(4, "Sony", 40000));
productMap.put("LG", new Product(5, "LG", 50000));
Scanner scanner = new Scanner(System.in);
System.out.println("\n请输入要搜索的产品名称 (HashMap):");
String searchName = scanner.nextLine();
// HashMap的get方法支持O(1)平均时间复杂度查找
// 如果HashMap的key在存储时已统一处理大小写,这里也需要对searchName进行同样处理
Product foundProduct = productMap.get(searchName); // 精确匹配
if (foundProduct != null) {
System.out.println("产品已找到: " + foundProduct);
} else {
System.out.println("未找到名称为 '" + searchName + "' 的产品。");
}
scanner.close();
}
}要点与注意事项:
在Java ArrayList中查找自定义对象的特定属性,不能直接依赖 ArrayList.contains(String)。正确的做法是根据具体需求选择合适的查找策略:
以上就是Java ArrayList中自定义对象属性的查找策略的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号