set删除一个元素时间复杂度_set/map接口及其实现类
---------------[ 感謝小郡提供的圖片]
1.Map接口/Hashtable、HashMap、TreeMap實現類
Hashtable、HashMap、TreeMap 都是最常見的一些 Map 實現,是以鍵值對的形式存儲和操作數據的容器類型。Hashtable 是早期 Java 類庫提供的一個哈希表實現,本身是同步的,不支持 null 鍵和值,由于同步導致的性能開銷,所以已經很少被推薦使用。HashMap 是應用更加廣泛的哈希表實現,行為上大致上與 HashTable 一致,主要區別在于HashMap 不是同步的,支持 null 鍵和值等。通常情況下,HashMap 進行 put 或者 get 操作,可以達到常數時間的性能,所以它是絕大部分利用鍵值對存取場景的首選,比如,實現一個用戶 ID 和用戶信息對應的運行時存儲結構。TreeMap 則是基于紅黑樹的一種提供順序訪問的 Map,和 HashMap 不同,它的 get、put、remove 之類操作都是 O(log(n))的時間復雜度,具體順序可以由指定的 Comparator 來決定,或者根據鍵的自然順序來判斷
HashMap 等其他 Map 實現則是都擴展了 AbstractMap,里面包含了通用方法抽象。不同Map 的用途,從類圖結構就能體現出來,設計目的已經體現在不同接口上。大部分使用 Map 的場景,通常就是放入、訪問或者刪除,而對順序沒有特別要求,HashMap在這種情況下基本是最好的選擇。HashMap 的性能表現非常依賴于哈希碼的有效性,
遵守 hashCode 和 equals 的一些基本約定,比如:
- equals 相等,hashCode 一定要相等。
- 重寫了 hashCode 也要重寫 equals。
- hashCode 需要保持一致性,狀態改變返回的哈希值仍然要一致。equals 的對稱、反射、傳遞等特性。
針對有序 Map 的分析內容比較有限,我再補充一些,雖然 LinkedHashMap 和 TreeMap 都可以保證某種順序,但二者還是非常不同的LinkedHashMap 通常提供的是遍歷順序符合插入順序,它的實現是通過為條目(鍵值對)維護一個雙向鏈表。注意,通過特定構造函數,我們可以創建反映訪問順序的實例,所謂的put、get、compute 等,都算作“訪問”。這種行為適用于一些特定應用場景,例如,我們構建一個空間占用敏感的資源池,希望可以自動將最不常被訪問的對象釋放掉,這就可以利用 LinkedHashMap 提供的機制來實現
---------------摘自《Java核心技術36講》
--------------------2019/05/08更新------------------------------------
- HashMap存儲自定義對象需要重寫equals和hashcode方法
- LindedHashMap存儲自定義對象需要重寫equals和hashcode方法
- TreeMap存儲自定義對象需要寫內/外部比較器
--------------------2019/05/08更新------------------------------------
2.set內/外部比較器
當一個自定義對象實現Comparable并重寫compareTo方法時,通過指定具體的比較策略,此時稱為內部比較器。
public class Student implements Comparable<Student>{private String id;private String name;private int age;// 。。。@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";}@Overridepublic int compareTo(Student o) {if(this.getAge()<o.getAge()) {return -1;}else if(this.getAge() == o.getAge()) {return 0;}else {return 1;}}}當實際開發過程中不知道添加元素的源代碼、無權修改別人的代碼,此時可以使用外部比較器。Comparator 位于java.util包中,定義了compare(o1,o2) 用于提供外部比較策略。TreeSet接受一個指定比較策略的構造方法,這些比較策略的實現類必須實現Comparator接口。
public class Test01 {public static void main(String[] args) {LenComparator lenComparator = new LenComparator();TreeSet<String> set2 = new TreeSet<String>(lenComparator);set2.add("banana");set2.add("coco");set2.add("apple");set2.add("apple");System.out.println(set2);} }class LenComparator implements Comparator<String>{@Overridepublic int compare(String o1, String o2) {return o1.length() - o2.length();} }使用匿名內部類優化 public class Test02 {public static void main(String[] args) {TreeSet<String> set2 = new TreeSet<String>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.length() - o2.length();}});set2.add("banana");set2.add("coco");set2.add("apple");set2.add("apple");System.out.println(set2);} }3.set接口/Hashset LinkedHashSet TreeSet實現類
Set是廣義的集合容器,容器內數據是無序,唯一的
public static void main(String[] args) {/*** 增:add/addAll* 刪:clear/remove/removeAll/retainAll* 改:* 查:contains/containsAll* 遍歷:iterator* 其他:size/isEmpty*/Set<Integer> set = new HashSet<Integer>();// [1]添加// 無序set.add(10);set.add(3);set.add(20);set.add(0);// 不能添加重復元素boolean r = set.add(1);System.out.println(set);// 【2】刪除 // set.remove(1); // set.clear(); // System.out.println(set);// 【3】查看是否包含System.out.println(set.contains(1));// 【4】其他System.out.println(set.size());System.out.println(set.isEmpty());}1.9.2Set接口的遍歷 public static void main(String[] args) {Set<String> set = new HashSet<String>();set.add("banana");set.add("apple");set.add("coco");// 快速遍歷for (String item : set) {System.out.println(item);}// 迭代器Iterator<String> it = set.iterator();while(it.hasNext()) {String item = it.next();System.out.println(item);}}接口的遍歷
public static void main(String[] args) {Set<String> set = new HashSet<String>();set.add("banana");set.add("apple");set.add("coco");// 快速遍歷for (String item : set) {System.out.println(item);}// 迭代器Iterator<String> it = set.iterator();while(it.hasNext()) {String item = it.next();System.out.println(item);}}總結
以上是生活随笔為你收集整理的set删除一个元素时间复杂度_set/map接口及其实现类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python class函数报错_Pyt
- 下一篇: arduinoesp8266定时器_es