Java中TreeSet、HashSet、Collection重寫比較器的實現(xiàn)
一、什么是比較器?
比較器是一種可以對集合或數(shù)組中的元素按照自定義的方式進行排序的對象,它是實現(xiàn)了Comparator接口的類的實例,可以決定元素在集合或映射中如何被排序和存儲。
比較器有兩種基本類型:自然排序和定制排序。自然排序是指讓要排序的類實現(xiàn)Comparable接口,并重寫compareTo方法,來定義元素的默認排序方式。定制排序是指創(chuàng)建一個實現(xiàn)了Comparator接口的類,并重寫compare方法,來定義元素的特定排序方式。定制排序可以覆蓋自然排序,也可以在自然排序不適用的情況下使用。
二、TreeSet為什么重寫比較器?
TreeSet是一個有序的集合,它可以按照自然排序或者定制排序來排列元素。自然排序是指讓要排序的類實現(xiàn)Comparable接口,并重寫compareTo方法,來定義元素的默認排序方式。定制排序是指創(chuàng)建一個實現(xiàn)了Comparator接口的類,并重寫compare方法,來定義元素的特定排序方式。
TreeSet實現(xiàn)了Set接口,可以去重內(nèi)容相同的元素。比如存入Integer類型的兩個數(shù)據(jù),6和6,遍歷輸出,只會輸出一個6。但是對于自定義類,添加進TreeSet排序,會報錯,因為比較器無法比較一個類。因此我們重寫比較器,按照類中的指定屬性進行排序
代碼展示:
直接使用這個模板也是可以的,根據(jù)什么排序,就使用什么來做減法。等于0時會去重,正數(shù)會從小到大排序,負數(shù)會從大到小排序。
// 創(chuàng)建一個按照年齡升序排列的TreeSet TreeSet<Person> ts = new TreeSet<>(new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { return p1.getAge() - p2.getAge(); } });
三、HashSet為什么重寫比較器?
HashSet是一個無序的集合,它不保證元素的排列順序,并且不允許重復(fù)元素。HashSet是基于哈希表實現(xiàn)的,它通過調(diào)用元素的hashCode和equals方法來判斷元素是否相等和決定元素在哈希表中的位置。
當我們添加進HashSet中相同屬性的兩個類,想去重時,可以選擇重寫hashcode方法和equal方法。(HashSet的比較器底層實現(xiàn)通過hashcode和equal,兩個返回值都為true時,才會去重)
代碼展示:
// 定義一個Person類,并重寫hashCode和equals方法 class Person { private String name; private int age; // 省略構(gòu)造方法和get/set方法 @Override public int hashCode() { return Objects.hash(name, age); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person person = (Person) obj; return age == person.age && Objects.equals(name, person.name); } } // 創(chuàng)建一個HashSet對象,并添加Person對象 HashSet<Person> hs = new HashSet<>(); hs.add(new Person("張三", 20)); hs.add(new Person("李四", 21)); hs.add(new Person("張三", 20)); // 這個對象不會被添加,因為和第一個對象相等
四、Collection為什么重寫比較器?
Collection是一個接口,它是Java集合框架的根接口,它定義了一些通用的操作方法,如添加、刪除、遍歷、排序等。Collection接口有很多實現(xiàn)類,如ArrayList、LinkedList、HashSet、TreeSet等。Collection接口本身并不需要重寫比較器,但是它提供了一個sort方法,可以對實現(xiàn)了List接口的集合進行排序。該方法有兩個重載形式,一個是使用自然排序,另一個是使用定制排序。
當我們想對ArryList集合進行排序時(ArryList本身無法排序,沒有比較器),可以通過重寫比較器來進行排序。
// 創(chuàng)建一個ArrayList對象,并添加一些字符串 ArrayList<String> al = new ArrayList<>(); al.add("apple"); al.add("banana"); al.add("orange"); al.add("pear"); // 使用自然排序?qū)rrayList進行排序 Collections.sort(al); // 使用定制排序?qū)rrayList進行排序,按照字符串長度升序排列 Collections.sort(al, (s1, s2) -> s1.length() - s2.length());
到此這篇關(guān)于Java中TreeSet、HashSet、Collection重寫比較器的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java 重寫比較器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Spring?Batch實現(xiàn)大數(shù)據(jù)處理的操作方法
通過使用Spring?Batch,我們可以高效地處理大規(guī)模數(shù)據(jù),本文介紹了如何配置和實現(xiàn)一個基本的Spring?Batch作業(yè),包括讀取數(shù)據(jù)、處理數(shù)據(jù)和寫入數(shù)據(jù)的全過程,感興趣的朋友跟隨小編一起看看吧2024-07-07SpringBoot集成內(nèi)存數(shù)據(jù)庫H2的實踐
h2是內(nèi)存數(shù)據(jù)庫,查詢高效,可以在開發(fā)初期使用它。本文主要介紹了SpringBoot集成內(nèi)存數(shù)據(jù)庫H2的實踐,具有一定的參考價值,感興趣的可以了解一下2021-09-09使用Spring AOP實現(xiàn)MySQL數(shù)據(jù)庫讀寫分離案例分析(附demo)
分布式環(huán)境下數(shù)據(jù)庫的讀寫分離策略是解決數(shù)據(jù)庫讀寫性能瓶頸的一個關(guān)鍵解決方案,這篇文章主要介紹了使用Spring AOP實現(xiàn)MySQL數(shù)據(jù)庫讀寫分離案例分析(附demo),有興趣的可以了解一下。2017-01-01MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權(quán)限控制的方法
MyBatis-Plus是一款基于MyBatis的增強工具,它提供了一些便捷的功能和增強的查詢能力,數(shù)據(jù)權(quán)限控制是在系統(tǒng)中對用戶訪問數(shù)據(jù)進行限制的一種機制,這篇文章主要給大家介紹了關(guān)于MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權(quán)限控制的相關(guān)資料,需要的朋友可以參考下2024-01-01Java如何獲取resources下的文件路徑和創(chuàng)建臨時文件
這篇文章主要介紹了Java如何獲取resources下的文件路徑和創(chuàng)建臨時文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12