美文网首页
HashMap key是对象为什么取不到value值

HashMap key是对象为什么取不到value值

作者: SuperEngCoding | 来源:发表于2019-04-26 12:45 被阅读0次

    HashMap key是对象为什么取不到value值

    场景重现

    Product类代码如下

    public class Product {
        private Long productId;
        private String productName;
    
        public Long getProductId() {
            return productId;
        }
    
        public void setProductId(Long productId) {
            this.productId = productId;
        }
    
        public String getProductName() {
            return productName;
        }
    
        public void setProductName(String productName) {
            this.productName = productName;
        }
    
    }
    

    测试类代码如下:

    public static void main(String[] args) {
            //set
            Product product = new Product();
            product.setProductId(1111L);
            product.setProductName("测试");
            Map<Product,Integer> map = new HashMap<Product, Integer>();
            map.put(product,1);
    
    
            //get
            Product product2 = new Product();
            product2.setProductId(1111L);
            product2.setProductName("测试");
            System.out.println(map.get(product2));
    
        }
    

    输出结果为:
    null

    结果办法

    重写Product类的equals方法和hashCode,因为HashMap取值就是通过Hashcode比较取值
    代码如下:

    package com.karl.demo;
    
    import java.util.Objects;
    
    public class Product {
        private Long productId;
        private String productName;
    
        public Long getProductId() {
            return productId;
        }
    
        public void setProductId(Long productId) {
            this.productId = productId;
        }
    
        public String getProductName() {
            return productName;
        }
    
        public void setProductName(String productName) {
            this.productName = productName;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (!(o instanceof Product)) {
                return false;
            }
            Product product = (Product) o;
            return Objects.equals(getProductId(), product.getProductId()) &&
                    Objects.equals(getProductName(), product.getProductName());
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(getProductId(), getProductName());
        }
    }
    
    
    • 如果不被重写(原生)的hashCode和equals是什么样的?
      不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。因为两个对象都是new出来的,内存地址是不一样的。
      不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。因为==的判断也是根据内存地址进行判断
    • 重写后的可以从上述代码看的出来,Hashcode 重写后只要是对象的值相同Hashcode就会相同,equals方法也是比较对象的值。

    验证

    输出结果为1

    补充

    • 现在很多人都会用@Data注解 就不会出现这个问题了 因为Data注解默认重写了equals方法和hashCode方法。注解很方便但是也是有缺点的,因为很容易遗忘底层的原理。
     * @see Getter
     * @see Setter
     * @see RequiredArgsConstructor
     * @see ToString
     * @see EqualsAndHashCode
     * @see lombok.Value
     */
    

    相关文章

      网友评论

          本文标题:HashMap key是对象为什么取不到value值

          本文链接:https://www.haomeiwen.com/subject/nmyfnqtx.html