Java容器指的是List,Set,Map這些類。由於翻譯的問題,問到集合,Collection這些指的都是它們幾個。 List ArrayList 隨機訪問快 LinkedList 插入刪除快 這個好理解,array嘛就是數組,隨機訪問快。link嘛就是鏈表,當然是插入刪除快了。 Set 每個元素 ...
Java容器指的是List,Set,Map這些類。由於翻譯的問題,問到集合,Collection這些指的都是它們幾個。
List
ArrayList 隨機訪問快
LinkedList 插入刪除快
這個好理解,array嘛就是數組,隨機訪問快。link嘛就是鏈表,當然是插入刪除快了。
Set 每個元素只能放一次
HashSet 使用散列
TreeSet 使用紅黑樹,會對元素排序,介面是SortedSet。初始化TreeSet時可以傳入Comparator對象的實現做為排序函數
LinkedHashSet 也使用散列,但使用鏈表來維護插入順序
Set的訪問順序
HashSet按照HashCode的順序
TreeSet對元素排序有兩種方法:1、對象implements Comparable。2、new TreeSet傳入參數T extends Comparator。
易錯點:兩個不要搞反了。在創建TreeSet的時候可以不初始化任何排序方法,此時不會報錯。但添加對象進去的時候就會報錯了,提示cannot be cast to java.lang.Comparable
LinkedHashSet按照插入的次序顯示
關於HashCode
HashCode是一個int數值,同一個對象要求在get和put的HashCode是同一個。不同對象的HashCode不要求必須不同,只要equals方法能區分開就可以了。
一個實用的HashCode應該是基於對象內容的,並且分佈平均的
Map相同的key只能放一次。這個key使用key對象的equals來判斷是否重覆
HashMap 類似HashSet,按key的HashCode存放
LinkedHashMap 可以按照插入次序存放,或者最近最少使用LRU順序存放。比HashMap慢一點,但迭代訪問時更快
TreeMap 類似TreeSet,基於紅黑樹排序
此外還有WeakHashMap, ConcurrentHashMap, IdentityHashMap
各種容器的遍歷
List<Integer> list = new ArrayList<Integer>(); //使用Iterator遍歷。缺點是不能隨機訪問 Iterator iter = list.iterator(); while(iter.hasNext()) { Integer i = (Integer) iter.next(); } //這個比較好。不過註意調用get(i)的時候千萬不要超出List的長度範圍,尤其是進行刪除操作之後! for(int i=0; i<list.size(); i++) { Integer n = list.get(i); } for(Integer i : list) { //可以直接對i操作 } //java8的forEach和lambda表達式組合是最牛的。適合遍歷輸入或者操作。 list.forEach(s -> System.out.println(s));
HashSet<Integer> iset = new HashSet<Integer>(); iset.add(3); iset.add(8); iset.add(7); iset.add(11); //最簡單的必須是它 iset.forEach(i -> System.out.println(i)); //不能用for了,因為沒有隨機訪問的get函數啦! Iterator<Integer> iter = iset.iterator(); while(iter.hasNext()) { iter.next(); }
Map<String, String> map = new HashMap<String, String>(); map.put("111", "one"); map.put("zz", "zzzzzzzz"); map.put("a", "apple"); //對於entrySet迭代 Iterator iter = map.entrySet().iterator(); while(iter.hasNext()) { Entry entry = (Entry) iter.next(); System.out.println(entry.getKey() + ": " + entry.getValue()); } //對key的set迭代 Iterator iter2 = map.keySet().iterator(); while(iter2.hasNext()) { String key = (String) iter2.next(); System.out.println(key + ": " + map.get(key)); }