“.equals”和“==”有什么区别?

我今天转换讲师,他说我使用一个奇怪的代码。 (他说使用.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 )更好?

find这个快速search,但我真的不能有意义的答案:

在Java中, ==总是比较两个引用(对于非基元来说),即testing两个操作数是否引用同一个对象。

但是,可以重写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常量 (主要是string常量,还有通过串联string常量的组合)将最终引用相同的string。 例如:

 String x = "hello"; String y = "he" + "llo"; System.out.println(x == y); // true! 

这里xy是对同一个string的引用,因为y是一个等于"hello"的编译时常量。

==运算符比较对象是否是相同的实例 。 equals()方法比较对象状态 (例如,如果所有的属性都相等)。 你甚至可以重写equals()方法来定义一个对象与另一个对象相等的时候。

如果你们每个人都走进银行,每个人都开一个全新的账户,每个存款100美元,那么…

  1. myAccount.equals(yourAccount)true因为它们具有相同的值 ,但是
  2. myAccount == yourAccountfalse因为它们不是相同的帐户

(当然,假定适当的Account类定义.-)

==是一个操作符。 equals是Object类中定义的一个方法

==检查两个对象是否在内存中具有相同的地址,对于原语,检查它们是否具有相同的value.equals方法,另一方面检查被比较的两个对象是否具有相同的值(取决于当前的方式equals方法已经被实现了,equals方法不能被应用在基元上(这意味着如果a是一个基元a.equals(someobject)是不允许的,但是someobject.equals(a)是允许的)。

==运算符比较两个对象引用来检查它们是否引用同一个实例。 这也会在成功的比赛中返回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 }} 

上面的例子==是一个引用比较,即两个对象指向相同的内存位置

stringequals()被计算为对象中值的比较。

  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 }} 

上面的例子比较string的内容。 如果string匹配,它将返回true,否则返回false。

在Java中,当使用“==”运算符比较两个对象时,它会检查对象是否指向内存中的相同位置。 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"); 

即使string具有相同的确切字符(“xyz”),上面的代码实际上会输出:obj1 == obj2 is FALSE

Java String类实际上覆盖了Object类中的默认equals()实现 – 并覆盖该方法,以便仅检查string的值,而不检查它们在内存中的位置。 这意味着如果调用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

 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用于比较引用对象,'=='用于比较对象的状态。

(1)==可以应用于基元和对象types,但equals()方法只能应用于对象types。

(2)==不能被重写用于内容比较,但equals方法可以被重载用于内容比较(ex; String类,包装器类,集合类)。

(3)==在尝试申请异构types时给出无法比拟的types错误,其中as等于方法返回false。

equals( )方法和==运算符执行两个不同的操作。 equals( )方法比较String对象内的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)); } } 

variabless1指的是由“Hello”创build的String实例。 s2引用的对象是以s1作为初始值的。 因此,两个String对象的内容是相同的,但它们是不同的对象。 这意味着s1s2不引用相同的对象,因此不是== ,如上例所示:

 Hello equals Hello -> true Hello == Hello -> false 

比方说,如果两个操作数都属于同一个对象,那么“==”操作符返回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 } } 

现在,当这几乎发生,如果它不发生,那么为什么这是==比较function….

这是对你的问题的简单解释:

==(等于)用于评估算术expression式

在哪里

用于比较string的equals()方法

因此,对于string相关操作,使用数字操作==和equals()方法更好。 所以,为了比较对象,equals()方法是正确的select。