Collection两个子接口:list,set子。
Collection与Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字/值对。(转自别人的这句话,我自己比较认同)
Set接口:存储一种唯一(不允许重复),无序的对象。
List接口:存储一种不唯一(允许重复),有序的对象。
Map借口:存储一种成对的键值对象,提供key键到value值的映射。key不要求有序,不允许重复,value允许重复,不要求有序。
这里说说Map中的null情况:看代码
// Map的泛型
Map<String, String> map = new HashMap<String, String>();
map.put("1", "java");
map.put("2", "c#");
map.put("3", "html5");
map.put(null, "study");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
System.out.println("数量:" + map.size());
结果:
null study
3 html5
2 c#
1 java
数量:4
修改代码:
// Map的泛型
Map<String, String> map = new HashMap<String, String>();
map.put("1", "java");
map.put("2", "c#");
map.put("3", "html5");
map.put(null, "study");
map.put(null, "study1");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
System.out.println("数量:" + map.size());
结果:
null study1
3 html5
2 c#
1 java
数量:4
可以发现:null可以作为键,这样的键只有一个,并且是最后的那个key为null的;
但是编写代码时可以有一个或多个键所对应的值为null。
通过get()方法获取键值时,由于存在null的键值,Map中不能由get()方法来判断Map中是否存在某个键,改用containsKey()方法。
继承List的类有:ArrayList,LinkedList
继承Set的类有:HashSet,TreeSet
继承Map的类有:HashMap,HashTable,TreeMap
以上黑体是常用的
ArrayList长度每次增长50%
关于LinkedList特有的方法:addFirst(Object o) ,addLast(Object o),Object getFirst(),Object getLast(),Object removeFirst(),Object removeLast()
ArrayList PK LInkedList
- 都容纳所有类型对象,包括null,允许重复,保证元素存储顺序。
- ArrayList遍历元素和随机访问元素的效率比较高。
- LinkedList在于插入,删除元素时效率比较高。
- 在ArrayList 之前存在Vector是线程安全的,效率低,长度默认增长一倍。而ArrayList 线程非安全的,重速度,长度增长50%。
HashMap:Map的实现类,缺省情况下是非同步的,可以通过Map Collections.synchronizedMap(Map m)来达到线程同步
HashTable:Dictionary的子类,确省是线程同步的。不允许关键字或值为null
TreeMap:元素的顺序很重要时选用,当元素不必以特定的顺序进行存储时,使用HashMap。
Hashtable的使用不被推荐,HashMap提供了所有类似的功能,并且速度更快。当你需要在多线程环境下使用时,HashMap也可以转换为同步的。
Iterator :为集合而生,遍历集合。隐藏各种集合实现类内部细节,提供遍历集合统一编程接口。遍历方法后续补上。