Map接口

Map集合的特点

  • Map存储了一系列键值的映射关系
  • Map集合需要保证键的唯一性
  • 可以通过键获得值,反之则不能
  • Map集合存储元素使用put(key,value)方法

HashMap实现类

  • 线程不安全,存取速度快,允许存放null键,null值。
  • 通过HashSet原理保证键唯一性

Hashtable实现类

  • 线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。

TreeMap实现类

  • 通过二叉树算法保证键唯一性
  • 对键进行排序,排序原理与TreeSet相同

Properties实现类

  • Hashtable的子类,所以也是线程安全的
  • 用于读写配置文件的,一般配置项等号两边都是String,所以该集合中的两列保存的都是String类型的数据,这个集合中只能存String,所以不需要定义泛型。

Map接口中方法

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。

  1. 添加
  • put(K key, V value)
  • putAll(Map<? extends K,? extends V> m)
  1. 删除
  • clear()
  • remove(Object key)
  1. 判断
  • containsValue(Object value)
  • containsKey(Object key)
  • isEmpty()
  1. 获取
  • get(Object key)
  • size()
  • values()
  • entrySet()
  • keySet()

总结

1
2
3
4
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
|--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

Map和Set很像,其实Set底层就是使用了Map接口

map集合的两种取出方式:

  1. Set keySet():
  • 将map中所有的键存入到Set集合。因为set具备迭代器。
  • 所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
  • Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。
1
2
3
4
5
6
7
8
9
//Map
HashMap<Object,Object> map = new HashMap();
map.put(1,"I");
map.put(2,"love");
map.put(3,"you");
Set<Object> mapSet = map.keySet(); //根据key获取value
for (Object obj:mapSet) {
System.out.println(obj+"----"+map.get(obj)); //实际上就是遍历Set
}
  1. Set<Map.Entry<k,v>> entrySet():
    将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry,Entry其实就是Map中的一个static内部接口。

为什么要定义在内部呢?

因为只有有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。
而且该事物在直接访问Map集合中的元素。

Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。

1
2
3
4
5
6
7
//使用entrySet
Set<Map.Entry<Object, Object>> mapSet1= map.entrySet();
Iterator<Map.Entry<Object, Object>> iterator2 = mapSet1.iterator();
while(iterator2.hasNext()){
Map.Entry<Object, Object> next = iterator2.next();
System.out.println(next.getKey()+"======"+next.getValue());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Map(interface)
* 实现类:(implements)
* HashMap:低层实现采用了哈希表,这是一种非常重要是数据结构 数组+链表 核心(Node<K,V>[] ) 位桶数组
* ※HashMap线程不安全,效率高,允许key或value为null
* jdk8以后链表的长度大于8,转换成红黑树
* put的底层原理:
* 首先根据key对象的hashCode方法的到一个任意的哈希值,通过散列算法(一般是求余 %16)得到一个0-16的哈希值
* 然后存放到相应的地址(hash key value next),如果还有继续添加,形成链表结构
* get的底层原理:
* 首先根据key对象的hashCode方法的到一个任意的哈希值,通过散列算法(一般是求余 %16)得到一个0-16的哈希值
* 根据equals方法找到对应key的值的value 并返回
* java中规定,两个内容相同(equals()为true)的对象必须具有相等的hashCode
* TreeMap : 是红黑二叉树的典型实现,可以按照key递增的方式排序
*
* HashTable:
* ※线程安全,效率低,不允许key或value为null
*
* */