zoukankan      html  css  js  c++  java
  • 用HashSet存储不重复的对象

    直接进入主题,先来创建一个类:Bean

    public class Bean {
        private int id;
        private String name;
        public Bean() {
            super();
        }
        public Bean(int id, String name) {
            super();
            this.id = id;
            this.name = name;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        @Override
        public boolean equals(Object obj) {
            if(!(obj instanceof Bean)) {
                return false;
            }
            Bean b = (Bean)obj;
            if(this.id == b.id) {
                return true;
            }
            return false;
        }
        
        @Override
        public int hashCode() {
            return id;
        }
    }

    可以看出类Bean与普通的JavaBean相比,多了2个方法,即重写了Object类的equals和hashCode方法,这里让Bean的实例,只要是id相同就认为是相同的实例,当然也可以是其他,这就要看具体需求,但必须保证当2个对象的hashCode方法的返回值相同时,它们的equals方法也的返回值要是true,这样才能保证不重复。下面来测试一下:

    public class HashSetTest {
    
        @Test
        public void test01() {
            Set<Bean> set = new HashSet<>();
            Bean b1 = new Bean(1,"123");
            Bean b2 = new Bean(2,"456");
            set.add(b1);
            set.add(b2);
            Bean b3 = new Bean(1,"789");
            Bean b4 = new Bean(2,"012");
            set.add(b3);
            set.add(b4);
            System.out.println(set.size());
        }
    }

    运行结果是:2

    并且变量set中存放的是对象吧b1和b2,因为在添加对象b3和b4时,首先会调用hashCode方法,若返回的数,集和中已经存在hashCode相同的对象,那么对调用equals方法,若equals方法返回true,则放弃添加,返回false,反之。

    注意必须重写Object类的方法,即形参是Object类型,而不能添加类似下面的equals方法:

    public boolean equals(Bean b) {
        if(this.id == b.id) {
            return true;
        }
        return false;
    }

    若是这种写法,打断点是进不去的,也就是说当hashCode相同时,不会调用该方法,而是调用Object的equals方法。

    就这些了。。。

  • 相关阅读:
    Java如何滚动几个小时和几个月?
    同步一个 fork
    Push failed: Failed with error: fatal: Could not read from remote repository
    Java NIO AsynchronousFileChannel
    Java NIO Files
    Java NIO Path
    Java NIO vs. IO
    Java NIO Pipe
    Java NIO DatagramChannel
    Java NIO: Non-blocking Server
  • 原文地址:https://www.cnblogs.com/sprinkle/p/6480906.html
Copyright © 2011-2022 走看看