HashSet - 确保早期的对象持久性

Raz*_*zib 2 java collections hash set hashset

我必须使用HashSet可以插入大量重复值的地方.但是,当稍后插入复制时,我想保留插入到哈希中的早期数据.为了检查这一点,我编写了以下代码并插入了许多重复值,但它并不能满足我.请看下面的代码 -

import java.util.HashSet;
import java.util.Set;

public class SetTest {

    private static Set<Student> studentSet = new HashSet<Student>();
    private static Student s1, s2, s3, s4, s5, s6, s7, s8, s9;

    public static void main(String args[]){

        s1 = new Student(1, 1, "Syeful", "first boy");
        s2 = new Student(2, 2, "Razib", "no comments");
        s3 = new Student(3, 3, "Bulbul", "should remain");
        s4 = new Student(4, 3, "Bulbul", "should not remain");
        s5 = new Student(5, 4, "Bulbul", "should remain");
        s9 = new Student(9, 5, "Proshanto", "kaka - my favourite");

        studentSet.add(s1);
        studentSet.add(s2);
        studentSet.add(s3);
        studentSet.add(s4);
        studentSet.add(s5);
        studentSet.add(s9);

        for(Student each : studentSet){
            System.out.println("SrNo: " +each.getSrNo()+ " roleNo: " 
                    +each.getRoleNo()+ " name: " +each.getName()+ 
                    " coment: " +each.getComment());
        }
    }

}

class Student{

    private int srNo;
    private int roleNo;
    private String name;
    private String comment;

    public Student(int srNo, int role, String name, String comment) {
        super();
        this.srNo = srNo;
        this.roleNo = role;
        this.name = name;
        this.comment = comment;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + roleNo;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Student)) {
            return false;
        }
        Student other = (Student) obj;
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }
        if (roleNo != other.roleNo) {
            return false;
        }
        return true;
    }

    public int getSrNo() {
        return srNo;
    }

    public int getRoleNo() {
        return roleNo;
    }

    public String getName() {
        return name;
    }

    public String getComment() {
        return comment;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Set Size: 5
SrNo: 9 roleNo: 5 name: Proshanto coment: kaka - my favourite
SrNo: 2 roleNo: 2 name: Razib coment: no comments
SrNo: 1 roleNo: 1 name: Syeful coment: first boy
SrNo: 5 roleNo: 4 name: Bulbul coment: should remain
SrNo: 3 roleNo: 3 name: Bulbul coment: should remain
Run Code Online (Sandbox Code Playgroud)

在询问问题之前,我似乎要澄清一些观点,以便我能够正确解释并澄清我的理解.

  • 我想基于roleNo和维持'Student'的唯一性name.这就是hashCode()和equals()角色由这些属性组成的原因.因此,根据本实施方式S3和S4是重复对方的,甚至想到了comment,srNo他们的财产彼此不同.

  • HashSet 是无序的.

  • 当在集合中添加s4时,我们可以从输出中看到s4从集合中被丢弃并且s3保持不变.

  • 假设我想添加另一个学生的对象,s100 = new Student(3, 3, "Bulbul", "earlier instance suppressed");它是s3的副本.让我们在插入s100之前插入了很多s3的副本.

问题:
由于设置未排序且设置中不存在重复剂量,s3是否有可能被s100删除?我想坚持早期的对象丢弃后者.少量数据并未澄清事实.我认为在这种情况下Set可以使用排序.但这HashSet可以达到目的吗?

提前致谢.

Gab*_*gut 6

HashSet.add(E e)如果已经包含指定的元素,则保持集不变.因此,没有任何情况s3会被删除s100.