HashMap重写(4,上海大厂Android面试经历

  • @author zhangyan

  • @date 2019/1/29 17:33

*/

public class YanHashMap02<K,V> {

/**

 * 位桶数组。bucket  array

 */

Node3[] table;



/**

 * 存放的键值对的个数

 */

int size;



/**

 * 定义构造函数

 */

public YanHashMap02() {

    //长度一般定义成2的整数幂

    table = new Node3[16];

}



/**

 * put方法

 *

 * @param key

 * @param value

 */

public void put(K key, V value) {



    //定义了新的节点对象

    Node3 newNode = new Node3();

    newNode.hash = myHash(key.hashCode(), table.length);

    int hash = newNode.hash;

    newNode.key = key;

    newNode.value = value;

    newNode.next = null;



    /**

     * temp是对应hash值的节点

     */

    Node3 temp = table[hash];



    //正在遍历的最后一个元素

    Node3 iterLast = null;

    boolean keyRepeat = false;



    if (temp == null) {

        //此处数组元素为空,则直接将新节点放进去

        table[hash] = newNode;

        size++;

    } else {

        //此处数组元素不为空,则遍历对应链表,对链表进行操作

        while (temp != null) {



            //判断key如果重复,则覆盖

            if (temp.key.equals(key)) {

                keyRepeat = true;

                //只是覆盖value即可,其他的值(hash,key,next)保持不变

                temp.value = value;

                //覆盖之后就不用遍历链表后面的节点

                break;



            } else {

                //key不重复,则遍历下一个。

                iterLast = temp;

                temp = temp.next;



            }

        }



        //没有发生key重复的情况,则添加到链表最后一个节点

        if(!keyRepeat){

            iterLast.next = newNode;

            size++;

        }

    }

}



/**

 * get()方法

 * @param key

 * @return

 */

public V get(K key) {



    //拿到对应的hash值

    int hash = myHash(key.hashCode(), table.length);

    V value = null;



    if (table[hash] != null) {

        Node3 temp = table[hash];



        while (temp != null) {



            //如果相等,则说明找到了键值对,返回相应的value

            if (temp.key.equals(key)) {

                value = (V)temp.value;

                break;

            } else {

                temp = temp.next;

            }

        }



    }



    return value;

}



/**

文末

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-1JpjN2IL-1630847273766)]

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-RI1VZttT-1630847273768)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值