我今天换了讲师,他用一个奇怪的代码对我说。(他说最好用.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)更好?
在快速搜索中找到了这个,但我无法真正理解这个答案:
- 这已经被问过很多次了。stackoverflow.com/questions/971954/…
- 猜猜找错地方了
- 既然C和Java的行为不完全一样,我认为每种语言都有一个问题是合理的。
- 这是一件好事,我所引用的答案既包括Java,又包含C语言:
- 这提供了一个很好的摘要答案stackoverflow.com/a/2772888/1358837
- 任何讲师都不应该满足于给出这样的答案,你也不应该满足。
- .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 |
此外,值得注意的是,任何两个相等的字符串常量(主要是字符串文本,但也通过串联来组合字符串常量)最终都将引用同一个字符串。例如:
这里,x和y是对同一字符串的引用,因为y是一个编译时间常数,等于"hello"。
- 不重写equals的非泛型类呢?equals方法是否与"=="相同,只需检查类的两个实例是否引用同一对象?谢谢。
- 尼尔:是的。在类中,除非重写equals,否则它始终意味着引用相等。
- 可怕的措辞。"=="测试两个对象是否指向同一内存位置,即它们是指向同一对象中一个对象的指针。"equals()"方法比较对象状态,即给定相同类型的所有内部变量(如实例变量)都相同。
- @英格希尔:物体不指向任何东西。==测试两个引用是否引用同一对象。如果你要抱怨"可怕的措辞",你需要确保使用正确的术语。至于equals()是否比较对象状态——它可以,但不必,而且肯定不会自动进行。(它可以考虑一些变量是否相等,但其他变量不相等。)
- @乔恩SKET:"Java是通过引用传递还是通过值传递?"(tinyurl.com/9jxg9f9)与"=="比较的不是"两个引用",而是对象的内存位置(注意小写)。这很简单,为什么具有相同内部结构的两个字符串对"=="产生错误。你是正确的,等于并不总是比较状态。对象类中的默认行为是一个一行符"=="比较。在大多数java.lang原语包装器(如integer)的情况下,将重写object equals()方法以比较内部。这正是java.lang.string的源代码所揭示的。
- @英格希尔:嗯,我看不出那篇文章是如何相关的。这就是参数传递。正在比较的值正好是引用。它们不一定是内存位置——它们是JVM希望用于引用的任何形式的引用。引用类型变量的值是引用。这就是为什么在本文中,==是引用相等运算符。参见Java语言规范的第1521.3部分:DOCS.Oracle .COM/JavaS/SCOS/JLS/SE7/HTML/HelLip;这是一个定义很好的术语,我使用得很正确。
- 第3.2节中的Java虚拟机规范明确地表示,"类型引用的值可以被认为是指向对象的指针"(参见Tyyurur.COM/8MSRN3U)。我的观点是,用优美的术语挥手并不反映核心内存比较。
- @英格希尔:"可以被认为"在许多情况下,是的-但不是全部。那是挥手。在引用值不是直接内存位置,而是大型查找表中的条目的情况下,当然可以实现JVM。不过,随着时间的推移,你的观点似乎发生了变化,因为你指责我错误地使用了"引用"这个词。您现在是否接受我使用的"引用"一词完全符合JLS,并且正在比较的值是引用?
- @我试图在你的答案中添加字符串大小写,所以任何人提到这个答案都不会错过这一点。如果你有感觉,请填补空白。
==运算符比较对象是否为同一实例。equals()操作符比较对象的状态(例如,如果所有属性都相等)。甚至可以重写equals()方法来定义一个对象与另一个对象相等时的自己。
- 请注意,Object中equals()的默认实现返回到有效的this == other。这是一个常见的混淆源,因为除非您使用的是一个以有意义的方式实际实现equals()的类,否则您将看不到任何区别。
- 是的,我应该提一下。提问者可以看看JDK本身,有许多类可以作为例子。
如果你和我每个人走进银行,每个人开一个全新的账户,每个存款100美元,那么……
myAccount.equals(yourAccount)是true,因为它们的值相同,但是
myAccount == yourAccount是false,因为它们不是同一个账户。
(当然,假设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
| |
在这段代码中,u can campare的"=="和".equals"
这里,equals用于比较引用对象,而"=="用于比较对象的状态。
在Java中,当使用"=="运算符比较2个对象时,它检查对象是否在内存中引用相同的位置。前任:
尽管字符串具有相同的确切字符("xyz"),但上面的代码实际上将输出:obj1==obj2为假
Java字符串类实际上重写了Object类中的默认子类实现——它重写了方法,使它只检查字符串的值,而不是检查它们在内存中的位置。这意味着,如果调用equals()方法比较两个字符串对象,那么只要实际的字符序列相等,两个对象就被认为是相等的。
此代码将输出以下内容:
obj1==obj2为真
- 它通常检查对象是否位于内存中的同一位置,但这是一个实现细节。并发垃圾收集器可以在对象的当前位置设置写陷阱,将对象复制到新位置,然后更新一个引用以引用新副本,最后更新另一个引用。即使在两次更新之间,==操作符也必须始终返回true,因为这两个引用将标识同一对象,但这并不意味着它们标识了同一内存块。
以下是对您的问题的简单解释:
== (equal to) used to evaluate arithmetic expression
在哪里
equals() method used to compare string
因此,最好使用==表示数值运算&equals()方法表示与字符串相关的运算。因此,对于对象比较,equals()方法是正确的选择。
- 问题中没有关于字符串的内容。
- @EJP我只是试图解释=&;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作为初始值设定项创建的。因此,两个字符串对象的内容是相同的,但它们是不同的物体。这意味着s1和s2并不指同一对象,并且因此,不是==,如前面示例的输出所示:
1 2
| Hello equals Hello -> true
Hello == Hello -> false |
- 这个问题实际上并不涉及字符串。虽然equals方法通常指的是对象的"内部",但它没有义务这样做。许多objects.equals()方法只使用内存地址(即等于==)
- 在爪哇,有少量的原始类型和一个"引用"类型。==运算符测试其操作数是否相同。由于引用类型的"value"是对象的标识,因此只有当操作数引用同一对象时,它们才会被认为是相同的。与对象本身无关;事实上,比较是在不看它的情况下进行的。