我有 2 个类(class)“学生”和“小组”。小组有一组学生。 hashCode()equals()两者都被覆盖。

然后我填充Set<Student>在组中。为什么两个相同的组(相同的 id、名称、Set<Student> 等)不同?当我删除Set<Student>时来自hashCode()equals()组的组变得相同。但这是两个相同的Set<Student> 。我想在 Set<Student> 的情况下它比较链接。我不明白这个,例如String name是一个对象并且 Set<Student>Object 。当我将两者都包含到hashCode()时和equals()它比较 String name 的实际值以及 Set<Student> 的链接.

Student.java:

public class Student {   
 
    private int id; 
    private String firstName; 
    private String lastName; 
 
    public Student(int id, String firstName, String lastName) {      
        this.id = id; 
        this.firstName = firstName; 
        this.lastName = lastName; 
    }    
 
    public int getId() { 
        return id; 
    } 
 
    public void setId(int id) { 
        this.id = id; 
    } 
 
    public String getFirstName() { 
        return firstName; 
    } 
 
    public String getLastName() { 
        return lastName; 
    } 
 
    @Override 
    public boolean equals(final Object other) { 
        if (this == other) { 
            return true; 
        } 
        if (other == null) { 
            return false; 
        } 
        if (!getClass().equals(other.getClass())) { 
            return false; 
        } 
        Student castOther = (Student) other; 
        return Objects.equals(id, castOther.id)  
                && Objects.equals(firstName, castOther.firstName) 
                && Objects.equals(lastName, castOther.lastName); 
    } 
 
    @Override 
    public int hashCode() { 
        return Objects.hash(id, firstName, lastName); 
    }        
} 

Group.java:

public class Group { 
 
    private int id; 
    private String name;     
    private Set<Student> students; 
 
    public Group(int id, String name) {      
        this.id = id; 
        this.name = name; 
    } 
 
    public int getId() { 
        return id; 
    } 
 
    public void setId(int id) { 
        this.id = id; 
    } 
 
    public Set<Student> getStudents() { 
        return students; 
    } 
 
    public void setStudents(Set<Student> students) { 
        this.students = students; 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    @Override 
    public boolean equals(final Object other) { 
        if (this == other) { 
            return true; 
        } 
        if (other == null) { 
            return false; 
        } 
        if (!getClass().equals(other.getClass())) { 
            return false; 
        } 
        Group castOther = (Group) other; 
        return Objects.equals(id, castOther.id)  
                && Objects.equals(name, castOther.name) 
                && Objects.equals(students, castOther.students); 
    } 
 
    @Override 
    public int hashCode() { 
        return Objects.hash(id, name, students); 
    } 
} 

GroupDaoImpl.java:

Set<Group> retrieveAll() throws DaoException {       
    String sql = "select * from groups;";                
    Set<Group> groupSet = new HashSet<>(); 
 
    try (Connection connection = daoFactory.getConnection(); 
            PreparedStatement preparedStatement =  
            connection.prepareStatement(sql)) {          
        preparedStatement.execute(); 
        ResultSet resultSet = preparedStatement.getResultSet();          
 
        while (resultSet.next()) { 
            int id = resultSet.getInt("group_id"); 
            String name = resultSet.getString("name");               
            Group group = new Group(id, name);               
            group.setStudents(studentDao.retrieveByGroupId(id));                 
            groupSet.add(group); 
        }                        
    } catch (Exception e) {          
        throw new DaoException(e);           
    }  
    return groupSet; 
} 

StudentDaoImpl.java:

Set<Student> retrieveByGroupId(int groupId) throws DaoException {        
    String sql = "select * from student where group_id = ?;";        
    Set<Student> studentSet = new HashSet<>(); 
 
    try (Connection connection = daoFactory.getConnection(); 
            PreparedStatement preparedStatement = connection.prepareStatement(sql)) { 
        preparedStatement.setInt(1, groupId); 
        preparedStatement.execute();             
        ResultSet resultSet = preparedStatement.getResultSet(); 
 
        while (resultSet.next()) { 
            int id = resultSet.getInt("student_id"); 
            String firstName = resultSet.getString("first_name"); 
            String lastName = resultSet.getString("last_name");              
            Student student = new Student(id, firstName, lastName);              
            studentSet.add(student); 
        }                        
    } catch (Exception e) { 
        throw new DaoException(e);           
    }  
    return studentSet; 
} 

GroupDaoImplTest.java:

public class GroupDaoImplTest { 
 
private GroupDaoImpl groupDao = new GroupDaoImpl(); 
private static Set<Group> groupSet = new HashSet<>(); 
private static Group group; 
 
@BeforeClass 
public static void setUp() throws DaoException { 
    StudentDaoImpl studentDao = new StudentDaoImpl(); 
    group = new Group(1, "Group 11"); 
    group.setStudents(studentDao.retrieveByGroupId(1)); 
    groupSet.add(group);         
    groupSet.add(new Group(2, "Group 12"));  
} 
 
@Test 
public void testInsert() throws DaoException { 
    groupDao.insert(new Group(1, "Group 13"), 2);        
} 
 
@Test 
public void testUpdate() throws DaoException { 
    groupDao.update(new Group(15, "Group 11"));      
} 
 
@Test 
public void testDelete() throws DaoException { 
    groupDao.delete(new Group(16, "Group 11")); 
} 
 
@Test 
public void testRetrieve() throws DaoException {         
    assertThat(groupDao.retrieve(1), is(group));         
} 
 
@Test 
public void testRetrieveByCathedraId() throws DaoException {         
    assertThat(groupDao.retrieveByCathedraId(1), is(groupSet)); 
} 
 
@Test 
public void testRetrieveAll() throws DaoException {              
    assertThat(groupDao.retrieveAll(), is(groupSet)); 
} 

}

当我执行testRetrieveAll()时我得到:

java.lang.AssertionError:  
Expected: is <[university.domain.Group@1ef58100, university.domain.Group@1ef5849f]> 
     but: was <[university.domain.Group@1ef58100, university.domain.Group@1ef5849f]>  

请您参考如下方法:

对我来说效果很好:

Group g1 = new Group(1, "a"); 
Set<Student> s1 = new HashSet<>(); 
s1.add(new Student(1, "a", "b")); 
g1.setStudents(s1); 
 
Group g2 = new Group(1, "a"); 
Set<Student> s2 = new HashSet<>(); 
s2.add(new Student(1, "a", "b")); 
g2.setStudents(s2); 
 
System.out.println(g1.equals(g2)); 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!