1. 程式人生 > >Java 集合和映射表

Java 集合和映射表

排序 n! pri text collect 技術 shc print public

技術分享圖片

集合

可以使用集合的三個具體類HashSet、LinkedHashSet、TreeSet來創建集合

技術分享圖片

技術分享圖片

技術分享圖片

HashSet類

負載系數

當元素個數超過了容量與負載系數的乘積,容量就會自動翻倍

HashSet類可以用來存儲互不相等的任何元素。考慮到效率的因素,添加到散列集中的對象必須以一種正確分散散列碼的方式來實現hashCode方法。

如果兩個對象相等,那麽這兩個對象的散列碼必須一樣。兩個不相等的對象可能有相同的散列碼

繼承Collection接口,所以Collection中的所有方法,都可以用

例子:

技術分享圖片

技術分享圖片

技術分享圖片

LinkedHashSet類

LinkedHashSet用一個鏈表實現來擴展HashSet類,他支持對集合內的元素排序

HashSet中的元素是沒有被排序的,而LinkedHashSet中的元素可以按照他們插入集合的順序提取。

例子:

技術分享圖片

技術分享圖片

LinkedHashSet保持了元素插入時的順序。

TreeSet類

技術分享圖片

例子:

public class TextTreeSet {
    public static void main(String [] args) {
        
        Set<String> set = new HashSet<String>();
        
        set.add("London");
        set.add(
"Paris"); set.add("New York"); set.add("Zon"); TreeSet<String> treeSet = new TreeSet<String>(set); System.out.println("Sorted tree set : " + treeSet); System.out.println("first : " + treeSet.first()); System.out.println(
"last : " + treeSet.last()); System.out.println(treeSet.headSet("New York")); //輸出New York 之前的數據 System.out.println(treeSet.tailSet("New York")); //輸出 New York 之後的數據 System.out.println("小於: " + treeSet.lower("Paris")); //返回一個小於給定的元素 System.out.println("大於: " + treeSet.higher("New York")); //返回一個大於給定的元素 System.out.println("小於或等於: " + treeSet.floor("P")); //返回一個小於或等於給定的元素 System.out.println("大於或等於:" + treeSet.ceiling("P")); //返回一個大於或等於給定的元素 System.out.println("pollFirst: " + treeSet.pollFirst()); System.out.println("pollLast: " + treeSet.pollLast()); System.out.println("New tree set: " + treeSet); } }

技術分享圖片

技術分享圖片

技術分享圖片

例子:

技術分享圖片

HashSet,LinkedHashSet和TreeSet有什麽區別?

HashSet使用哈希表實現的,元素是無序的。添加、刪除操作時間復雜度都是O(1)。TreeSet內部結構是一個樹結構(紅黑樹),元素是有序的,添加、刪除操作時間復雜度為O(log(n)),並且提供了first(), last(), headSet(), tailSet()等方法來處理有序集合。LinkedHashSet是介於HashSet 和 TreeSet之間,內部是一個雙向鏈表結構,所以它的插入是有序的,時間復雜度是O(1)。

映射表 技術分享圖片

技術分享圖片

技術分享圖片

更新方法包括clear、put、putAll和remove,方法clear()從映射表中刪除所有的條目。

方法put(K,V)為映射表中的指定的鍵和值添加條目,如果這個映射表原來就包含鍵的一個條目,這原來的值將被新的值所替代,並且返回與這個鍵相關聯的原來的值

查詢方法包括containsKey、containsValue、isEmpty和size。

技術分享圖片

技術分享圖片

LinkedHashMap類是用鏈表來實現來擴展HashMap類,他支持映射表中的條目的排序。HashMap沒有順序,而LinkedHashMap,元素可以按照插入的順序來順序排序,也可以按他們被最後一次訪問時的順序從最早到最晚排序,

TreeMap類在遍歷排好順序的鍵時是很高效的。鍵可以使用Comparable接口或Comparator接口來排序

例子:

技術分享圖片

技術分享圖片

技術分享圖片

LinkedHashMap如果使用了按訪問順序排序,那麽被訪問的,會放在映射表的末尾

三種映射表的使用情況

技術分享圖片

統計單詞出現次數例子:

public class CountOccurentOfWords {
    
    public static void main(String [] args) {
        
        String text = "Good morning. have a good class. Have a good visits. Have fun!.";
        Map<String, Integer> map = new TreeMap<>();
        String [] words = text.split("[ \n\t\r.,;:?!(){}]");
        
        for(int i=0; i<words.length; i++) {
            String key = words[i].toLowerCase();
            
            if(key.length() > 0) {
                if(!map.containsKey(key)) {
                    map.put(key, 1);
                }else {
                    int value = map.get(key);
                    value++;
                    map.put(key, value);
                }
            }
            
        }
        
        Set<Map.Entry<String, Integer>> wordSet = map.entrySet(); //調用entrySet()方法 可以返回一個Set集合
        for(Map.Entry<String, Integer> s: wordSet) {
            System.out.println(s.getKey() + "  " + s.getValue());
        }
    }
}

技術分享圖片

單元素與不可變的合集和映射表

技術分享圖片

技術分享圖片

Java 集合和映射表