RE:JAVA学习-HashMap用法

来源:互联网 发布:金思维网络 编辑:程序博客网 时间:2024/06/05 18:59

1.Map 查询表
1.1 用于存储”Key-Value” 映射对。Key可以看作Value的索引(其关系类似高中学过的函数x-y的映射)
1.2 常见实现类:HashMap TreeMap
1.3 Map中常用方法:
V put(K key,V value) 向Map中存放元素(如果集合中已存在相同的Key,则替换该Key所对应的Value,返回原Value值,没有则返回null)
V get(Object key) 获取元素
boolean containsKey(Object key) 判断该key是否存在

public class Map_put_get_remove {    public static void main(String[] args) {        Map<String,Integer> map=new HashMap<String,Integer>();        /*         * V put(K k,V v)         * 将给定的key-value对存入Map         * 由于Map要求key不允许重复,所以若使用         * Map已有的key存入value时就是替换value         * 操作,返回值为被替换的value.若给定的         * key不存在,则返回值为null         */        map.put("语文",99);        map.put("数学",88);        map.put("英语",77);        map.put("物理",55);        map.put("化学",66);        System.out.println(map);//{物理=55, 语文=99, 英语=77, 数学=88, 化学=66}        //替换"语文"原来对应的value        Integer d=map.put("语文",30);        System.out.println(map);//{物理=55, 语文=30, 英语=77, 数学=88, 化学=66}        System.out.println("old:"+d);//old:99        /*         *V get(K k)         *获取给定的key所对应的value         *若给定的key不存在,则返回null          */        d=map.get("数学");        System.out.println("数学:"+d);//数学:88        /*         * V remove(K k)         * 根据给定的key将对应的这组键值对删除         * 返回值为对应的value         * 若给定的key不存在则返回值为null         */        d=map.remove("语文");        System.out.println(map);//{物理=55, 英语=77, 数学=88, 化学=66}        System.out.println("remove_value:"+d);//remove_value:30    }}

2.HashMap
2.1 Hash表原理:当我们向HashMap中存入一组键值对时,HashMap首先获取key这个对象的hashcode()方法的返回值,然后使用该值进行一个散列算法,得出一个数字,这个数字就是这组键值对要存入散列数组中的下标位置。
那么得知了下标位置后,HashMap还会查看散列数组当前位置是否包含该元素。(这里要注意的是,散列数组中每个元素并非是直接存储键值对的,而是存入了一个链表,这个链表中的每个节点才是真实保存这组键值对的。)检查是否包含该元素时根据当前要存入的key在当前散列数组对应位置中的链表里是否已经包含这个key,若不包含则将这组键值对存入链表,否则就替换value。
2.2重写equals方法与hashcode方法原则:
(原因:影响散列表(HashMap)查询性能的一个主要因素就是作为Key元素equals方法与hashcode方法的结果,妥善重写这两个方法可以避免在HashMap中出现链表导致HashMap检索性能降低)
成对重写:当我们需要重写一个类的equals方法时就应当连同重写hashcode
一致性:当两个对象equals比较为true时,hashcode方法返回的数字应当相等,反之亦然.
稳定性:当参与equals比较的属性没有发生变化的前提下,多次调用hashcode方法返回的数字必须相同
2.3 装载因子及HashMap优化
Capacity:容量,
Initial capacity:初始容量(默认构建容量是16)
Size : 大小
Load factor:加载因子, 默认值0.75(散列表增加数据时如果 size/capacity 的值大于Load factor则发生扩容并且重新散列(rehash))

3.Map的遍历方法

3.1 Set<K> keySet() 遍历所有的Key将当前Map中所有的Key存入一个Set集合后返回3.2 Set<Entry<K,V>> entrySet() 遍历所有的键值对将当前Map中每一组key-value对封装为一个Entry对象并存入一个Set集合后返回3.3 遍历所有的Value(不常用)Collection<V> values()将当前Map中所有的value存入一个集合后返回
public class Map_iterate {    public static void main(String[] args) {        Map<String,Integer> map=new HashMap<String,Integer>();        map.put("语文", 99);        map.put("数学", 44);        map.put("英语", 77);        map.put("物理", 33);        map.put("化学", 55);        /*         * 遍历所有的key         * Set<k> keySet()         * 将当前Map中所有的key以一个Set集合形式返回         * 所以遍历这个Set集合就等同于遍历了所有的key         */        Set<String> keySet=map.keySet();        for(String key:keySet){            System.out.println("key:"+key);        }        /*         * 获取每一组键值对         * 在Map内部,每一组键值对是用Map内部类Entry         * 的实例表示的(Entry是接口,不同的Map实现类         * 都实现了Entry用于表示一组键值对)         * Set<Entry> entrySet<>         * 将当前Map中所有的键值对(若干Entry实例)存入         * 一个Set集合并返回         */        Set<Entry<String,Integer>> entrySet=map.entrySet();        for(Entry<String,Integer> e:entrySet){            String key=e.getKey();            Integer value=e.getValue();            System.out.println(key+":"+value);        }        /*         * 遍历所有value         * Collection<V> values()         * 将当前Map中所有的value存入一个集合后返回         */        Collection<Integer> values=map.values();        for(Integer value:values){            System.out.println("value:"+value);        }    }}

4.LinkedHashMap
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序