`
确实比较男
  • 浏览: 113157 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java中hashMap有关的面试题

阅读更多

面试题: Java中ArrayList和LinkedList的主要区别是什么?

这个问题首先要知道数组和链表的特点

 

数组的特点:寻址容易,插入和删除困难。

链表的特点是:寻址困难,插入和删除容易。

ArrayList的底层实现就是通过动态数组来实现的,LinkedLIst底层实现就是通过链表来实现的,所以直接答出数组和链表的特点就ok

面试题:hashMap是怎样实现key-value这样键值对的保存?

HashMap中有一个内部类Entry,

 

 static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        int hash;
        //.....
}

主要有4个属性,key ,hash,value,指向下一个节点的引用next ,看到这个实体类就明白了,在HashMap中存放的key-value实质是通过实体类Entry来保存的

 

面试题:hashMap的实现原理?

HashMap使用到的数据类型主要就是数组和链表,首先看原理图

在hashMap的原理图中,左边是通过数组来存放链表的第一个节点,看懂这个图这个问题就ok

面试题:hashMap的put过程?

面我们提到过Entry类里面有一个next属性,作用是指向下一个Entry。比如说: 第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?HashMap会这样做:B.next = A,Entry[0] = B,如果又进来C,index也等于0,那么C.next = B,Entry[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起。也就是说数组中存储的是最后插入的元素。

 

     public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key);
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {//循环判断插入的key是否已经存在,若存在就更新key对应的value
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);//key不存在,那么插入新的key-value
        return null;
    }
    void addEntry(int hash, K key, V value, int bucketIndex) {
        if ((size >= threshold) && (null != table[bucketIndex])) {
            resize(2 * table.length);
            hash = (null != key) ? hash(key) : 0;
            bucketIndex = indexFor(hash, table.length);
        }

        createEntry(hash, key, value, bucketIndex);
    }

    void createEntry(int hash, K key, V value, int bucketIndex) {//这个方法就验证了上面说的数组中存储的是最后插入的元素
        Entry<K,V> e = table[bucketIndex];
        table[bucketIndex] = new Entry<>(hash, key, value, e);
        size++;
    }

面试题:hashMap的get过程?
这个过程比较简单,直接看代码:

public V get(Object key) {
        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode());
        //先定位到数组元素,再遍历该元素处的链表
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
}

面试题:hashMap存取的时候是如何定位数组下标的?
找到indexFor这个方法,hashMap就是通过这个方法获取数组下标的:

 

 

static int indexFor(int h, int length) {
        return h & (length-1);
    }

通过key的hash值和数组长度求&,这意味着数组下标相同,并不表示hashCode相同。所以在Entry中存有一个hash值,在比较Entry的时候都是想比较hash值
面试题:hashMap中数组的初始化大小过程?

 

找到hashMap的构造方法:

 

 public HashMap(int initialCapacity, float loadFactor) {
        .....// Find a power of 2 >= initialCapacity
        int capacity = 1;
        while (capacity < initialCapacity)
            capacity <<= 1;  //相当于capacity = capacity * 2
        this.loadFactor = loadFactor;
        threshold = (int)(capacity * loadFactor);
        table = new Entry[capacity];
        init();
    }

从上面的代码我们可以看出数组的初始大小并不是构造函数中的initialCapacity!!而是2的n次方
面试题:hashMap什么时候开始rehash?
在hashMap中有一个加载因子loadFactor,默认值是0.75,当数组的实际存入值的大小 > 数组的长度×loadFactor 时候就会rehash,重新创建一个新的表,将原表的映射到新表中,这个过程很费时。

 

 

分享到:
评论

相关推荐

    Java HashMap高难度面试题集锦解析Java HashMap面试题及答案解析-高难度

    提供了20道高难度的Java HashMap面试题及详细答案解析,涵盖了HashMap的内部实现原理、哈希冲突处理、扩容机制、线程安全性等方面的知识点,适合准备Java面试的开发者参考。

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....

    JAVA--HashMap热门面试题

    主要介绍了JAVA关于HashMap容易被提问的面试题,文中题目提问频率高,相信对你的面试有一定帮助,想要入职JAVA的朋友可以了解下

    HashMap常见面试题,简述以及对源码操作分析

    HashMap常见面试题,简述以及对源码操作分析

    java面试大全视频版

    Java面试题11.HashMap和HashTable的区别 Java面试题12.实现一个拷贝文件的工具类要使用字节流还是字符串 Java面试题13.线程的的实现方式?怎么启动线程?怎么区分线程? Java面试题14.线程并发库和线程池的作用 Java...

    java中级面试题(自己汇总)

    本文总结了Java中级面试题,涵盖了集合、HashMap、HashSet、HashTable、ConcurrentHashMap、红黑树、Java 8对HashMap的优化、LinkedHashMap、TreeMap、IdentityHashMap等知识点。 集合 * List和Set都是继承自...

    HashMap面试题.pdf

    HashMap面试题

    java集合类面试题总结

    Java 集合类面试题总结 Java 集合类是 Java 语言中的一种重要组件,用于存储和操作数据。下面总结了 Java 集合类的一些常见问题和答案。 HashMap 和 Hashtable 的区别 HashMap 和 Hashtable 都是 Java 中的散列表...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题11.HashMap和HashTable的区别 Java面试题12.实现一个拷贝文件的工具类要使用字节流还是字符串 Java面试题13.线程的的实现方式?怎么启动线程?怎么区分线程? Java面试题14.线程并发库和线程池的作用 Java...

    java集合类原理面试题

    Java中有哪些容器(集合类)? 线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组的? ...

    大型国企内部Java面试题

    主要是Java后端的,16K左右的,涉及SE、WEB、三大框架SSM、springboot、MQ、数据库、springcloud、JVM、Redis、多线程、hashmap的底层、面试技巧等 SSM涉及浅层的底层,如IOC、AOP,专为没看过源码的人应付面试准备...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    JAVA面试题最全集

    9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet技术 1.描述JSP和Servlet的区别、共同点、各自应用的范围 2.在Web开发中...

    Java 集合方面的面试题

    以下是一些 Java 集合方面的面试题: Java 中集合框架的主要接口是什么? ArrayList 和 LinkedList 有什么区别? HashSet 和 TreeSet 有什么区别? HashMap 和 TreeMap 有什么区别? 什么是迭代器?如何使用它来遍历...

    125条常见的java面试笔试题大汇总

    Hashtable继承自Dictionary类,而HashMap是Java1.2引进的 Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap 不是,在多个线程访问Hashtable时,不需要自己为它的方法实 现同步,...

    Java面试题合集最新版2024.zip

    Java面试通常涵盖多个方面,包括Java基础知识、编程技能、问题解决能力,以及对Java生态系统和相关技术的理解。以下是一些建议的Java面试准备要点和资源描述: 一、Java基础知识 数据类型、变量与运算符:理解Java...

    Java面试题.docx

    面试题目: 1-10题: 1、java中==和equals和hashCode的区别 2、int与integer的区别 3、String、StringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,...

    JAVA程序员笔试面试题汇总及答案.pdf,这是一份不错的文件

    "Java程序员笔试面试题汇总及答案.pdf知识点总结" 以下是从给定的文件中生成的相关知识点: ...这些知识点涵盖了 Java 程序员笔试面试题汇总及答案.pdf 中的多个方面,包括访问控制符、集合操作、输入输出、流等。

    java 经典面试题

    1、面向对象的特征有哪些方面 2 2、String是最基本的数据类型吗? 2 3、int 和 Integer 有什么区别 3 4、String 和StringBuffer的区别 3 5、运行时异常与一般异常有何异同?...11、HashMap和Hashtable的区别。 4

    Java面试题11.HashMap和HashTable的区别.mp4

    Java面试题11.HashMap和HashTable的区别.mp4

Global site tag (gtag.js) - Google Analytics