Java 集合和映射表
集合
可以使用集合的三個具體類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 集合和映射表