Java判断字符串是否在List中的方案详解(忽略大小写)
更新时间:2025年05月16日 14:53:58 作者:五道书童
对于需要频繁调用且数据量大的情况,有几种优化方案可以选择,下面给大家分享三种方案给大家详细介绍java字符串判断是否在list中,感兴趣的朋友一起看看吧
Java中高效判断字符串是否在List中(忽略大小写)
对于需要频繁调用且数据量大的情况,有几种优化方案可以选择:
方案1:使用HashSet存储小写版本(推荐)
import java.util.*;
public class CaseInsensitiveLookup {
private final Set<String> lowerCaseSet;
public CaseInsensitiveLookup(List<String> originalList) {
// 预处理:将所有字符串转为小写并存入HashSet
this.lowerCaseSet = new HashSet<>(originalList.size());
for (String s : originalList) {
lowerCaseSet.add(s.toLowerCase());
}
}
public boolean containsIgnoreCase(String target) {
return lowerCaseSet.contains(target.toLowerCase());
}
}优点:
- 预处理时间复杂度O(n),之后每次查询时间复杂度O(1)
- HashSet的查找效率极高
- 内存占用相对合理
缺点:
- 初始构建需要遍历整个列表
- 如果原始列表频繁变化,需要重新构建Set
方案2:使用TreeSet自定义比较器
import java.util.*;
public class CaseInsensitiveLookup {
private final Set<String> treeSet;
public CaseInsensitiveLookup(List<String> originalList) {
this.treeSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
treeSet.addAll(originalList);
}
public boolean containsIgnoreCase(String target) {
return treeSet.contains(target);
}
}优点:
- 查询时间复杂度O(log n)
- 保持元素有序
缺点:
- 比HashSet稍慢
- 同样需要预处理
方案3:并行流处理(适用于超大列表且不频繁调用)
import java.util.*;
public class CaseInsensitiveLookup {
private final List<String> originalList;
public CaseInsensitiveLookup(List<String> originalList) {
this.originalList = originalList;
}
public boolean containsIgnoreCase(String target) {
return originalList.parallelStream()
.anyMatch(s -> s.equalsIgnoreCase(target));
}
}优点:
- 不需要预处理
- 可以利用多核CPU
缺点:
- 每次查询都需要遍历(虽然并行)
- 不适合频繁调用场景
最佳实践建议
- 如果列表不常变化:使用方案1(HashSet),这是查询效率最高的方法
- 如果需要保持插入顺序:考虑LinkedHashSet
- 如果列表经常变化:考虑方案3或使用ConcurrentHashMap实现类似方案1的功能
- 如果内存非常紧张:可以考虑方案3,但性能会下降
使用示例
List<String> largeList = Arrays.asList("Apple", "Banana", "Orange", ...);
CaseInsensitiveLookup lookup = new CaseInsensitiveLookup(largeList);
// 频繁调用
boolean contains = lookup.containsIgnoreCase("apple"); // 返回true选择哪种方案取决于你的具体场景:数据量大小、查询频率、列表变更频率和内存限制等因素。
到此这篇关于Java中高效判断字符串是否在List中(忽略大小写)的文章就介绍到这了,更多相关java字符串判断是否在list中内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
MyBatis映射文件中parameterType与resultType的用法详解
MyBatis中的ParameterType指的是SQL语句中的参数类型,即传入SQL语句中的参数的类型,下面这篇文章主要给大家介绍了关于MyBatis映射文件中parameterType与resultType用法的相关资料,需要的朋友可以参考下2023-04-04
Java多线程中的wait、notify和park、unpark的使用详解
这篇文章主要介绍了Java多线程中的wait、notify和park、unpark的使用详解,它们都是线程之间进行协作的手段,都属于 Object 对象的方法,必须获得此对象的锁,才能调用这几个方法,需要的朋友可以参考下2023-12-12
MyBatis3传递多个参数(Multiple Parameters)
这篇文章主要介绍了MyBatis3传递多个参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-07-07
Java中Springboot集成Kafka实现消息发送和接收功能
Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Kafka可以实现消息队列、数据存储和流处理等功能,在Java中,可以使用Spring Boot集成Kafka实现消息的发送和接收,感兴趣的朋友跟随小编一起看看吧2025-01-01


最新评论