[面试准备]:HashMap,HashSet

  • 1.HashSet中的元素是如何保证不重复的?
    HashSet底部是封装的一个hashmap,具体的步骤是 先通过hashcode比较,如果不相同则认为不是同一个数据,如果Hashcode值 相同,再通过equals()方法进行比较,
    /**
    equlas()方法,string 类型的 比较
    instanceof :可以用来判断继承中的子类的实例是否为父类的实现,左边是子类,右边是父类
    如果是自己覆写equals()方法,应该使用getClass()代替 instanceof
    **/
    public boolean equals(Object anObject) {
    if (this == anObject) {
    return true;
    }
    if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = value.length;
    if (n == anotherString.value.length) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = 0;
    //下面是进行内容比较
    while (n-- != 0) {
    if (v1[i] != v2[i])
    return false;
    i++;
    }
    return true;
    }
    }
    return false;
    }
  • 2.HashMap的get()方法的工作原理?
    HashMap的<K,V>在未进行显示声明时,V默认是Object;所以未声明时,需要强转.获取值的时候,通过拿到key的hash值,确定bucket位置之后,之后会调用keys.equals()方法去找到链表中正确的节点,,最终找到要找的值对象;
  • 3.Hashmap的工作原理?
    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。
    当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。
    HashMap在每个链表节点中储存键值对对象。
  • 4.当两个不同的键对象的hashcode相同时会发生什么?
    答:它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

猜你喜欢

转载自blog.csdn.net/Lining_s/article/details/85239373