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集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
- 添加
- put(K key, V value)
- putAll(Map<? extends K,? extends V> m)
- 删除
- clear()
- remove(Object key)
- 判断
- containsValue(Object value)
- containsKey(Object key)
- isEmpty()
- 获取
- 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集合的两种取出方式:
- 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 }
|
- 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 * * */
|