Java 什么';这就是“之间的区别”;。等于;及==&引用;?

Java 什么';这就是“之间的区别”;。等于;及==&引用;?,java,equals,Java,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
,当我问他为什么时,他回答说:“因为是这样!”

下面是一个例子:

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
)更好


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

在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!
此外,值得注意的是,任何两个相等的字符串常量(主要是字符串文本,但也包括通过串联的字符串常量组合)最终将引用同一个字符串。例如:

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”

如果对象是相同的实例,则==操作符将进行比较。equals()操作符比较对象的状态(例如,如果所有属性都相等)。当一个对象等于另一个对象时,你甚至可以重写equals()方法来定义你自己。

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

  • myAccount.equals(yourcount)
    true
    ,因为它们具有相同的值
    ,但是
  • myAccount==yourcount
    false
    ,因为它们不是相同的帐户

  • (当然,假设
    帐户
    类的定义合适;-

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

    ==检查两个对象在内存中是否具有相同的地址,对于原语,它检查它们是否具有相同的值。另一方面,equals方法检查正在比较的两个对象是否具有相同的值(当然,这取决于equals方法对对象的实现方式。equals方法不能应用于原语(这意味着 如果a是原语,则不允许a.equals(someobject),但允许someobject.equals(a)。方法和
    =
    运算符执行两种不同的操作。
    等于()
    方法比较
    字符串
    对象内的字符。
    =
    运算符比较两个对象引用,以查看它们是否引用同一实例。以下程序显示两个不同的字符串对象如何包含相同的字符,但对这些对象的引用不会进行相等的比较:

    // 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
    作为初始值设定项创建的。因此,两个字符串对象的内容是相同的, 但它们是不同的对象。这意味着
    s1
    s2
    不指相同的对象和对象 因此,不是
    ==
    ,如前面示例的输出所示:

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

    在Java中,当使用“==”操作符比较两个对象时,它会检查对象是否引用内存中的同一位置。例如:

    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字符串类实际上覆盖了对象类中默认的equals()实现,它覆盖了方法,因此它只检查字符串的值,而不检查字符串在内存中的位置。这意味着如果调用equals()方法来比较两个字符串对象,那么只要实际的字符序列相等,两个对象就被视为相等

    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

    如果两个操作数都属于同一个对象,则“==”运算符返回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
       }
    }
    
    实际上,当这种情况发生时,如果它没有发生,那么为什么这是==比较功能

    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)==可以应用于基本体和对象类型,但equals()方法只能应用于对象类型

    (2) 不能为内容比较重写==方法,但可以为内容比较重写equals方法(例如,String类、包装类、集合类)


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

    ==运算符比较两个对象引用以检查它们是否引用同一实例。这也将在成功匹配时返回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。

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

    ==(等于)用于计算算术表达式

    何处为

    用于比较字符串的equals()方法


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

    请注意,
    Object
    中的
    equals()
    的默认实现可以有效地追溯到
    这一点==