hashmap 自定义类如何get

hashmap中的自定义类

使用hashmap,其中的key是自定义类。结果发现key相同的情况下,hashmap当成不同的key处理。
因为hashmap查找key时,先比较hashcode,然后用equal比较内容,只要不相同,就当成不同的key。
如:{(5,) =1, (2,) =1, (1,2,) =1, (1,3,) =1, (3,) =1, (2,) =1, (3,4,) =1, (5,) =1, (1,) =1, (3,) =1, (1,2,) =1, (4,) =1, (3,4,) =1}
所以要重写equal和hashcode。
重写equal只要比较内容是否相同就行了。
如果没有重写hashcode,依然没有效果。因为java用对象的地址计算hashcode,只有hashcode相同(->地址相同?)才能调用equal。
重写hashcode最简单的处理方式是让所有对象返回相同值,这样hashmap就会调用equal方法,比较内容。
但是,写好hashcode,可以减少equal的调用次数。
只有在hashcode相同的情况下才会调用equal,而不同对象拥有相同hashcode的情况比较少见(或者没有?)。
写hashcode和equal,参考String的hashcode写法。可以学习jdk的源码。
最后结果:
{(1,) =1, (1,2,) =2, (2,) =2, (3,) =2, (4,) =1, (1,3,) =1, (5,) =2, (3,4,) =2}

package arm;

import java.util.ArrayList;
import java.util.Collections;

public class ItemSet {
    private ArrayList<String> itemSet;

    public ItemSet() {
        itemSet = new ArrayList<>();
    }

    public ItemSet(String[] is) {
        itemSet = new ArrayList<>();
        for (String i : is) {
            itemSet.add(i);
        }
        Collections.sort(itemSet);
    }

    public void add(String i) {
        itemSet.add(i);
        Collections.sort(itemSet);
    }

    public void sort() {
        Collections.sort(itemSet);
    }

    public int size() {
        return itemSet.size();
    }

    public ArrayList<String> toArrayList() {
        return itemSet;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof ItemSet) {
            ItemSet aobj = (ItemSet) obj;
            int n = aobj.size();
            if (n == this.size()) {
                ArrayList<String> arr = aobj.toArrayList();
                for (int i = 0; i < n; ++i) {
                    if (!itemSet.get(i).equals(arr.get(i))) {
                        return false;
                    }
                }
                return true;
            }
        }
        return false;
    }

    @Override
    public int hashCode() {
        int ret = 0;
        for (String item : itemSet) {
            ret += item.hashCode() * 31;
        }
        return ret;
    }

    @Override
    public String toString() {
        String ret = "(";
        for (String item : itemSet) {
            ret += item + ",";
        }
        ret += ")";
        return ret;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值