ArrayList.contains(obj o)出现返回结果不对的问题

解决方法:

在比较的对象的类中 重写equals 方法:

例如:

public class AppCato implements Serializable {
    private String cato,name,name_cn;
//    private int imageId;
    public AppCato(String cato,String name,String name_cn)
    {
        this.cato=cato;
        this.name=name;
        this.name_cn=name_cn;
//        this.imageId=R.drawable.timg;
    }

@Override
public boolean equals(Object obj) {
    if (this == obj)      //传入的对象就是它自己,如s.equals(s);肯定是相等的;
        return true;
    if (obj == null)     //如果传入的对象是空,肯定不相等
        return false;
    if (getClass() != obj.getClass())  //如果不是同一个类型的,也不用比较了,肯定是不相等的
        return false;
    AppCato other = (AppCato) obj;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))   //如果name属性相等,则相等
        return false;
    return true;
}

<think>我们被要求回答:Java List contains 方法是模糊匹配还是精确匹配? 根据引用[2]中的例子,我们可以看到: total.contains("word2007") 返回 true,因为列表中有完全相同的字符串"word2007" total.contains("word") 返回 false,因为列表中没有单独的字符串"word" 因此,List.contains()方法使用的是精确匹配(即完全相等),而不是模糊匹配(部分包含)。 引用[1]也提到:精确匹配就是判断集合中是否包含完全相同的元素,而模糊匹配则是判断集合中是否有元素包含目标字符串的一部分。 所以,结论是:Java Listcontains方法执行的是精确匹配。 同时,引用[2]中给出了一个错误的用法:原本期望的是模糊查询(即只要字符串包含子串就算匹配),但是contains方法做不到,因为它要求整个字符串完全匹配。 另外,引用[3]提到了使用Stream API进行模糊匹配,说明要实现模糊匹配需要自己编写逻辑,比如使用字符串的contains方法。 下面我们通过一个简单的例子来说明: 精确匹配(List.contains): 判断条件:元素.equals(目标对象) // 注意:这里比较的是整个字符串是否相等 模糊匹配(需要自己实现): 可以使用循环遍历,然后对每个元素使用String.contains方法,或者使用Stream API的filter配合contains。 因此,回答用户的问题: Java Listcontains方法是精确匹配,不是模糊匹配。 同时,我们可以给出一个如何实现模糊匹配的例子(参考引用[2]和[3]): 例如,要判断一个字符串列表中是否有任意一个字符串包含目标子串,可以这样: boolean fuzzyMatch = list.stream().anyMatch(s -> s.contains(targetSubstring)); 注意:引用[2]中给出的修改后的写法(total.toString().contains("word"))虽然可以达到目的,但是不推荐,因为toString()返回的是整个列表的字符串表示(如"[hello133, word2007, red hat linux]"),这样可能会误匹配(比如匹配到括号、逗号等)。所以应该使用遍历或Stream API。 下面我们给出一个正确实现模糊匹配的例子:</think>在Java中,`List.contains()` 方法执行的是**精确匹配**,而不是模糊匹配。这是Java集合框架中的一个重要特性,理解其工作原理对正确使用集合至关重要。 ### 精确匹配的特性说明 1. **匹配机制**: - `contains()` 方法通过调用元素的 `equals()` 方法进行对象比较 - 对于字符串列表,它要求字符串内容**完全一致**(包括小写) - 对于自定义对象,需要正确重写 `equals()` 方法(默认使用对象引用比较) 2. **与模糊匹配的区别**: ```java List<String> list = Arrays.asList("apple", "Banana", "Cherry"); // ✅ 精确匹配(完全相等) System.out.println(list.contains("apple")); // true System.out.println(list.contains("Apple")); // false(小写敏感) // ❌ 模糊匹配(部分包含)不会生效 System.out.println(list.contains("app")); // false System.out.println(list.contains("nan")); // false ``` ### 为什么不是模糊匹配? 从引用[2]的代码示例可以看出: ```java List<String> total = new ArrayList<>(); total.add("hello133"); total.add("word2007"); System.out.println(total.contains("word2007")); // true(精确匹配) System.out.println(total.contains("word")); // false(非模糊匹配) ``` ### 实现模糊匹配的方法 如果需要模糊匹配(部分包含),应该使用以下方法: 1. **遍历+String.contains()**: ```java boolean fuzzyMatch = false; for (String s : list) { if (s.contains("目标子串")) { fuzzyMatch = true; break; } } ``` 2. **Java 8 Stream API**(引用[3]): ```java // 单条件模糊匹配 boolean exists = list.stream() .anyMatch(s -> s.contains("目标子串")); // 多条件模糊匹配 List<String> result = list.stream() .filter(s -> s.contains("ap") && s.contains("le")) .collect(Collectors.toList()); ``` 3. **正则表达式匹配**: ```java boolean matches = list.stream() .anyMatch(s -> s.matches(".*regex.*")); ``` ### 关键结论 | 匹配类型 | 方法 | 匹配规则 | |---------|------|---------| | **精确匹配** | `list.contains(element)` | 完全相同的对象(调用`equals()`) | | **模糊匹配** | 需自行实现 | 部分包含关系(使用`String.contains()`或正则) | > 在集合操作中,精确匹配是基础行为,模糊匹配需要额外实现[^2][^3]。对于对象集合的模糊匹配,可通过`list.stream().filter(obj -> obj.getName().contains("str"))`实现[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值