遍历HashMap集合几种方式

public class bianli {
    //遍历HashMap集合几种方式
    public static void main(String[] args) {
        HashMap<Integer,String> map=new HashMap<>();
        map.put(1, "马太");
        map.put(2, "马可");
        map.put(3, "路加");
        map.put(4, "约翰");
        //bianlimethod1(map);
        //bianlimethod2(map);
        //bianlimethod3(map);
        bianlimethod4(map);
    }

    public static void bianlimethod1(HashMap<Integer,String> map){
        for (Integer key : map.keySet()) {
            System.out.println(key);
        }
        for (String value : map.values()) {
            System.out.println(value);
        }
    }

    public static void bianlimethod2(HashMap<Integer,String> map){
        Iterator<Map.Entry<Integer,String>> iterator=map.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<Integer,String> mapEntry=iterator.next();
            System.out.println(mapEntry.getKey()+"==="+mapEntry.getValue());
        }
    }

    public static void bianlimethod3(HashMap<Integer,String> map){
        Set<Integer> keyset=map.keySet();
        for (Integer i : keyset) {
            System.out.println(i+"==="+map.get(i));
        }
    }

    public static void bianlimethod4(HashMap<Integer,String> map){
        map.forEach((key,value)->{
            System.out.println(key+"---"+value);
        });
    }
}

附:
1.面试题:HashMap中hash函数是怎么实现的?还有哪些hash函数的实现方式?
对于key的hashCode做hash操作,无符号右移16位然后做异或运算。
还有平方取中法,伪随机数法和取余数法。这三种效率都比较低。而无符号右移16位异或运算效率是最高的。至于底层是如何计算的我们下面看源码时给大家讲解。

2.面试题:当两个对象的hashCode相等时会怎么样?
会产生哈希碰撞,若key值内容相同则替换旧的value.不然连接到链表后面,链表长度超过阈值8就转换为红黑树存储。

3.面试题:何时发生哈希碰撞和什么是哈希碰撞,如何解决哈希碰撞?
只要两个元素的key计算的哈希码值相同就会发生哈希碰撞。jdk8前使用链表解决哈希碰撞。jdk8之后使用链表+红黑树解决哈希碰撞。

4.面试题:如果两个键的hashcode相同,如何存储键值对?
hashcode相同,通过equals比较内容是否相同。
相同:则新的value覆盖之前的value
不相同:则将新的键值对添加到哈希表中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章