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