一、hashmap有序嗎
在探究treemap是否有序前,我們先來看一下另一個常用的Map實現——hashmap是否有序。
hashmap並不保證元素的順序,因為hashmap是無序的,其在加入元素時是通過hash演算法將元素映射到不同的哈希桶中,哈希桶的位置是隨機的,因此添加元素的順序並不能保證元素在map中的相對順序。
Map map = new HashMap(); map.put("one", "1"); map.put("two", "2"); map.put("three", "3"); System.out.println(map); //輸出:{two=2, one=1, three=3}
二、treemap有序原理
與hashmap不同的是,treemap是一棵二叉搜索樹,每個節點包含一個鍵-值對。根據鍵來排序,可以使用自然排序或自定義排序。treemap保證元素是按照鍵值的大小順序存儲的。
treemap的排序使用紅黑樹實現,具體來說,就是通過左旋、右旋、節點顏色變換等操作保證樹的平衡化(也就是保證查詢、添加、刪除的時間複雜度都是O(logn)),同時每個節點都滿足父節點小於等於左子節點,大於等於右子節點的條件。因此,treemap能夠保證元素有序。
三、treemap自然排序
treemap默認使用自然排序,即按照元素的「自然順序」進行排序。對於數字、字元等,其自然排序就是從小到大的順序。而對於自定義的對象,需要實現Comparable介面以便treemap能夠確定元素之間的大小關係。
TreeMap map = new TreeMap(); map.put(3, "apple"); map.put(1, "banana"); map.put(2, "orange"); System.out.println(map); //輸出:{1=banana, 2=orange, 3=apple}
四、treemap倒序排序
在treemap中進行倒序排序也很容易,只需要使用treemap的descendingMap方法:
TreeMap map = new TreeMap(); map.put(3, "apple"); map.put(1, "banana"); map.put(2, "orange"); Map reverseMap = map.descendingMap(); System.out.println(reverseMap); //輸出:{3=apple, 2=orange, 1=banana}
五、treemap定義排序
如果默認的自然排序不能滿足需求,我們可以使用Comparator對元素進行自定義排序。Comparator與Comparable的區別在於,Comparable是在對象內部定義比較規則,而Comparator是在外部定義比較規則。
TreeMap map = new TreeMap(new Comparator() { @Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); } }); map.put(3, "apple"); map.put(1, "banana"); map.put(2, "orange"); System.out.println(map); //輸出:{3=apple, 2=orange, 1=banana}
六、treemap有序遍歷
由於treemap是有序的,因此遍歷時也會按照元素的順序進行遍歷。具體來說,可以使用treemap的keySet、values或entrySet方法進行遍歷:
TreeMap map = new TreeMap(); map.put(3, "apple"); map.put(1, "banana"); map.put(2, "orange"); for (Integer key : map.keySet()) { System.out.println(key + "=" + map.get(key)); } //輸出:1=banana // 2=orange // 3=apple
七、treemap有序還是無序
可以肯定的是,treemap是有序的。與之相對的是hashmap,其是無序的。如果需要保證元素有序,使用treemap會更合適。
八、hashmap和treemap
總體來說,hashmap比treemap性能更好。hashmap的時間複雜度是O(1),而treemap是O(logn)。然而,treemap在需要保證元素順序時比hashmap更有用。
九、treemap排序
我們可以通過重載compareTo或傳入Comparator來進行自定義排序。默認情況下,treemap會根據元素的自然排序進行排序。可以通過descendingMap方法進行倒序排序。
以上就是對treemap有序性的詳細探討,希望能幫助理解treemap的用法。
原創文章,作者:WYQL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/137200.html