1. Map<K,V> 键值对--两个泛型K和V
Map集合的数据结构对谁有效?--只对键有效,与值无关
(比如想对值进行排序,Map没有提供的方法)
Map的功能:
1)添加功能
V put(K key, V value):
如果键是第一次被存储,就是添加功能
如果键已经在集合中存在,就是替换功能
2)删除功能
void clear()
V remove(Object key): 根据指定的键删除键值对元素,并把值返回
3)判断功能
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
4)获取功能
Set<Map.Entry<K,V>> entrySet():返回的是键值对对象的集合
V get(Object key)
Set<K> keyset(): 返回键的Set集合
Collection<V> values(): 返回值的Collection集合
5)长度功能
int size(): 返回键值对的对数
遍历方式
1)通过键来找值
a)获取所有键的集合 -- hm.keyset()
b)遍历键的集合,获取到每一个键
c)根据键找值 -- hm.get()
for(String key: hm.keyset()){
String value = hm.get(key);
System.out.println(value);
}
2)通过Map.Entry<String,String>键值对对象集合来找键和值
a)Set<Map.Entry<K,V>> entrySet():返回的是键值对对象的集合
Set<Map.Entry<String,String>> set = hm.entrySet();
b)接口 Map.Entry<K,V> --方法
K getKey(); V getValue();
for(Map.Entry<String,String> me: set)
{
System.out.println(me.getKey()+"---"+me.getValue());
}
2. HashMap
想实现唯一性,类似于HashSet
如果是自定义类,实现唯一性要重写HashCode()和equals()方法
如果是字符串类,字符串类已经重写了HashCode()和equals()方法
3. TreeMap
类似于TreeSet
如果是自定义类,想完成排序,三种方法(无参构造+Comparable;有参构造+显式实现Comparator;有参构造+Comparator匿名内部类)
如果是String类或Integer类,它们已经实现了Comparable接口
4. LinkedHashMap
键的数据结构是链表和哈希表
键有序(存放与取出顺序一致),唯一
5. Hashtable和HashMap的区别
Hashtable JDK1.0 线程安全, 效率低,不允许null键和值
HashMap JDK1.2 线程非同步,效率高,允许null键和值
6. Map集合的嵌套
1)HashMap里面嵌套一个HashMap
HashMap<String,HashMap<String,String>> czbk = new HashMap<>();
2)HashMap里面嵌套一个ArrayList
HashMap<String,ArrayList<Student>> czbk = new HashMap<>();
7. Collection是单列集合的顶层接口
Collections是针对Collection集合进行操作的工具类
Collections中要掌握的功能
1)public static <T> void sort(List<T> list) --泛型方法:排序
2)public static <T> int binarySearch(List<T> list, T key) --泛型方法:二分查找
3)public static <T> max(List<T> list)
public static <T> min(List<T> list)
4)public static void reverse(List<T> list)
5)public static void shuffle(List<T> list) 随机置换
6)在多线程环境中有用
如何创建一个线程安全的集合?
public static <T> List<T> synchronizedList(List<T> list)
synchronizedSet synchronizedMap
List<String> list = Collections.synchronizedList(new ArrayList<String>());
//不再使用Vector了