Java判斷字符串是否在List中的方案詳解(忽略大小寫)
更新時間:2025年05月16日 14:53:58 作者:五道書童
對于需要頻繁調(diào)用且數(shù)據(jù)量大的情況,有幾種優(yōu)化方案可以選擇,下面給大家分享三種方案給大家詳細(xì)介紹java字符串判斷是否在list中,感興趣的朋友一起看看吧
Java中高效判斷字符串是否在List中(忽略大小寫)
對于需要頻繁調(diào)用且數(shù)據(jù)量大的情況,有幾種優(yōu)化方案可以選擇:
方案1:使用HashSet存儲小寫版本(推薦)
import java.util.*;
public class CaseInsensitiveLookup {
private final Set<String> lowerCaseSet;
public CaseInsensitiveLookup(List<String> originalList) {
// 預(yù)處理:將所有字符串轉(zhuǎn)為小寫并存入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());
}
}優(yōu)點:
- 預(yù)處理時間復(fù)雜度O(n),之后每次查詢時間復(fù)雜度O(1)
- HashSet的查找效率極高
- 內(nèi)存占用相對合理
缺點:
- 初始構(gòu)建需要遍歷整個列表
- 如果原始列表頻繁變化,需要重新構(gòu)建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);
}
}優(yōu)點:
- 查詢時間復(fù)雜度O(log n)
- 保持元素有序
缺點:
- 比HashSet稍慢
- 同樣需要預(yù)處理
方案3:并行流處理(適用于超大列表且不頻繁調(diào)用)
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));
}
}優(yōu)點:
- 不需要預(yù)處理
- 可以利用多核CPU
缺點:
- 每次查詢都需要遍歷(雖然并行)
- 不適合頻繁調(diào)用場景
最佳實踐建議
- 如果列表不常變化:使用方案1(HashSet),這是查詢效率最高的方法
- 如果需要保持插入順序:考慮LinkedHashSet
- 如果列表經(jīng)常變化:考慮方案3或使用ConcurrentHashMap實現(xiàn)類似方案1的功能
- 如果內(nèi)存非常緊張:可以考慮方案3,但性能會下降
使用示例
List<String> largeList = Arrays.asList("Apple", "Banana", "Orange", ...);
CaseInsensitiveLookup lookup = new CaseInsensitiveLookup(largeList);
// 頻繁調(diào)用
boolean contains = lookup.containsIgnoreCase("apple"); // 返回true選擇哪種方案取決于你的具體場景:數(shù)據(jù)量大小、查詢頻率、列表變更頻率和內(nèi)存限制等因素。
到此這篇關(guān)于Java中高效判斷字符串是否在List中(忽略大小寫)的文章就介紹到這了,更多相關(guān)java字符串判斷是否在list中內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
- java list中包含某個字符串的兩種方法實現(xiàn)
- java中List數(shù)組用逗號分隔開轉(zhuǎn)成字符串2種方法
- java 將 list 字符串用逗號隔開拼接字符串的多種方法
- Java8 將List轉(zhuǎn)換為用逗號隔開的字符串的多種方法
- java 將字符串、list 寫入到文件,并讀取內(nèi)容的案例
- java將String字符串轉(zhuǎn)換為List<Long>類型實例方法
- java的Jackson將json字符串轉(zhuǎn)換成泛型List
- 淺談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化
- Java中Json字符串直接轉(zhuǎn)換為對象的方法(包括多層List集合)
相關(guān)文章
MyBatis中#{}?和?${}?的區(qū)別和動態(tài)?SQL詳解
這篇文章主要介紹了MyBatis中#{}和${}的區(qū)別,包括參數(shù)傳遞、安全性、性能等方面,然后詳細(xì)介紹了如何使用#{}和${}進(jìn)行排序、模糊查詢、動態(tài)SQL、數(shù)據(jù)庫連接池等操作,最后,總結(jié)了注解方式的動態(tài)SQL,感興趣的朋友跟隨小編一起看看吧2024-11-11
詳解Elasticsearch如何把一個索引變?yōu)橹蛔x
這篇文章主要為大家介紹了詳解Elasticsearch如何把一個索引變?yōu)橹蛔x示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

