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
各種容器的遍歷:
1、List集合的遍歷
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));
2、Set集合的遍歷
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();
}
3、Map集合的遍歷
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));
}