java comparator_Java基础之String漫谈(二)
Java-String
1. 導(dǎo)讀
上期分享了本人關(guān)于String四個(gè)問(wèn)題, 本期我們繼續(xù)探討String中的兩個(gè)問(wèn)題:
.1 String既然已經(jīng)實(shí)現(xiàn)了Comparable接口, 為什么還要提供內(nèi)部類(lèi)----CaseInsensitiveComparator;
.2 使用 "+" 拼接String究竟干了什么? 為什么在循環(huán)中不讓使用"+"拼接String;
2. String為什么要提供內(nèi)部類(lèi)CaseInsensitiveComparator
先來(lái)看下String實(shí)現(xiàn)了Comparable接口后做了什么:
String::compareTo.jpg
String::compareTo做了三件事:
.1 比較兩個(gè)字符串的長(zhǎng)度, 找出最小值;
.2 比較最小長(zhǎng)度中的字符是否相同, 因底層使用ASCII碼存儲(chǔ), 10進(jìn)制的ASCII是純數(shù)字, 可直接減得出比較結(jié)果(compareTo規(guī)定: 返回-1是小于; 0是等于; 1是大于);
.3 如果最小長(zhǎng)度的字符都相同, 再比較兩個(gè)字符串的長(zhǎng)度是否相同;
字符串是可能含有大小寫(xiě)的, 在String::compareTo中認(rèn)為A和a是不同的, 那么在忽略大小寫(xiě)的場(chǎng)景中就不適用了;既然String提供了基于Comparator的內(nèi)部類(lèi), 是不是對(duì)這種場(chǎng)景做了特殊處理呢?我們接下來(lái)看CaseInsensitiveComparator的核心實(shí)現(xiàn):
可以看到compare的邏輯和String:compareTo大同小異, 只是在第二步的時(shí)候做了特殊處理:
.1 先將char字符轉(zhuǎn)換成大寫(xiě)作比較(如果是數(shù)字則不變);
.2 如果大寫(xiě)比較不符, 再轉(zhuǎn)換成小寫(xiě)做比較;
.3 如果小寫(xiě)比較還是不符, 證明該char字符為數(shù)字, 直接比較即可;
上面只是說(shuō)明了這兩者實(shí)現(xiàn)的不同, 還是沒(méi)有說(shuō)明為什么這么實(shí)現(xiàn); 要解答這個(gè)首先需要說(shuō)明下Comparable 和Comparator的異同:
.1 兩者都是接口, 都是實(shí)現(xiàn)對(duì)象的比較的, 返回值都是{-1, 0, 1};
.2 Comparable需要重寫(xiě)Comparable::compareTo方法, 會(huì)對(duì)比較對(duì)象的代碼形成侵入; Comparator由一個(gè)比較目標(biāo)對(duì)象的策略類(lèi)來(lái)實(shí)現(xiàn), 同時(shí)比較策略則由編寫(xiě)者指定, 無(wú)需侵入比較對(duì)象的代碼;故而String實(shí)現(xiàn)Comparable接口提供了一種內(nèi)排序的方式, 而Comparator提供了一種不改變比較對(duì)象代碼, 實(shí)現(xiàn)比較的策略, 如果對(duì)CaseInsensitiveComparator的實(shí)現(xiàn)并不滿(mǎn)意, 也可以自己實(shí)現(xiàn)MySelfComparator;
劃重點(diǎn):
.1 CaseInsensitiveComparator的實(shí)現(xiàn)只是String作者提供了一種不同于String::compareTo的比較策略, 如果說(shuō)Compareable是比較的內(nèi)部實(shí)現(xiàn), 那么Comparator就是比較的外部實(shí)現(xiàn);
.2 Comparator這種方式實(shí)現(xiàn)了策略模式, 將變與不變完美分類(lèi); 關(guān)于設(shè)計(jì)模式后面再開(kāi)專(zhuān)題分享;
.3 Comparator接口中還有個(gè)equals方法沒(méi)有實(shí)現(xiàn), 不實(shí)現(xiàn)這個(gè)方法為什么不報(bào)錯(cuò)呢? 因?yàn)樗蓄?lèi)的父類(lèi)都是Object,Object::equals已經(jīng)對(duì)這個(gè)方法做了實(shí)現(xiàn), 也就不報(bào)錯(cuò)了;
.4 如果Compareable::compareTo 或者 Comparator::compare的實(shí)現(xiàn)的比較結(jié)果與equals不符時(shí), 你需要考慮這種情況會(huì)不會(huì)有影響;比如HashMap中先調(diào)用equals再調(diào)用的compareTo, 這時(shí)候如果equals與compareTo的結(jié)果是不一致, 不就引起問(wèn)題了; 雖然實(shí)現(xiàn)了Compareable接口不強(qiáng)制重寫(xiě)equals方法, 但是不一致的情況還是需要考慮下的;
3. String字符串拼接的三種方式比較
對(duì)于字符串拼接, 我們可以使用一下三種方式:
.1 "+
總結(jié)
以上是生活随笔為你收集整理的java comparator_Java基础之String漫谈(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “其字曰鸣鸿”上一句是什么
- 下一篇: 本地方法栈线程公有_Java运行时区域,