你为什么要这样做and==与Java中的equals方法不一样吗?

你为什么要这样做and==与Java中的equals方法不一样吗?,java,equals,equals-operator,Java,Equals,Equals Operator,可能的重复项: 所以我的问题很简单。。为什么不=的行为与相同!equals()aka(notequals) 我看不出一个人失败的任何逻辑原因,在我看来,这两个都是完全相同的代码 查看java操作符 你可以清楚地看到 相等=== 是相等运算符,当然我通常使用=仅适用于数字。。但是我的思绪开始游荡,为什么它不适用于String 编辑: 这里有一些看起来更像实际问题的东西 for (ClassGen cg : client.getClasses().values()) {

可能的重复项:

所以我的问题很简单。。为什么不
=的行为与
相同!equals()
aka(
notequals

我看不出一个人失败的任何逻辑原因,在我看来,这两个都是完全相同的代码

查看java操作符

你可以清楚地看到 相等
==
=

是相等运算符,当然我通常使用
=仅适用于数字。。但是我的思绪开始游荡,为什么它不适用于
String

编辑: 这里有一些看起来更像实际问题的东西

    for (ClassGen cg : client.getClasses().values()) {
        final ConstantPoolGen cp = cg.getConstantPool();
        if(cp.lookupInteger(0x11223344) != -1) {
            for (Method m : cg.getMethods()) {  
                System.out.println("lots of class spam");
                if(m.getName() != "<init>") continue;
                System.out.println("NEVER GETS HERE, 100% SURE IT HAS CONSTRUCTOR LOL");
            }
        }
    }
for(ClassGen cg:client.getClasses().values()){
最终ConstantPoolGen cp=cg.getConstantPool();
if(cp.lookupInteger(0x11223344)!=-1){
对于(方法m:cg.getMethods()){
System.out.println(“大量的类垃圾邮件”);
如果(m.getName()!=“”)继续;
System.out.println(“永远不会到这里,100%确定它有构造函数LOL”);
}
}
}

运算符仅适用于基本体,而不适用于对象,因此必须进行字符串比较
等于
,因为这是在对象级别操作的

--编辑--


我的评论的意思是“一个对象的价值不能像其他语言那样以预期的方式进行比较”。当然,您可以使用==符号,但不能用于文本比较。这是每次有人从脚本语言或其他支持字符串文本比较运算符的语言迁移到Java时都会问的经典问题。

运算符只适用于原语,而不适用于对象,因此字符串比较必须在对象级别进行

--编辑--


我的评论的意思是“一个对象的价值不能像其他语言那样以预期的方式进行比较”。当然,您可以使用==符号,但不能用于文本比较。这是每次有人从脚本语言或其他支持字符串文本比较运算符的语言迁移到Java时都会问的经典问题。

字符串是对象,而不是原语。
==
=将两个基本体相互比较。
要比较字符串,您需要在每个字符之间循环,并按照
.equals()
所做的顺序进行比较

如果您在Java中执行任何OOP,那么当您想要对对象执行相等性检查时,您需要重写equals,如果您想要能够对它们进行排序,则需要实现Comparable和
.compare()

下面是一个简单的equals示例:

public class Person {
    public name;

    public Person(String name) {
        this.name = name;
    }

    public boolean equals(Object o){
        if(o instanceof Person)
            if(this.name.equals(o.name))
                return true;
        return false;
    }
}
现在,可以将一个人与另一个人进行比较,如:

person1.equals(person2)

只有当两个人的名字相同时,才会返回true。您可以根据需要定义使两个对象相等的因素,但如果对象实际上只是指向内存中同一对象的两个指针,那么它们只是对象,而不是基元。
==
=将两个基本体相互比较。
要比较字符串,您需要在每个字符之间循环,并按照
.equals()
所做的顺序进行比较

如果您在Java中执行任何OOP,那么当您想要对对象执行相等性检查时,您需要重写equals,如果您想要能够对它们进行排序,则需要实现Comparable和
.compare()

下面是一个简单的equals示例:

public class Person {
    public name;

    public Person(String name) {
        this.name = name;
    }

    public boolean equals(Object o){
        if(o instanceof Person)
            if(this.name.equals(o.name))
                return true;
        return false;
    }
}
现在,可以将一个人与另一个人进行比较,如:

person1.equals(person2)

只有当两个人的名字相同时,才会返回true。您可以根据需要定义使两个对象相等的因素,但如果对象实际上只是指向内存中同一对象的两个指针,则它们仅为
=

使用!=意味着您检查内存中的实例引用,同一实例将在该比较中为您提供
true

在执行
新字符串(“foobar”)
时,会在内存中创建一个新的“foobar”,使用
=
进行比较时返回false

在该新字符串上调用可能会更改此行为,因为该字符串现在将被抓取或添加到字符串池中


无论如何,使用“equals()”更安全。

使用!=意味着您检查内存中的实例引用,同一实例将在该比较中为您提供
true

在执行
新字符串(“foobar”)
时,会在内存中创建一个新的“foobar”,使用
=
进行比较时返回false

在该新字符串上调用可能会更改此行为,因为该字符串现在将被抓取或添加到字符串池中

无论如何,使用“equals()”更安全

对我来说,这将产生:

1
2
但这两张支票并不等同。第一个检查是检查getName()返回的对象是否与为字符串文本“foobar2”创建的对象相同,而事实并非如此。第二个检查可能是您想要的,它检查getName()方法返回的String对象的值是否等于为“foobar2”字符串文本创建的String对象的值

因此,两个检查都将返回true,第一个检查是因为它们不是相同的对象,第二个检查是因为它们的值不相同

对我来说,这将产生:

1
2
但这两张支票并不等同。第一个检查是检查getName()返回的对象是否与为字符串文本“foobar2”创建的对象相同,而事实并非如此。第二个检查可能是您想要的,它检查getName()方法返回的String对象的值是否等于为“foobar2”字符串文本创建的String对象的值

所以两个检查都将返回true,第一个检查是因为它们不是相同的ob