我有一个Java类
class Student
{
String name;
int age;
}
另外,我有两个Student class student1
和student2
的实例。
找出两个实例是否代表“同一个学生”的一种方法是手动比较数据,即名称和年龄。如果它们是相同的,那么它们代表“同一个学生”。
有没有其他方法可以确定这两个实例是否代表“同一个学生”?
P.S。我在接受采访时被问到这个问题。我仍然不完全理解“同一个学生”这个短语。我猜它在现实世界中意味着同一个学生。如果没有,面试官还有什么意思?
答案 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!");
}
}
}