Map

来源:互联网 发布:学术数据库有哪些 编辑:程序博客网 时间:2024/05/17 04:11

之前说的Collection集合是单列集合,顾名思义就是一次存储一个对象;
这次说的Map集合是双列集合,顾名思义就是一次存储两个对象,也就是一对对象;
这种情况的数据,属于一一对应的映射关系。这种关系的集合在java叫Map。
Map:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
代码演示:

package com.thz_04;import java.util.Collection;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import java.util.Set;/* * A:删除功能 *      void clear():移除集合中的所有键值对元素 *      V remove(Object key):根据键移除键值对元素,并返回值 * B:判断功能 *      boolean containsKey(Object key):判断集合中是否包含指定的键 *      boolean containsValue(Object value):判断集合中是否包含指定的值 *      boolean isEmpty():判断集合是否为空 * C:获取功能 *      Set<Map.Entry<K,V>> entrySet():获取键值对对象的集合,遍历键值对对象,            利用getKey(),getValue()取出键和值(理解即可) *                  V get(Object key):根据键获取值 *      Set<K> keySet():获取所有的键 *      Collection<V> values():获取所有的值 * D:添加功能 *      V put(K key,V value):集合添加键值对 * E:长度功能 *          int size():键值对对数。 */public class MapDemo {    public static void main(String[] args) {        //创建Map,由于Map是个接口,借助HashMap        Map<Integer,String > map = new HashMap<Integer,String>();        //V put(K key,V value):集合添加键值对        /*返回:以前与 key 关联的值,如果没有针对 key 的映射关系,则返回 null。         * (如果该实现支持 null 值,则返回 null 也可能表示此映射以前将 null 与 key 关联)。          */        map.put(1, "java");        map.put(2, "hello");        map.put(3, "world");        map.put(4, "C++");        map.put(5, "C++");        String put = map.put(3,"good");//覆盖了map.put(3, "world");        System.out.println(put);        //int size():键值对对数。        int size = map.size();        System.out.println("长度为:"+size);        //Collection<V> values():获取所有的值        Collection<String> values = map.values();        for (String string : values) {            System.out.print(string+" ");        }        System.out.println();        //Set<K> keySet():获取所有的键        for(Integer v:map.keySet()){            System.out.print(v+" ");        }        System.out.println();        //Set<Map.Entry<K,V>> entrySet():获取键值对对象的集合,遍历键值对对象,        Set<Entry<Integer,String>> entrySet = map.entrySet();        for(Entry<Integer,String> entry:entrySet){            System.out.println(entry.getKey()+" "+entry.getValue());        }        //boolean containsKey(Object key):判断集合中是否包含指定的键        boolean containsKey = map.containsKey(1);        //boolean containsValue(Object value):判断集合中是否包含指定的值        boolean containsValue = map.containsValue("C++");        //boolean isEmpty():判断集合是否为空        boolean empty = map.isEmpty();        System.out.println(containsKey+" "+containsValue+" "+empty);        //V remove(Object key):根据键移除键值对元素,并返回值        String remove = map.remove(2);        System.out.println(remove);        //void clear():移除集合中的所有键值对元素        map.clear();    }}

遍历Map 有两种方法:
一是找出Map集合中的所有键,返回一个包含键的集合,遍历该集合,获取到键,再根据键去取出所有的值。
二是找出键值对,返回一个集合,然后遍历该集合即可

HashMap
元素顺序:元素顺序不可预测
底层算法:哈希算法
对键没有要求(仅仅相对于TreeMap来说)

在对HashMap进行存储对象时:我们发现存入(Student,String),键是同一个对象的时候要把之前存入的元素挤出去,想要实现这样的效果的话,需要重写javabean里面的hashCode()和equals()方法

代码演示:

package com.thz_05;import java.util.HashMap;import java.util.Map.Entry;import java.util.Set;public class HashMapDemo {    public static void main(String[] args) {        // 2.存入(String,Student)键:String(国籍)  值:Student        HashMap<String, Student> hm = new HashMap<String, Student>();        //创建学生对象        Student s1 = new Student("yellowstar", 18);        Student s2 = new Student("pdd", 18);        Student s3 = new Student("faker", 18);        //将对象存入集合        hm.put("美国", s1);        hm.put("中国", s2);        hm.put("韩国", s3);        //同过键找值        Set<String> keys = hm.keySet();        for (String key : keys) {            System.out.println(key+"  "+hm.get(key));        }        System.out.println("--------------------");        //通过键值对        Set<Entry<String,Student>> entrySet = hm.entrySet();        for (Entry<String, Student> entry : entrySet) {            System.out.println(entry.getKey()+" "+entry.getValue());        }    }}

Treemap
元素顺序:元素顺序与键的排序规则有关
底层算法:Tree算法
代码演示:

package com.buchong_08;import java.util.Map.Entry;import java.util.TreeMap;//存入(Integer,String),主要验证排序方式public class TreeMapDemo {    public static void main(String[] args) {        //创建Map集合        TreeMap<Integer, String> tm = new TreeMap<>();        tm.put(1, "teg");        tm.put(4, "ccz");        tm.put(3, "lr");        tm.put(2, "tt");        //遍历        for(Integer i:tm.keySet()){            System.out.println(i+" "+tm.get(i));        }        System.out.println("----------------");        for(Entry<Integer, String> entry:tm.entrySet()){            System.out.println(entry.getKey()+" "+entry.getValue());        }    }}

总结:HashMap与TreeMap的相同点与不同点
相同点:主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
不同点:
1.HashMap里面存入的键值对在取出的时候是随机的,也是我们最常用的一个Map.根据键可以直接获取它的值,
具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

0 0