Java 如何使用户定义的类==的行为与字符串相同==

Java 如何使用户定义的类==的行为与字符串相同==,java,underscore-java,Java,Underscore Java,我试图理解object==操作符比较的内部实现,以便为我的用户定义类对象实现与String==相同的行为 下面是我的实现逻辑 1。Bean类 package com.study.equals; public class SomeBean { int id; public SomeBean(int id) { this.id = id; } @Override public boolean equals(Object o

我试图理解object==操作符比较的内部实现,以便为我的用户定义类对象实现与String==相同的行为

下面是我的实现逻辑

1。Bean类

package com.study.equals;

public class SomeBean {
    int id;
    
    public SomeBean(int id) {
        this.id = id;
    }
    
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof SomeBean) {
            return this.id==((SomeBean)obj).id;
        } else {
            return false;
        }
    }
    
    @Override
    public int hashCode() {
        return this.id + 2000;
    }
    
    @Override
    public String toString() {
        return "[Inside toString: " + this.hashCode() + "]";
    }
}
2。测试类

package com.study.equals;

public class SomeBean {
    int id;
    
    public SomeBean(int id) {
        this.id = id;
    }
    
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof SomeBean) {
            return this.id==((SomeBean)obj).id;
        } else {
            return false;
        }
    }
    
    @Override
    public int hashCode() {
        return this.id + 2000;
    }
    
    @Override
    public String toString() {
        return "[Inside toString: " + this.hashCode() + "]";
    }
}
包com.study.equals

公开课考试{

public static void main(String[] args) {
    SomeBean obj1 = new SomeBean(10);
    SomeBean obj2 = new SomeBean(10);
    if(obj1 == obj2) {
        System.out.println("true");
    }else {
        System.out.println("false");
    }   
}
}

  • 预期输出:真
  • 实际输出:错误
怀疑

  • 有人能帮我理解为什么我在这里变得越来越假吗
  • 我如何才能在这里得到真实的作为回应

  • obj1==obj2
    如果
    obj1
    obj2
    指的是完全相同的对象,则返回
    true
    obj1.equals(obj2)
    可以(与您的案例一样)比较两个对象的内容,并且可以为两个不同的对象返回true,因为实现了方法
    equals

    通过语句
    obj1=obj2
    可以获得相同的对象(堆内存中的相同地址,相同引用)

    如果你这样做

    obj1 = new ...
    obj2 = new ...
    

    这始终是两个不同的对象。您强制java生成两个新对象。根据
    ==

    的规定,当您要比较对象时,这些对象永远不可能相同。FTR:我在很久以前创建了一个突出显示一些角点的示例。@Progman through equals()我可以,但我的问题是,为什么我不能通过==像String==那样来实现它。==只适用于代码中的常量字符串文本,编译器(使用字符串池)对其进行不同的处理。对于“new String()”,==的工作方式与您的示例中的工作方式相同。只需注意
    new String(“abc”)==“abc”
    new String(“abc”)==new String(“abc”)
    也将返回
    false
    。您的代码所做的与此语句的含义类似:“完全相同的对象”?拥有相同的hashcode()、对象值和相同的toString()是否不能使新对象符合相同的条件?如果不是,那么是什么让另一个对象完全相同呢?不,相同的对象意味着它在Java堆内存中有相同的位置。相同(
    =
    )和相等(
    等于
    )之间的细微差别——第一种情况只是一个实例,第二种情况是具有相同内容的不同实例(取决于定义)@Chandan指向对象的变量称为引用:它指的是对象所占用的特定内存。如果我执行
    Object b=a
    ,那么我确保变量
    b
    指向与
    a
    相同的对象。然后,也只有在那时,
    a==b
    返回
    true
    。相反,
    new
    操作符总是分配一段新内存,并创建这个对象。请注意,术语
    Object
    只是人类头脑中的一个概念,机器只有一个字节序列来保存特定对象的数据。