关于java:“.equals”和“==”之间有什么区别?

What's the difference between “.equals” and “==”?

本问题已经有最佳答案,请猛点这里访问。

我今天换了讲师,他用一个奇怪的代码对我说。(他说最好用.equals,当我问为什么时,他回答"因为它是!"

下面是一个例子:

1
2
3
4
if (o1.equals(o2))
{
 System.out.println("Both integer objects are the same");
}

而不是我习惯的:

1
2
3
4
if (o1 == o2)
{
  System.out.println("Both integer objects are the same");
}

这两者有什么区别。为什么他的方法(使用.equals)更好?

在快速搜索中找到了这个,但我无法真正理解这个答案:


在爪哇中,EDCOX1〔0〕总是只比较两个引用(对于非原语,即)-即测试两个操作数是否指同一个对象。

但是,可以重写equals方法,因此两个不同的对象仍然可以相等。

例如:

1
2
3
4
5
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

此外,值得注意的是,任何两个相等的字符串常量(主要是字符串文本,但也通过串联来组合字符串常量)最终都将引用同一个字符串。例如:

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

这里,xy是对同一字符串的引用,因为y是一个编译时间常数,等于"hello"


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


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

  • myAccount.equals(yourAccount)true,因为它们的值相同,但是
  • myAccount == yourAccountfalse,因为它们不是同一个账户。
  • (当然,假设Account类的定义是适当的)。;-)


    ==是一个运算符。Equals是在对象类中定义的方法

    ==检查两个对象在内存中是否具有相同的地址,对于基元,它检查它们是否具有相同的值。另一方面,equals方法检查正在比较的两个对象是否具有相同的值(当然,这取决于如何为对象实现equals方法)。Equals方法不能应用于基元(这意味着如果a是基元a.equals(someobject),则不允许,但允许someobject.equals(a)。


    ==运算符比较两个对象引用,以检查它们是否引用同一实例。这也将在成功匹配时返回true。

    1
    2
    3
    4
    5
    6
    7
    8
    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()计算对象中的值的比较。

    1
    2
    3
    4
    5
    6
    7
    8
       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。


    (1)==可以同时应用于原语和对象类型,但equals()方法只能应用于对象类型。

    (2)==不能为内容比较重写,但Equals方法可以为内容比较重写(例如:字符串类、包装类、集合类)。

    (3)==在尝试应用异类类型时给出不可比较的类型错误,其中as equals方法返回false。


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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);
        }

    在这段代码中,u can campare的"=="和".equals"

    这里,equals用于比较引用对象,而"=="用于比较对象的状态。


    在Java中,当使用"=="运算符比较2个对象时,它检查对象是否在内存中引用相同的位置。前任:

    1
    2
    3
    4
    5
    6
    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为假

    Java字符串类实际上重写了Object类中的默认子类实现——它重写了方法,使它只检查字符串的值,而不是检查它们在内存中的位置。这意味着,如果调用equals()方法比较两个字符串对象,那么只要实际的字符序列相等,两个对象就被认为是相等的。

    1
    2
    3
    4
    5
    6
    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为真


    以下是对您的问题的简单解释:

    == (equal to) used to evaluate arithmetic expression

    在哪里

    equals() method used to compare string

    因此,最好使用==表示数值运算&equals()方法表示与字符串相关的运算。因此,对于对象比较,equals()方法是正确的选择。


    假设"=="运算符在两个操作数都属于同一对象时返回"真",但当它返回"真"时,因为我们不能为单个对象分配多个值。

    1
    2
    3
    4
    5
    6
    7
    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
       }
    }

    现在,当实际发生这种情况时,如果没有发生,那么为什么这是==比较功能….


    equals( )方法和==运算符执行两种不同的操作。equals( )方法比较String对象中的字符。==运算符比较两个对象引用,以查看它们是否引用同一个实例。下面的程序显示了两个不同的字符串对象如何包含相同的字符,但对这些对象的引用将不会进行相同的比较:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 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"创建的字符串实例。被引用的对象s2是用s1作为初始值设定项创建的。因此,两个字符串对象的内容是相同的,但它们是不同的物体。这意味着s1s2并不指同一对象,并且因此,不是==,如前面示例的输出所示:

    1
    2
    Hello equals Hello -> true
    Hello == Hello -> false