在我的一次采访中,一位采访者问我:
给定Student
类和两个对象s1
和s2
:
s1 = new Student();
s2 = new Student();
s1 == s2
将如何返回true
?
我告诉他让Student
班级成为单身人士,但他说不,而且我们必须在班级进行更改,以便s1 == s2
返回true
。< / p>
注意:我们需要更改Student
课程。请不要回复s1=s2
。
任何线索?
答案 0 :(得分:5)
操作符s1 == s2
检查两个对象是否相同。
您创建了两个不同的equals对象。
所以它们不一样,equals
将返回false。
您必须重新定义方法s1.equals(s2)
并使用此方法检查它们,如下所示:
==
方法equals
:
指示某个其他对象是否“等于”此对象。
请注意,当您重新定义方法equals时,您还需要重新定义方法hashCode,如在equals方法的描述中明确记录的那样:
请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。
通常ide(如IntelliJ,Eclipse或Netbeans)可以帮助您编写两种方法的良好实现。
考虑到这一点,我想面试官已经问过像 s1将s2等于s2 这样的话,而你误解了它是 s1(simble equals)s2 。或者他已经在论文中明确写了运算符s1 == s2 // returns true
?
如果面试官明确询问将如何
Student s1 = new Student();
Student s2 = new Student();
创建两个对象后
Student s1 = new Student();
Student s2 = new Student();
s1 = s2; // new added line , or the same if you write s2 == s1
s1 == s2 // now is true
唯一的可能性是更改s1(或s2)的引用,如下所示:
null
但这是一个技巧,事实上你正在测试两个不同的变量引用相同的对象。
您可以有一个类似的行为,分配给先前创建的变量Student
或其他s1
。基本上,对s2
分配给function getAppNames(){
var appRef = firebase.database().ref().child('ApplicationList');
var allApps = {}, appNames =[];
let temp = {};
appRef.on('value', function(snap) {
allApps = {};
appNames = [];
allApps = snap.val();
console.log('allApps', allApps);
let keys = Object.keys(allApps);
console.log('Keys = ',keys);
for(let i=0;i<keys.length;i++){
temp = {};
temp['shortName'] = allApps[keys[i]].shortName;
temp['longName'] = allApps[keys[i]].longName;
appNames[i] = temp;
}
appNames['appNames'] = appNames;
console.log('appNames = ',JSON.stringify(appNames));
var source = document.getElementById("sidebar-template").innerHTML;
var template = Handlebars.compile(source);
$('.content-placeholder').html(template(appNames));
});
}
的代码的任何更改都将有效。
答案 1 :(得分:3)
这是一种技巧,但会满足要求:
更改Student
构造函数以抛出一些异常(我选择了一个未经检查的异常,因此我不必在throws子句中指定它):
public Student()
{
throw new NullPointerException();
}
现在,假设我们被允许添加try-catch块:
Student s1 = null;
Student s2 = null;
try {
s1 = new Student();
s2 = new Student();
}
catch (Exception e) {
}
System.out.println (s1==s2);
这将打印true
,因为s1
和s2
都是null
。
即使我们没有捕获异常,s1 == s2
在两个构造函数调用之后仍然是真的(实际上在第一个构造函数调用之后,因为第二个构造函数将永远不会被执行),但是我们有在某个地方捕获异常以便测试它。
答案 2 :(得分:2)
已经回答here,==
比较了参考。即它比较s1
和s2
是否指向同一个对象。由于您使用new
来实例化s1
和s2
,因此您的要求只是不可能。
答案 3 :(得分:1)
我看到的唯一合乎逻辑的解决方案是微不足道的:
s1 = new Student();
s2 = new Student();
s1=null;
s2=null;
System.out.println(s1==s2);
或:
s1 = new Student();
s2 = new Student();
s1=s2;
System.out.println(s1==s2);
或:
s1 = new Student();
s2 = new Student();
s2=s1;
System.out.println(s1==s2);
作为@ user7在评论中建议
答案 4 :(得分:0)
==
比较对象引用,它检查两个操作数是否指向同一对象(不是等效对象,相同对象)。所以我真的认为唯一的方法就是这样:
@Override
public Student clone(){
return this;
}
也许这会让==
运算符按照您的要求运行。这对我来说是非常错误的,因为我不认为这是clone()
方法的预期用途。否则,当你考虑到在班级工作的约束时,我没有任何关于如何制作的线索。
如果clone()
无法使用,答案可能是:无法做到这一点。
答案 5 :(得分:-3)
As ==运算符比较对象引用,我认为s1和s2必须为null。