如何确定Student类的两个实例是否代表同一个学生?

时间:2011-02-20 06:10:32

标签: java

我有一个Java类

class Student
{
    String name;
    int age;
}

另外,我有两个Student class student1student2的实例。

找出两个实例是否代表“同一个学生”的一种方法是手动比较数据,即名称和年龄。如果它们是相同的,那么它们代表“同一个学生”。

有没有其他方法可以确定这两个实例是否代表“同一个学生”?

P.S。我在接受采访时被问到这个问题。我仍然不完全理解“同一个学生”这个短语。我猜它在现实世界中意味着同一个学生。如果没有,面试官还有什么意思?

4 个答案:

答案 0 :(得分:7)

是什么标识了学生?

除了名字和年龄,我们什么都没有。现在,你可能有两个同名的人,但可能没有。无论如何,我不认为年龄是识别某人的东西 - 不像名字那样。

所以我会这样做

public boolean equals(Object o) {
    if(!o instanceof Student) return false;
    Student s = (Student)o;
    return o.name.equals(this.name);
}

如果您是Java新手,Object类有一个方法public boolean equals(Object o)。因为Java中的每个对象都继承自Object,所以无论是否需要,它们都拥有该方法。默认实现只是比较内存中的地址。所以如果你要做的话

Student s = new Student();
Student t = new Student();
boolean e = (s == t); // always false
boolean q = s.equals(t); // always false if not overridden

现在,我编写的这个特殊方法不执行空检查,如果它在生产代码中,您可以这样做。

答案 1 :(得分:5)

Java中同一学生有两种定义(如果学生是对象)。存在这样的情况:学生具有相同的名称和年龄,可以通过实现.equals()方法来检查。这意味着它们的价值是相等的。

@Override
public boolean equals(Object o) {
    //check if the student's age and name are equal
}

第二种情况是指当两个不同的变量指向同一个实际对象时,这称为参照相等,可以用==进行测试。

if (student1 == student2)

答案 2 :(得分:0)

非常好的问题,尽我所能,希望它会让你明白......

首先复制文字 你的文字=“找出两个实例是否代表”同一个学生“的一种方法是手动比较数据,即名称和年龄。如果它们相同,那么它们代表”同一个学生“和”我猜它在现实世界中意味着同一个学生。“

你的第一个问题是错误的,而你的猜测是正确的。 在一所学校,有两名名叫弗兰克的学生,弗兰克的年龄相同。这是否意味着它们是相同的。当然没有。即使您比较说5个数据,也可能是两个不同学生的5个数据匹配。在现实世界中,很容易看到它们并说它们是不同的。

在java的语言中,“==”double equals引用“same”并称为相同的实例。

如果两个引用变量student1和student2引用同一个实例,则意味着它们指的是同一个学生或者使用java语言“同一个学生实例”

在学生的背景下==很重要,建议你阅读.equals()方法,以便更多地了解平等。

答案 3 :(得分:0)

我认为,实现此目标的最简单方法是执行大多数人所说的话。您可以使用Object类(所有类都继承自)的继承方法equals。如果这是用于较大的项目,我还建议您执行以下操作:

为每个Student对象分配一个UUID。这为每个学生提供了一个唯一可识别的ID,然后您可以在equals方法中轻松比较这两个值。要自动让它生成一个UUID,您可以根据所有属性的哈希值以及一些pysudo-random属性生成一个字符串,例如当前时间之类的东西应该可以工作。这样即使在两个学生拥有完全相同的信息的情况下,也可以避免重叠,因为无法完全同时生成两个学生,他们将始终具有不同的UUID。

然后,您可以创建一个容器类,使用HashMap<String, Student>存储所有学生,并创建方法getStudentByID(String id)setStudentByID(String id, Student value)来轻松访问和管理您馆藏中的所有学生。

反正我就是这样做的。

如果您想解决此问题而无需执行其他操作,则可以在下面使用此代码段。

package Snippet1;

public class Snippet1 {
    static class Student {
        public String name;
        public int age;

        @Override
        public boolean equals(Object obj) {
            if (obj.getClass().isAssignableFrom(Student.class)) {
                Student secondStudent = (Student) obj;
                if (secondStudent.age == this.age && secondStudent.name.equalsIgnoreCase(this.name)) {
                    // Student, with all the same information
                    return true;
                } else {
                    // Student, but with different information
                    return false;
                }
            } else {
                // Not a student!
                return false;
            }
        }

    }

public static void main(String[] args) {

    // Your example ( with little changes )

    Student student1 = new Student();
    student1.name = "Jane";
    student1.age =  15;

    Student student2 = new Student();
    student1.name = "John";
    student2.age = 17;

    if (student1.equals(student2)) {
        System.out.println("Same student!");
    } else {
        System.out.println("Different student!");
    }

}

}