HashMap集合

HashMap集合特点(用法与特点类似于HashSet集合):

1.无序,不允许重复(无序指元素顺序与添加顺序不一致);
2.底层数据结构是哈希表
3.HashMap内部对”键”用Set进行散列存放。所以根据”键”去取”值”的效率很高。
4.键是唯一的,值是可以重复的
5.能出现最多一个null键,任意多个null值

剔除重复的原理—–>同HashSet

先调用hashCode,若相同,再调用equals
可根据自己的需求重写hashCode和equals
注意:这里只是比较键值是否重复,不需要比较value值

练习:

定义一个Person类,属性有name,age。
若名字和年龄相同,则为同一个对象。
创建一个HashSet集合,键为Person类,值为个人评价
并遍历HashSet集合。

Person类

package HashMap;
//定义一个Person类,属性有name,age。
//若名字和年龄相同,则为同一个对象。
//创建一个HashSet集合,键为Person类,值为个人评价
public class Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Person() {
        super();
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
}

测试类:

package HashMap;

import java.util.HashMap;
import java.util.Set;

public class Test {

    public static void main(String[] args) {
        HashMap<Person, String> map=new HashMap<>();
        //若名字和年龄相同,则为同一个对象
        map.put(new Person("乔布斯", 90), "苹果之父,非常厉害的人!");
        map.put(new Person("乔布斯", 90), "我以前没用听说过他,孤陋寡闻了!!");
        map.put(new Person("乔布斯1", 90), "我以前没用听说过他,孤陋寡闻了!!");
        map.put(new Person("琼斯", 50), "我以前没用听说过他,孤陋寡闻了!!");

        Set<Person> set=map.keySet();
        for (Person person : set) {
            System.out.println(person+","+map.get(person));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HashMap集合put流程包括以下步骤: 1. 首先,根据key的hashcode值计算出在数组中的位置,即索引值。 2. 如果该位置上没有元素,则直接将该元素插入到该位置上。 3. 如果该位置上已经有元素,则遍历该位置上的链表,查找是否已经存在相同的key值。 4. 如果存在相同的key值,则用新的value值替换旧的value值。 5. 如果不存在相同的key值,则将新的键值对插入到链表的末尾。 6. 如果链表长度大于等于阈值,则将链表转换为红黑树。 7. 如果数组长度大于等于阈值,则进行扩容操作。 以上就是HashMap集合put流程的详细步骤。 ### 回答2: HashMap集合的put流程如下: 1. 首先根据键的哈希值计算出键的存储位置(桶)。 2. 如果该位置还没有元素,则直接将键值对添加到该位置。 3. 如果该位置已经有元素存在,则通过比较键的哈希值和equals()方法来判断是否为同一个键。 4. 如果是同一个键,则更新该键对应的值。 5. 如果不是同一个键,则发生碰撞(collision)情况,在该桶上形成一个链表或红黑树。 6. 首先会比较键的哈希值,如果哈希值相等,则通过equals()方法来比较键是否相等。 7. 如果相等,则更新该键对应的值。 8. 如果不相等,则将键值对添加到链表(或树)的末尾。 9. 如果链表(或树)的长度超过了某个阈值,链表(或树)将转换为红黑树,以提高查询效率。 10. 如果发生碰撞的次数过多,会影响HashMap的性能,此时可以调整容量(数组的大小)来减少碰撞。 总的来说,HashMap集合的put流程就是根据键的哈希值找到存储位置,然后通过比较哈希值和equals()方法来判断键是否存在,如果存在则更新值,如果不存在则添加键值对。如果发生碰撞,则通过链表(或红黑树)解决碰撞问题。 ### 回答3: HashMap集合put流程主要包括以下几个步骤: 1. 首先,根据传入的键(key)计算出hash值。HashMap使用hashCode()方法计算hash值。 2. 接下来,将计算出的hash值通过一个位运算(hash值与HashMap内部数组的长度-1进行与操作),得到一个数组下标(index)。这个index就是要存放键值对的数组位置。 3. 如果该位置上还没有存放其他键值对,则直接将键值对存放在这个位置上。这个过程称为“直接插入”。 4. 如果该位置上已经有一个或多个键值对,则遍历该位置上的所有键值对,判断是否存在与要存放的键值对的键相等的情况。 5. 如果存在相等的键,则更新对应键的值为新的值,并返回旧值。 6. 如果不存在相等的键,则将新的键值对追加到该位置上。 总结起来,HashMap的put流程主要是通过计算hash值和数组下标来确定要存放键值对的位置,如果有相同的键,则更新对应键的值,如果没有相同的键,则将键值对追加到该位置上。这样就完成了对HashMap集合的put操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值