“.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
)更好?
find这个快速search,但我真的不能有意义的答案:
在Java中, ==
总是比较两个引用(对于非基元来说),即testing两个操作数是否引用同一个对象。
但是,可以重写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常量 (主要是string常量,还有通过串联string常量的组合)将最终引用相同的string。 例如:
String x = "hello"; String y = "he" + "llo"; System.out.println(x == y); // true!
这里x
和y
是对同一个string的引用,因为y
是一个等于"hello"
的编译时常量。
==运算符比较对象是否是相同的实例 。 equals()方法比较对象的状态 (例如,如果所有的属性都相等)。 你甚至可以重写equals()方法来定义一个对象与另一个对象相等的时候。
如果你们每个人都走进银行,每个人都开一个全新的账户,每个存款100美元,那么…
-
myAccount.equals(yourAccount)
是true
因为它们具有相同的值 ,但是 -
myAccount == yourAccount
是false
因为它们不是相同的帐户 。
(当然,假定适当的Account
类定义.-)
==是一个操作符。 equals是Object类中定义的一个方法
==检查两个对象是否在内存中具有相同的地址,对于原语,检查它们是否具有相同的value.equals方法,另一方面检查被比较的两个对象是否具有相同的值(取决于当前的方式equals方法已经被实现了,equals方法不能被应用在基元上(这意味着如果a是一个基元a.equals(someobject)是不允许的,但是someobject.equals(a)是允许的)。
==运算符比较两个对象引用来检查它们是否引用同一个实例。 这也会在成功的比赛中返回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 }}
上面的例子==是一个引用比较,即两个对象指向相同的内存位置
stringequals()被计算为对象中值的比较。
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 }}
上面的例子比较string的内容。 如果string匹配,它将返回true,否则返回false。
在Java中,当使用“==”运算符比较两个对象时,它会检查对象是否指向内存中的相同位置。 EX:
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");
即使string具有相同的确切字符(“xyz”),上面的代码实际上会输出:obj1 == obj2 is FALSE
Java String类实际上覆盖了Object类中的默认equals()实现 – 并覆盖该方法,以便仅检查string的值,而不检查它们在内存中的位置。 这意味着如果调用equals()方法来比较2个String对象,那么只要实际的字符序列相等,这两个对象都被认为是相等的。
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
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)==可以应用于基元和对象types,但equals()方法只能应用于对象types。
(2)==不能被重写用于内容比较,但equals方法可以被重载用于内容比较(ex; String类,包装器类,集合类)。
(3)==在尝试申请异构types时给出无法比拟的types错误,其中as等于方法返回false。
equals( )
方法和==
运算符执行两个不同的操作。 equals( )
方法比较String
对象内的String
。 ==
运算符比较两个对象引用以查看它们是否引用同一个实例。 下面的程序显示了两个不同的String对象如何包含相同的字符,但对这些对象的引用不会相当于:
// 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)); } }
variabless1
指的是由“Hello”
创build的String实例。 s2
引用的对象是以s1
作为初始值的。 因此,两个String对象的内容是相同的,但它们是不同的对象。 这意味着s1
和s2
不引用相同的对象,因此不是==
,如上例所示:
Hello equals Hello -> true Hello == Hello -> false
比方说,如果两个操作数都属于同一个对象,那么“==”操作符返回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 } }
现在,当这几乎发生,如果它不发生,那么为什么这是==比较function….
这是对你的问题的简单解释:
==(等于)用于评估算术expression式
在哪里
用于比较string的equals()方法
因此,对于string相关操作,使用数字操作==和equals()方法更好。 所以,为了比较对象,equals()方法是正确的select。