public class Counter {
String s1;
Counter(String s) {
this.s1 = s;
}
public static void main(String[] args) {
Counter t1 = new Counter("test");
Counter t2 = new Counter("test");
System.out.println(t1 == t2); //false - Output
System.out.println(t1.equals(t2)); //false - Output
String s1 = new String("rt");
String s2 = new String("rt");
System.out.println(s1 == s2); //false - Output
System.out.println(s1.equals(s2)); //true - Output
}
}
原因:为equals方法获取不同的输出。
由于java.lang.String类重写equals方法,如果两个String对象包含相同的内容,则返回true,但如果两个引用指向同一个对象,则返回true。
对于==运算符我得到了正确的结果但是对于equals方法我在程序中有点困惑,因为输出不同。请问,有人可以分享他们对此的看法吗?提前谢谢
答案 0 :(得分:0)
String
课程会覆盖equals
,但您的Counter
课程不会,这就是equals
与==
行为相同的原因。 t1.s1.equals(t2.s1)
会返回true
。
答案 1 :(得分:0)
类Object的equals方法实现最具辨别力 对象可能的等价关系;也就是说,对于任何非null 引用值x和y,当且仅当x时,此方法返回true 和y引用相同的对象(x == y的值为true)。
您的班级Counter
未覆盖equals
方法,因此其行为与==相同。但是在String
类中,如果字符串的内容匹配,则此方法将覆盖以返回true
。您可以覆盖类中的方法以实现相同的功能
答案 2 :(得分:0)
equals()
类的 String
方法定义为:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
而Counter类的equals()
方法定义如下(继承Object
类)
public boolean equals(Object obj) {
return (this == obj);
}
正如您所看到的,这两种方法都有不同的效果,您会得到不同的结果。如果你想要相同的结果,那么你可以覆盖equals()
类中的Counter
方法来实现类似String的功能,如下所示:
public class Counter {
String s1;
Counter(String s) {
this.s1 = s;
}
@Override
public boolean equals(Counter counter) {
return this.s1.equals(counter.s1);
}
...
...
}
答案 3 :(得分:0)
==
和equals
不一样,==
是一个可以比较对象的内存地址的操作。但是相等的方法只返回一个布尔值,它依赖于包含内部的相等方法。等于方法位于Object类。所以你可以覆盖方法,你可以说它是否相等。
例如
class Counter {
private int count;
public boolean equals(Object another){
return another instanceof Counter && ((Counter)another).count == this.count;
}
}
因此,如果您要处理HashMap并将对象作为键,则需要覆盖等号方法,您需要覆盖hashcode
方法。不仅是HashMap,其中涉及散列技术,这就是原因所在。 http://tutorials.jenkov.com/java-collections/hashcode-equals.html
答案 4 :(得分:0)
您的班级Counter
既不会覆盖hashCode()
也不会覆盖equals()
。因此,您的班级Counter
的行为与班级Object
完全相同。只有两个Objects
==
和equals()
代表同一个实例时才会equals()
。
如果您想更改此行为,则必须根据hashCode()
方法定义的合同覆盖Counter
equals()
- (IBAction)shareBtnAction:(id)sender
{
NSString *textToShare = @"";
NSURL *myWebsite = [NSURL URLWithString:@"www.facebook.com"];
NSArray *objectsToShare = @[textToShare, myWebsite];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
NSArray *excludeActivities = @[UIActivityTypeAirDrop,
UIActivityTypePrint,
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList,
UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo];
activityVC.excludedActivityTypes = excludeActivities;
[self presentViewController:activityVC animated:YES completion:nil];
}
。