`
algorithm
  • 浏览: 8613 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

“==”不等于“.equals”

阅读更多

这里举出一个Java编程程序员经常碰到的问题。例如现在是凌晨3点,在你喝完第4杯咖啡后,你设法找到正确的逻辑来解决复杂的编程问题。到目前,你几乎不能思考String和Object引用,因为你已经昏昏欲睡了。然后糟糕的事情发生了……不,并不是Java溢出,而是如下所示。

String name = getName();
if (name == "Sleepy") // oops!
{
doSomething();
}

你快速编译并测试代码后,代码似乎正常运行。终于到下班回家休息的时候了!然而,一段时间后,应用程序测试发现了一个间歇性错误,并跟踪到此错误的来源恰好是这段代码。

“怎么会这样?”你可能会愤怒地说,“前几天我还试验过类似的String比较,并且能够正确运行!”。但是,你需要首先重温一下Java对象引用的概念。一个对象变量是一个指向存储在堆内存(heap memory)中实际对象的引用(指针)。当为另一个变量分配一个变量时,事实上分配的是引用而不是实际的对象(如图1-1所示):

String a, b, c, d;
a = "123";
b = a;
c = new String("123");
d = "WCJ";


图 1-1 对象引用
Java中,“==”运算符用来比较两个引用以查看它们是否指向同一个内存对象。而对于String实例,运行时状态会尽可能地确保任意两个具有相同字符信息的String字面值指向同一个内部对象。此过程称为驻留(interning),但是它并不有助于每个String的比较。一个原因是垃圾收集器线程删除了驻留值,另一个原因是String所在的位置可能被一个由String构造函数创建的新实例占用。如果是这样,“==”将总是返回false。
可以设计equals方法来比较两个对象的状态(state)或每个对象的内容。对你自己的类,必须重写此方法来使它正确操作。但是如果使用equals方法,String实例总是能够正确地比较。假定所有的String值是驻留的,下面的代码段说明了此问题:
String name1, name2, name3;
name1 = "123";
name2 = name1;
if (name1 == name2) {}          // true
if (name1.equals(name2)) {}     // true

name2 = "123";
if (name1 == name2) {}          // usually true
if (name1.equals(name2)) {}     // true

name3 = new String("123");
if (name1 == name3) {}          // false
if (name1.equals(name3)) {}     // true


注意:

总是使用.equals来比较两个String值,尽管使用“==”运算符看似能够正确操作。对于大多数应用程序而言,即使它能正确运行,但“==”代码事实上是错误的,而只有equals是正确的。因此告诉所有你的开发同行支持String的“equals(平等)”权吧(这很可能是本书中最差的双关语)!

补充:“==”是有时候可以 有时候不行,但是在比较类似“-1”之类的数字串时候,用“!=”就绝对比不出来了,不相信可以试试
分享到:
评论

相关推荐

    Java面试题07.==和equals的区别.mp4

    Java面试题07.==和equals的区别.mp4

    hashcode、equals、==总结1简单总结.txt

    hashcode、equals、==总结1简单总结.txt,他们之间的区别

    计算机后端-Java-Java核心基础-第14章 面向对象06 15. 总结==与equals().avi

    计算机后端-Java-Java核心基础-第14章 面向对象06 15. 总结==与equals().avi

    java中equals和==的区别.doc

    equals 运算符可以用于比较两个对象的内容是否相同,而不仅仅是比较它们的引用是否相同。 让我们通过一个简单的示例来说明这两者的区别: public class TestString { public static void main(String[] args) { ...

    java中equals和==的区别的剖析.pdf

    当调用 `s2.intern()` 之后,`s2` 将指向池中已有的或新创建的 "Monday" 字符串,如果池中不存在,则添加一个。因此,`s1 == s2` 又会返回 `true`,同时 `s1.equals(s2)` 也返回 `true`。 为了提高代码的效率和...

    java中equals和==的区别文.pdf

    在Java编程语言中,`equals()` 和 `==` 是两种常用的比较操作,它们在处理不同数据类型时有着明显的区别。本文将深入探讨这两个操作符在Java中的行为,特别是在处理值类型和引用类型时的不同。 首先,值类型如整型...

    C#程序设计-3期(KC008) KC008110100003-错误的认为==和Equals作用相同.docx

    在C#编程语言中,`==`运算符和`Equals`方法经常被用来比较对象的相等性,但它们在工作原理和使用场景上存在显著差异。错误地将两者混为一谈可能导致程序逻辑出错,因此理解它们的区别至关重要。 首先,`Equals`方法...

    java中equals和==的区别

    显然,当 equals 为 true 时,== 不一定为 true。 在 Java 中,String 是一个特殊的引用类型。String 中的 equals 和 == 还有更多的细节。下面是一个简单的示例程序: public class TestString { public static ...

    java中equals和==的比较文.pdf

    对于`String`类,`equals()`方法按照内容进行比较,如果两个`String`对象包含的字符序列相同,`equals()`返回`true`。`==`在`String`类中用来比较两个`String`对象是否指向内存中的同一个实例。因此,如果两个`...

    与==的区别.docxequal与==的区别.docx

    例如,在String类中,`equals()`比较的是两个字符串对象的内容是否相同,而不仅仅是它们的引用。 ```java String str1 = new String("abc"); String str2 = new String("abc"); ``` 在这里,`str1`和`str2`虽然是两...

    java中equals和==的区别.docx

    然而,许多开发者不知道它们之间的区别,或者误用它们,导致程序出错。下面我们将详细解释 equals 和 == 的区别,并通过实例代码来加深理解。 equals 操作符 equals 操作符是用于比较两个对象的内容是否相同的。它...

    javahashcode()和equals()和==的介绍和区别.pdf

    1. 如果`hashCode()`返回的值不同,那么两个对象被认为是不相等的,因为它们不会映射到同一个哈希桶,从而减少了比较`equals()`的需要。 2. 如果`hashCode()`返回的值相同,那么需要进一步使用`equals()`进行比较。...

    java中equals和==的区别.

    2. 在`String`类中,`equals()`方法已经被重写,用于比较两个字符串对象的内容是否相等,不考虑它们的引用。这意味着即使两个`String`对象在内存中位于不同的位置,只要它们包含相同的字符序列,`equals()`也会返回`...

    java中equals和==的区别.pdf

    Java中equals和==的区别 Java是一门面向对象的编程语言,它提供了多种运算符和...但要注意的是,对于所有对象的比较,即使使用equals方法,仍然需要确保两个对象引用不为null,以避免发生NullPointerException异常。

    Java中的==和equals区别

    ### Java中的`==`与`equals`方法的区别详解 在Java编程中,比较对象的相等性是一个常见的需求,但很多初学者对于`==`运算符与`equals`方法的区别容易混淆。本文将深入探讨两者之间的差异,以及它们在不同场景下的...

    ==和equals的区别

    System.out.println("对象 str1 和对象 str2 不是同一对象,他们的内存地址不相同"); } } } ``` 在上面的例子中,==比较的是 str1 和 str2 对象的内存地址,结果是 false。 equals 的理解 equals 是一个方法,...

    java中equals和==的比较.pdf

    在Java编程语言中,`equals()` 和 `==` 都用于比较对象,但它们的用法和含义有所不同。本文将详细解析这两个操作符在Java中的区别,并通过具体的例子进行阐述。 1. `==` 操作符: `==` 在Java中主要用来比较基本...

    java 资料 equals 与== 的区别

    对于基本数据类型,equals 方法不能用于比较,因为基本数据类型没有 equals 方法。 对于引用数据类型,equals 方法比较的是对象的值,而不是内存地址。如果两个对象的值相等,那么 equals 方法将返回 true,否则...

Global site tag (gtag.js) - Google Analytics