創建一個自定義比較器
雙列集合:
-------------| Map 如果是實現了Map接口的集合類,具備的特點: 存儲的數據都是以鍵值對的形式存在的,鍵不可重復,值可以重復。
----------------| HashMap 底層也是基於哈希表實現 的。
HashMap的存儲原理:
往HashMap添加元素的時候,首先會調用鍵的hashCode方法得到元素 的哈希碼值,然後經過運算就可以算出該
元素在哈希表中的存儲位置。
情況1: 如果算出的位置目前沒有任何元素存儲,那麽該元素可以直接添加到哈希表中。
情況2:如果算出 的位置目前已經存在其他的元素,那麽還會調用該元素的equals方法與這個位置上的元素進行比較
,如果equals方法返回 的是false,那麽該元素允許被存儲,如果equals方法返回的是true,那麽該元素被視為
重復元素,不允存儲。
----------------| TreeMap TreeMap也是基於紅黑樹(二叉樹)數據結構實現 的, 特點:會對元素的鍵進行排序存儲。
TreeMap 要註意的事項:
1. 往TreeMap添加元素的時候,如果元素的鍵具備自然順序,那麽就會按照鍵的自然順序特性進行排序存儲。
2. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性, 那麽鍵所屬的類必須要實現Comparable接口,把鍵
的比較規則定義在CompareTo方法上。
3. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性,而且鍵所屬的類也沒有實現Comparable接口,那麽就必須
在創建TreeMap對象的時候傳入比較器。
class Emp {//implements Comparable<Emp>{ String name; int salary; public Emp(String name, int salary) { super(); this.name = name; this.salary = salary; } @Overridepublic String toString() { return "[姓名:"+this.name+" 薪水:"+ this.salary+"]"; } /* @Override public int compareTo(Emp o) { return this.salary - o.salary; }*/ } //自定義一個比較器 class MyComparator implements Comparator<Emp>{ @Override public int compare(Emp o1, Emp o2) { return o1.salary - o2.salary; } } public class Demo6 { public static void main(String[] args) { /* TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>(); tree.put(‘c‘,10); tree.put(‘b‘,2); tree.put(‘a‘,5); tree.put(‘h‘,12); System.out.println(tree);*/ //創建一個自定義比較器 MyComparator comparator = new MyComparator(); TreeMap<Emp, String> tree = new TreeMap<Emp, String>(comparator); tree.put(new Emp("冰冰", 2000),"001"); tree.put(new Emp("家寶", 1000),"002"); tree.put(new Emp("習總", 3000),"003"); tree.put(new Emp("克強", 5000),"005"); tree.put(new Emp("財厚", 5000),"008"); System.out.println(tree); } }
雙列集合:-------------| Map 如果是實現了Map接口的集合類,具備的特點: 存儲的數據都是以鍵值對的形式存在的,鍵不可重復,值可以重復。----------------| HashMap 底層也是基於哈希表實現 的。HashMap的存儲原理:往HashMap添加元素的時候,首先會調用鍵的hashCode方法得到元素 的哈希碼值,然後經過運算就可以算出該元素在哈希表中的存儲位置。 情況1: 如果算出的位置目前沒有任何元素存儲,那麽該元素可以直接添加到哈希表中。情況2:如果算出 的位置目前已經存在其他的元素,那麽還會調用該元素的equals方法與這個位置上的元素進行比較,如果equals方法返回 的是false,那麽該元素允許被存儲,如果equals方法返回的是true,那麽該元素被視為重復元素,不允存儲。
----------------| TreeMap TreeMap也是基於紅黑樹(二叉樹)數據結構實現 的, 特點:會對元素的鍵進行排序存儲。
TreeMap 要註意的事項:1. 往TreeMap添加元素的時候,如果元素的鍵具備自然順序,那麽就會按照鍵的自然順序特性進行排序存儲。2. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性, 那麽鍵所屬的類必須要實現Comparable接口,把鍵的比較規則定義在CompareTo方法上。3. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性,而且鍵所屬的類也沒有實現Comparable接口,那麽就必須在創建TreeMap對象的時候傳入比較器。
----------------| Hashtable */class Emp {//implements Comparable<Emp>{String name;int salary;public Emp(String name, int salary) {super();this.name = name;this.salary = salary;}@Overridepublic String toString() {return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";}
/*@Overridepublic int compareTo(Emp o) {return this.salary - o.salary;}*/}
//自定義一個比較器class MyComparator implements Comparator<Emp>{@Overridepublic int compare(Emp o1, Emp o2) {return o1.salary - o2.salary;}}
public class Demo6 {public static void main(String[] args) {/*TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>();tree.put(‘c‘,10);tree.put(‘b‘,2);tree.put(‘a‘,5);tree.put(‘h‘,12);System.out.println(tree);*///創建一個自定義比較器MyComparator comparator = new MyComparator();TreeMap<Emp, String> tree = new TreeMap<Emp, String>(comparator);tree.put(new Emp("冰冰", 2000),"001");tree.put(new Emp("家寶", 1000),"002");tree.put(new Emp("習總", 3000),"003");tree.put(new Emp("克強", 5000),"005");tree.put(new Emp("財厚", 5000),"008");System.out.println(tree);}
}
創建一個自定義比較器