我今天换了讲师,他说我用了一个奇怪的代码。 (他说使用.equals
更好,当我问为什么时,他回答“因为它是!”)
所以这是一个例子:
if (o1.equals(o2))
{
System.out.println("Both integer objects are the same");
}
而不是我习惯的:
if (o1 == o2)
{
System.out.println("Both integer objects are the same");
}
两者之间有什么区别。为什么他的方式(使用.equals
)更好?
Found this快速搜索,但我无法理解这个答案:
答案 0 :(得分:111)
在Java中,==
总是只比较两个引用(对于非基元,即),即它测试两个操作数是否引用同一个对象。
但是,可以覆盖equals
方法 - 因此两个不同的对象仍然可以相等。
例如:
String x = "hello";
String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });
System.out.println(x == y); // false
System.out.println(x.equals(y)); // true
此外,值得注意的是,任何两个相等的字符串常量(主要是字符串文字,以及通过串联的字符串常量的组合)将最终引用相同的字符串。例如:
String x = "hello";
String y = "he" + "llo";
System.out.println(x == y); // true!
此处x
和y
是对同一字符串的引用,因为y
是一个等于"hello"
的编译时常量。
答案 1 :(得分:19)
==运算符会比较对象是否相同实例。 equals()oerator比较对象的状态(例如,如果所有属性都相等)。您甚至可以覆盖equals()方法,以便在对象等于另一个对象时定义自己。
答案 2 :(得分:14)
如果你和我各自走进银行,每个人开一个全新的账户,每个存款100美元,然后...
myAccount.equals(yourAccount)
为true
,因为他们的相同值,但myAccount == yourAccount
为false
,因为它们不是相同的帐户。(假设Account
类的适当定义,当然。; - )
答案 3 :(得分:2)
==是一名运营商。 equals是Object类
中定义的方法==检查两个对象是否在内存中具有相同的地址,并且对于原语,它检查它们是否具有相同的值。另一方面,equals方法检查被比较的两个对象是否具有相等的值(取决于如何为对象实现equals方法.quarts方法不能应用于原语(这意味着 如果a是原始的a.equals(someobject)是不允许的,但是允许someobject.equals(a)。
答案 4 :(得分:0)
==运算符比较两个对象引用以检查它们是否引用相同的实例。这也将在成功匹配时返回true。例如
public class Example{
public static void main(String[] args){
String s1 = "Java";
String s2 = "Java";
String s3 = new string ("Java");
test(Sl == s2) //true
test(s1 == s3) //false
}}
以上示例==是参考比较,即两个对象都指向相同的内存位置
String equals()计算对象中值的比较。
public class EqualsExample1{
public static void main(String args[]){
String s = "Hell";
String s1 =new string( "Hello");
String s2 =new string( "Hello");
s1.equals(s2); //true
s.equals(s1) ; //false
}}
上面的示例它比较了字符串的内容。如果字符串匹配,它将返回true,否则返回false。
答案 5 :(得分:-1)
在Java中,当“==”运算符用于比较2个对象时,它会检查对象是否引用内存中的相同位置。 EX:
String obj1 = new String("xyz");
String obj2 = new String("xyz");
if(obj1 == obj2)
System.out.println("obj1==obj2 is TRUE");
else
System.out.println("obj1==obj2 is FALSE");
即使字符串具有相同的确切字符(“xyz”),上面的代码实际上也会输出: obj1 == obj2为FALSE
Java String类实际上覆盖了Object类中的默认 equals()实现 - 它覆盖了该方法,因此它只检查字符串的值,而不是它们在内存中的位置。这意味着如果调用equals()方法来比较2个String对象,那么只要实际的字符序列相等,两个对象就被认为是相等的。
String obj1 = new String("xyz");
String obj2 = new String("xyz");
if(obj1.equals(obj2))
System.out.printlln("obj1==obj2 is TRUE");
else
System.out.println("obj1==obj2 is FALSE");
此代码将输出以下内容:
obj1 == obj2为TRUE
答案 6 :(得分:-1)
public static void main(String[] args){
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2));
////
System.out.println(s1 == s2);
System.out.println("-----------------------------");
String s3 = "hello";
String s4 = "hello";
System.out.println(s3.equals(s4));
////
System.out.println(s3 == s4);
}
在此代码中,您可以将两者都放在一起' =='和' .equals'
这里.equals用于比较参考对象和' =='用于比较对象的状态..
答案 7 :(得分:-1)
(1)==可以应用于基元和对象类型,但equals()方法只能应用于对象类型。
(2)==无法覆盖内容比较,但可以覆盖equals方法进行内容比较(例如:String类,包装类,集合类)。
(3)==在尝试申请异构类型时给出无法比较的类型错误,其中equals方法返回false。
答案 8 :(得分:-2)
equals( )
方法和==
运算符执行两种不同的操作。 equals( )
方法比较String
对象内的字符。 ==
运算符比较两个对象引用以查看它们是否引用同一实例。以下程序显示了两个不同的String对象如何包含相同的字符,但对这些对象的引用不会相等:
// equals() vs ==
class EqualsNotEqualTo {
public static void main(String args[]) {
String s1 = "Hello";
String s2 = new String(s1);
System.out.println(s1 + " equals " + s2 + " -> " +
s1.equals(s2));
System.out.println(s1 + " == " + s2 + " -> " + (s1 == s2));
}
}
变量s1
是指由“Hello”
创建的String实例。提到的对象
使用s2
创建s1
作为初始值设定项。因此,两个String对象的内容是相同的,
但它们是不同的对象。这意味着s1
和s2
不会引用相同的对象和
因此,不是==
,如前面示例的输出所示:
Hello equals Hello -> true
Hello == Hello -> false
答案 9 :(得分:-2)
让我们说" =="如果两个操作数都属于同一个对象,但是当它返回true时,运算符返回true,因为我们无法为单个对象分配多个值
public static void main(String [] args){
String s1 = "Hello";
String s1 = "Hello"; // This is not possible to assign multiple values to single object
if(s1 == s1){
// Now this retruns true
}
}
现在,当实际发生这种情况时,如果没有发生,那么为什么这是==比较功能......
答案 10 :(得分:-2)
以下是对您的问题的简单解释:
==(等于)用于评估算术表达式
其中
用于比较字符串
的equals()方法
因此,最好使用==进行数值运算& String相关操作的equals()方法。因此,为了比较对象,equals()方法将是正确的选择。