`
确实比较男
  • 浏览: 114324 次
  • 性别: 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,重新创建一个新的表,将原表的映射到新表中,这个过程很费时。

 

 

分享到:
评论

相关推荐

    hashmap面试题_hashmap_

    《HashMap面试题详解》 HashMap作为Java集合框架中的重要成员,是面试中常见的知识点,尤其在数据结构与算法、并发编程以及JVM内存管理等领域,HashMap的深入理解至关重要。本篇将围绕HashMap的相关面试题,从基础...

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

    以下是对给定的Java HashMap面试题的详细解析: 1. **HashMap的内部实现原理**: HashMap基于哈希表,使用键值对的存储方式。它维护了一个桶数组,通过键的哈希值决定其存储位置。在Java 8以前,当哈希冲突发生时...

    05.HashMap相关面试题

    HashMap 相关面试题 HashMap 是 Java 中最常用的集合框架之一,它提供了基于键值对的存储和快速查找机制。以下是 HashMap 相关的面试题和知识点: 1. HashMap 和 HashTable 的区别 HashMap 和 HashTable都是基于...

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

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

    JAVA--HashMap热门面试题

    JAVA--HashMap热门面试题 HashMap 是 Java 中一个常用的集合框架,特别是在面试中,它是最常被问到的问题之一。在这里,我们将讨论一些热门的 HashMap 面试题,以帮助您更好地理解 HashMap 的工作原理和应用。 为...

    JAVA面试题JAVA面试题JAVA面试题

    Java面试题是每个Java开发者在求职过程中必须面对的挑战,涵盖范围广泛,涉及语言基础、数据结构、算法、多线程、JVM优化、框架应用等多个方面。以下是一些可能出现的Java面试知识点详解: 1. **Java语言基础** - ...

    Java面试题和练习题

    本文将基于标题“Java面试题和练习题”以及描述中提到的内容,深入探讨Java相关的面试题和练习题,旨在帮助求职者或希望提升技能的开发者巩固知识,准备面试。 一、Java基础 1. Java的数据类型:了解Java的八种...

    Java面试题Java面试题Java面试题Java面试题

    Java面试题常常是考察开发者对Java语言核心概念、并发编程、集合框架以及面向对象设计等基础知识的掌握程度。以下是对一些常见Java面试题的详细解释: 1. **作用域的区别**: - `public`:类、接口、方法或变量...

    Java面试题笔试题大全

    Java作为全球最流行的...通过这份“Java面试题笔试题大全”资源,你可以系统地复习和巩固Java相关知识,提高自己在面试中的竞争力。同时,理论知识结合实践应用,不断解决实际问题,才能在Java开发者道路上走得更远。

    2017java面试题

    "2017java面试题"这个压缩包文件提供了丰富的资源,帮助Java开发者准备面试,深化对Java开发的理解。 文档"Java面试宝典2017.doc"可能包含了以下核心Java知识点: 1. **基础语法**:这包括变量、数据类型、运算符...

    java中高级面试题十大总结

    Java作为一门广泛使用的编程语言,其中高级面试题往往涵盖了多方面的知识点,旨在考察候选人的技术深度和广度。以下是对这些面试题的详细解析: 1. **内存管理与垃圾回收** - Java的内存分为堆内存(Heap)和栈...

    java面试八股文各类面试题

    在准备Java面试时,了解和掌握一系列核心知识点是至关重要的。以下是一些基于标题和描述中的关键...阅读提供的PDF资料,如"Java并发编程面试题八股文.pdf"和"Spring面试题八股文.pdf",将有助于巩固和扩展这些知识。

    java高级工程师-面试题及答案

    根据给定文件的信息,我们可以提炼出以下几个主要的知识点: ### 一、选择题解析 #### 1....以上知识点涵盖了给定文件中的所有题目及其解答,希望能够帮助读者更好地理解Java的相关概念和技术细节。

    java经典面试题

    ### Java经典面试题知识点 #### Java数据结构容器 - **核心知识点**:Java集合框架,包括List、Set、Map等接口及其实现类。List接口代表有序的集合,例如ArrayList和LinkedList;Set接口代表不允许重复元素的集合,...

    常见的java,android面试题整理

    Java和Android面试题涵盖了许多核心概念,以下是这些知识点的详细说明: 1. **面向对象** (Object-Oriented Analysis and Design Principle, OOADP): 面向对象编程是Java和Android开发的基础,它涉及类、对象、继承...

    java面试题,java框架面试题

    在本文中,我们将对 Java 面试题进行总结和分析,帮助读者快速掌握 Java 面试题的知识点。 一、 Java 基础知识 1. 面向对象的三个基本特征:封装、继承、多态 封装是把客观事物封装成抽象的类,并且类可以把自己的...

    java面试题总结资料

    这份"java面试题总结资料"涵盖了多个Java核心领域的关键知识点,包括但不限于: 1. **基础语法**:理解基本的数据类型(如整型、浮点型、字符型和布尔型),变量的声明与使用,以及运算符的优先级。同时,要熟悉...

    就业面试题--人事面试题、java、net等面试题集锦

    本资源集合了人事面试题、Java和.NET相关的面试题目,旨在帮助求职者全面了解并掌握可能面临的各种问题。 1. **人事面试题**: 人事面试通常关注求职者的性格、团队协作能力、职业规划等方面。例如,可能会问到“你...

    Java面试题2022

    以上是Java面试中常见的知识点,掌握并能深入解释这些内容,将大大增加你成功通过面试的可能性。同时,面试不仅仅是对技术的考察,还包括问题解决能力、团队合作精神以及项目经验等软技能,全面展现自己才能赢得理想...

Global site tag (gtag.js) - Google Analytics