Java判斷字符串是否在List中的方案詳解(忽略大小寫(xiě))
Java中高效判斷字符串是否在List中(忽略大小寫(xiě))
對(duì)于需要頻繁調(diào)用且數(shù)據(jù)量大的情況,有幾種優(yōu)化方案可以選擇:
方案1:使用HashSet存儲(chǔ)小寫(xiě)版本(推薦)
import java.util.*; public class CaseInsensitiveLookup { private final Set<String> lowerCaseSet; public CaseInsensitiveLookup(List<String> originalList) { // 預(yù)處理:將所有字符串轉(zhuǎn)為小寫(xiě)并存入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)點(diǎn):
- 預(yù)處理時(shí)間復(fù)雜度O(n),之后每次查詢(xún)時(shí)間復(fù)雜度O(1)
- HashSet的查找效率極高
- 內(nèi)存占用相對(duì)合理
缺點(diǎn):
- 初始構(gòu)建需要遍歷整個(gè)列表
- 如果原始列表頻繁變化,需要重新構(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)點(diǎn):
- 查詢(xún)時(shí)間復(fù)雜度O(log n)
- 保持元素有序
缺點(diǎ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)點(diǎn):
- 不需要預(yù)處理
- 可以利用多核CPU
缺點(diǎn):
- 每次查詢(xún)都需要遍歷(雖然并行)
- 不適合頻繁調(diào)用場(chǎng)景
最佳實(shí)踐建議
- 如果列表不常變化:使用方案1(HashSet),這是查詢(xún)效率最高的方法
- 如果需要保持插入順序:考慮LinkedHashSet
- 如果列表經(jīng)常變化:考慮方案3或使用ConcurrentHashMap實(shí)現(xiàn)類(lèi)似方案1的功能
- 如果內(nèi)存非常緊張:可以考慮方案3,但性能會(huì)下降
使用示例
List<String> largeList = Arrays.asList("Apple", "Banana", "Orange", ...); CaseInsensitiveLookup lookup = new CaseInsensitiveLookup(largeList); // 頻繁調(diào)用 boolean contains = lookup.containsIgnoreCase("apple"); // 返回true
選擇哪種方案取決于你的具體場(chǎng)景:數(shù)據(jù)量大小、查詢(xún)頻率、列表變更頻率和內(nèi)存限制等因素。
到此這篇關(guān)于Java中高效判斷字符串是否在List中(忽略大小寫(xiě))的文章就介紹到這了,更多相關(guān)java字符串判斷是否在list中內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java list中包含某個(gè)字符串的兩種方法實(shí)現(xiàn)
- java中List數(shù)組用逗號(hào)分隔開(kāi)轉(zhuǎn)成字符串2種方法
- java 將 list 字符串用逗號(hào)隔開(kāi)拼接字符串的多種方法
- Java8 將List轉(zhuǎn)換為用逗號(hào)隔開(kāi)的字符串的多種方法
- java 將字符串、list 寫(xiě)入到文件,并讀取內(nèi)容的案例
- java將String字符串轉(zhuǎn)換為L(zhǎng)ist<Long>類(lèi)型實(shí)例方法
- java的Jackson將json字符串轉(zhuǎn)換成泛型List
- 淺談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化
- Java中Json字符串直接轉(zhuǎn)換為對(duì)象的方法(包括多層List集合)
相關(guān)文章
MyBatis映射文件中parameterType與resultType的用法詳解
MyBatis中的ParameterType指的是SQL語(yǔ)句中的參數(shù)類(lèi)型,即傳入SQL語(yǔ)句中的參數(shù)的類(lèi)型,下面這篇文章主要給大家介紹了關(guān)于MyBatis映射文件中parameterType與resultType用法的相關(guān)資料,需要的朋友可以參考下2023-04-04Java多線(xiàn)程中的wait、notify和park、unpark的使用詳解
這篇文章主要介紹了Java多線(xiàn)程中的wait、notify和park、unpark的使用詳解,它們都是線(xiàn)程之間進(jìn)行協(xié)作的手段,都屬于 Object 對(duì)象的方法,必須獲得此對(duì)象的鎖,才能調(diào)用這幾個(gè)方法,需要的朋友可以參考下2023-12-12MyBatis3傳遞多個(gè)參數(shù)(Multiple Parameters)
這篇文章主要介紹了MyBatis3傳遞多個(gè)參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Java中Springboot集成Kafka實(shí)現(xiàn)消息發(fā)送和接收功能
Kafka是一個(gè)高吞吐量的分布式發(fā)布-訂閱消息系統(tǒng),主要用于處理大規(guī)模數(shù)據(jù)流,它由生產(chǎn)者、消費(fèi)者、主題、分區(qū)和代理等組件構(gòu)成,Kafka可以實(shí)現(xiàn)消息隊(duì)列、數(shù)據(jù)存儲(chǔ)和流處理等功能,在Java中,可以使用Spring Boot集成Kafka實(shí)現(xiàn)消息的發(fā)送和接收,感興趣的朋友跟隨小編一起看看吧2025-01-01Java線(xiàn)程池的幾種實(shí)現(xiàn)方法和區(qū)別介紹
下面小編就為大家?guī)?lái)一篇Java線(xiàn)程池的幾種實(shí)現(xiàn)方法和區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2016-05-05java stream中Collectors的用法實(shí)例精講
這篇文章主要為大家介紹了java stream中Collectors的用法實(shí)例精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09nacos在mac上部署提示找不到或無(wú)法加載主類(lèi)的解決
這篇文章主要介紹了nacos在mac上部署提示找不到或無(wú)法加載主類(lèi)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06