接上篇Set接口之后,聊一聊集合中的Map接口
一.Map接口
1.Map接口的定义
是双列集合,用来存储一对(Key,Value)值的一对数据
key:无序的,不可重复的,使用set存储的所有的Key值------>key所在的类重写equals和hashCode()
value:无序的,可重复的,使用Collection存储Value值------->Value所在的类要重写
2.
Map子类 | 概括 |
---|---|
HashTable---->Peoperties | 常用来处理配置文件,key和value都是String 类型 |
HashMap -------> LinkedHashMap | 保证在遍历map元素的时候,可以按照添加的顺序去遍历 |
sortedMap----->TreeMap | 保证按照添加的key-value进行排序实现排序遍历 |
3.HashMap作为Map的主要实现类,是线程不安全的,效率比较高,存储null的key和value
4.Hashtable作为Map的古老实现类,是线程安全的,效率低,不能存储null和value值
5.HashMap的底层实现原理
JDK1.7的时候使用的是数组和链表
JDK1.8的时候使用的是数组+链表+红黑树
以JDK1.7为例
①HashMap map= new HashMap();在实例化之后,底层底层已经创建了长度是16的一维数组Entry[] table
②在经历过多次put之后。map.put(key1,value1);
首先调用的是key1所在的hashCode(),计算出Key1的值,此哈希值经过哈希算法之后,得到Entry数组存放的位置
如果在此位置上计算的数据为空,此时的key1-value1就会添加成功
如果此位置上有其他的元素b(或者链表的形式存在的多个元素),则比较元素key1和b中的hash值如果hash值不同,则元素key1添加成功
如果hash值相同,则需要比较key1的所在类的equals()方法equals()返回true,则key1添加成功
equals()返回false,则key1添加失败
在Hashmap中JDK8与JDK7的不同
①在new HashMap()的时候底层并没有创建一个长度为16的数组
②JDK8底层的数组是链表,而并非是Entry[]
③在首次使用的时候底层会创建长度为16的数组
④JDK8的底层是数组+链表+红黑树,当数组的某一个索引位置上的元素以链表的形式存放。
⑤当存放的数据个数>8且当前的数组的长度是>64时,索引位置上的数据改为使用红黑树存储
注意点:
HashMap的默认容量是16;默认的加载因子是0.75;扩充的临界值是12【16*0.75】
6.HashMap中的常用方法的应用
public static void main(String[] args) {
//1,创建HashMap
HashMap<String, Double> menus = new HashMap<String, Double>();
//2.添加数据
menus.put("雪菜包子", 1.5);
menus.put("萝卜包子", 1.5);
menus.put("豆腐包子", 1.5);
menus.put("猪肉粉条包子", 2.5);
menus.put("牛肉包子", 3.0);
System.out.println(menus);
//3. 键值对数量
System.out.println(menus.size());
//4.根据key查询value
System.out.println(menus.get("牛肉包子"));
//5.是否包含键
System.out.println(menus.containsKey("牛肉包子"));
//6.是否包含值
System.out.println(menus.containsValue(1.5));
//7.获取所有的key
Set<String> keys = menus.keySet();
System.out.println(keys);
//8.获取所有的value
Collection<Double> values = menus.values();
System.out.println(values);
//9.获取所有的键值对
Set<Entry<String, Double>> entrySet = menus.entrySet();
System.out.println(entrySet);
}
HashMap和HashTable之间的一些异同?
1.HashTable是线程安全的,HashMap是非线程安全的
2.Hashtable不允许null值(key和value都不可以),hashMap允许null值
3.二者的遍历方式大同小异,hashTable仅仅比HashMap多了一个elements方法