Map集合
1. Map介绍
1.1 通过键-值(key-value)对的形式来存储数据
1.2 Map的实现:HashMap(使用频率最高的),TreeMap,HashTable
1.3 Map中,key可以为任意类型,但这里建议使用String,value也可以是任意类型
1.4 Map里面多个value可以是不同类型
1.5 Map里面key是可以重复的,当key重复时,后存入的数据会覆盖前面的数据
1.6 Map里面,value可以重复.
1.7 Map里面的key可以为null,但是只能有一个,多个的时候,后面的会覆盖前面的
1.8 Map中value可以是null,多个value可以同时为null。
1.9 Map中的key在底层可以理解为是一个Set
2. Map的常用方法
int size():Map集合中key-value的长度
boolean containsKey(Object key):判断是否包含指定的key
boolean containsValue(Object value):判断是否包含指定的value
V put(K key, V value):把指定的key-value存入Map集合(增加,修改)
V remove(Object key):根据key在Map中删除指定的key-value组合(删除)
V get(Object key):根据指定的key来获取对应的value(查找)
boolean isEmpty():判断集合是否为空
Set keySet():Map中所有key的集合
void putAll(Map m):把一个Map集合存入指定的Map中
Collection values():返回Map中所有的value的集合,不包括key
3. HashMap
3.1 HashMap的原理
Map集合中,存储数据,实际上是一个Entry类型的数组,中间的每个元素又是一个链表
存储原理:
1.判断key是否为空,如果为空,把指定的value存到首位
2.如果key 不为空,先根据key的hashCode来计算得到hash值
3.再根据hash值来获取数组的下标,如果该下标对应的位置已经有数据了,替代该数据
读取原理:
类似于存储
根据key的hashCode值,调用hash(),得到一个hash值;
再根据hash值获取数组下标(通过indexFor()方法),再根据数组下标从数组中获取元素
3.2 HashMap的迭代
目的:迭代出map集合中所有数据
方法一:1.通过keySet()方法,找到所有key的集合,返回类型是一个Set;
2.通过Iterator迭代器,迭代出Set中的每一个key;
3.通过get(key)方法,根据上一步得到的key,来获取对应的value
方法二:1.通过values()方法,获取map集合中所有的value的集合.返回值类型为Collection(该接口是List和Set的父接口,该类型下有Iiterator迭代器,可以用来迭代)
2.通过Iterator迭代器,迭代出所有的value
方法三:1.通过entrySet()方法,得到一个Entry对象的集合,这里用Set来装载.
2.通过Set中的迭代器,迭代出每一个Entry对象.
3.针对每一个Entry对象,通过getKey()和getValue()方法,来分别获取到对应的key和value
4. 泛型的使用
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法
a.使用Map的泛型
Map<String,Object> map = new HashMap<String,Object>();
b.泛型接口的定义:
public interface IObjectDAO<T,K> {
public void addObj(T vo);
public void updateObj(T vo);
public boolean check(K id);
}
c.泛型类:
public class Person<T> {
public List<T> all = new ArrayList<T>();
public boolean doCreate(T vo){
all.add(vo);
return true;
}
}
d.泛型方法(当静态方法需要使用泛型时,只能在方法中定义泛型):
public class Person {
public static <T> boolean doCreate(T vo){
System.out.println("vo:"+vo);
return true;
}
e.受限制的泛型(了解):
class MyGenerics:将来使用时只能给List或其子类型
T类型或其父类类型
5. TreeMap
TreeMap 中包含了红黑树,把key存下来,红黑树要求它自己以及左右子树都是平衡二叉树(左右两个子树的高度差在1以内).
在使用TreeMap存储数据时,先把数据存入map,然后利用红黑树的左悬,右悬,着色等操作,调整二叉树的结构.
6. HashTable
HashTable与HashMap的区别:
hashtable 是jdk1.0提出来的,是同步的,线程安全的,key和value都不能为空,继承自Dictionary,有contains()方法直接判断键-值对
hashMap是jdk1.2提出来的,不是同步的,线程不安全,key和value都可以为空,继承自AbstractMap,通过containsKey()和containsValue()分别判断