`
huqingyong_eye
  • 浏览: 37639 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

(二)、==和equals的区别

阅读更多
public class Person {   
    String name;   
    public Person(String name){   
        this.name = name;   
    }   
    @Override  
    public boolean equals(Object anObject){   
        //仿照String类的equals方法来写   
        if(this == anObject) return true;   
        if(anObject instanceof Person){   
            Person p = (Person)anObject;   
            if(p.name.equals(this.name))   
                return true;   
        }   
        return false;   
    }   
}   
  
public class Equals==Test {   
    public static void main(String[] args) {   
        String str = new String("abc"); //语句(1)   
        String str2 = new String("abc");//语句(2)   
  
        System.out.println(str == str2);//语句(3)   
        System.out.println(str.equals(str2));//语句(4)   
  
        Object object = new Object();//语句(5)   
        Object object2 = new Object();//语句(6)   
  
        System.out.println(object == object2);//语句(7)   
        System.out.println(object.equals(object2));//语句(8)   
           
        Person p = new Person("zhangsan");//语句(9)   
        Person p2 = new Person("zhangsan");//语句(10)   
           
        System.out.println(p == p2);//语句(11)   
        System.out.println(p.equals(p2));//语句(12)   
    }   
} 

问题1:执行完语句(3)(4)打印的结果是什么?说明理由
解答:执行完语句(3)(4)打印的结果是false和true。
分析:str和str2是引用,它们指向不同的对象,内存地址不同,所以str==str2为false。我们看看String的equals方法的源码,它是对Object的equals方法的重写:
public boolean equals(Object anObject) {   
     if (this == anObject) {    return true;    }   
     if (anObject instanceof String) {   
         String anotherString = (String)anObject;   
         int n = count;   
         if (n == anotherString.count) {   
             char v1[] = value;   
             char v2[] = anotherString.value;   
             int i = offset;   
             int j = anotherString.offset;   
             while (n-- != 0) {   
                 if (v1[i++] != v2[j++]) return false;   
             }   
      return true;   
        }   
    }   
    return false;   

注意:String类把Object类的equals方法重写了,所以它比较的确实是对象的内容。

问题2:执行完语句(7)(8)打印的结果是什么?说明理由。
解答:执行完语句(7)(8)打印的结果是false和false。
分析:object和object2是引用,它们指向不同的对象,内存地址不同,所以object==object2为false。
查看jdk的源代码,我们发现equals方法定义在Object类里面,所以所有类都有这个方法。Object类是这样定义equals方法的:
public boolean equals(Object obj) {return (this == obj); } 

从这里可以看出,Object类里面的equals方法和==是等价的,它比较的也是内存地址。

问题3:执行完语句(11)(12)打印的结果是什么?说明理由。
解答:执行完语句(11)(12)打印的结果是false和false。分析:Person类没有重写Object类的equals方法。

总结:==和equals()方法有什么区别?我们不能笼统的说,equals方法比较的是内容。我们应该说"=="永远比较的是内存地址。对于equals方法,在Object类的层次上来说,它比较的是内存地址,和"=="一样。如果一个子类重写了Object类的equals方法,这个时候这个equals方法才正真比较的是内容。

要求:在自定义类的时候,如果要进行相等性的比较,必须要重写父类的equals方法。怎么重写equals方法,它有固定的模式(要重写hashCode,下次课讲),对于Person类 来说,如果两个Pereson的name相同,它就应该返回true,否则返回false。参见Person类的equals方法。
分享到:
评论

相关推荐

    java中equals和==的区别

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...

    字符串比较之 “==”和 “equals”

    "=="和"equals()"是两种常用的字符串比较方法,但它们之间存在一定的区别和使用场景。这篇博客将深入探讨这两个方法的工作原理以及何时应该使用它们。 首先,"=="运算符在Java中主要用于比较基本类型变量的值,如...

    Java初学者了解"=="与equals的区别

    Java 中的"=="和equals()方法的区别 Java 初学者在学习 Java 语言时,经常会遇到"=="和equals()方法的区别问题。很多初学者可能会混淆这两个概念,导致程序出现错误。因此,本文将详细介绍"=="和equals()方法的区别...

    Java中==符号与equals()的使用详解(测试两个变量是否相等)

    二、使用equals()方法判断两个对象是否相等 equals()方法是Object类提供的一个实例方法,因此所有的引用变量都可以调用该方法来判断是否与其它引用变量相等。但是使用这个方法判断两个对象相等的标准与使用==运算符...

    Java中==与equals的区别

    用此blog记录我学习的过程,文中若有不恰当的地方,还望友情指出互相学习。 一、== 主要有两种比较形式 基本数据类型(也称原始...二、equals()方法 Java中所有的类都继承自Object类,equals()方法就在Object类中被

    浅谈java中==以及equals方法的用法

    本文将详细介绍 Java 中 == 和 equals 方法的用法、区别和应用场景。 一、== 操作符 在 Java 中,== 操作符主要用于比较两个对象的内存地址是否相同,即比较两个对象的引用是否相同。如果两个对象的内存地址相同...

    JAVA中equals和的区别.doc

    ### JAVA中equals与==的区别详解 #### 一、概述 在Java编程语言中,`equals`方法和`==`操作符都是用来比较对象之间是否相等的重要工具。然而,它们在实现这一目标的方式上有着本质的区别。理解这些差异对于正确地...

    equal与==区别

    对于非字符串对象的比较,`==`和`.equals()`也有着明显的区别: ##### `==`操作符 当比较非字符串对象时,`==`仍然比较的是对象的引用是否指向同一个内存地址。除非两个对象是同一个对象实例,否则`==`将返回`false...

    Equals和==的区别 公共变量和属性的区别小结

    在探讨编程语言C#中,有几个需要明确区分的概念:Equals和==运算符的差异,以及公共变量和属性的区别。在C#语言中,进行对象比较时经常会遇到这两个概念,它们在程序设计中扮演着重要的角色。 首先是Equals和==的...

    java中equals和的比较.doc

    在Java编程语言中,`equals`方法和`==`操作符都是用来比较对象之间是否相等的重要工具,但它们之间存在显著的区别。理解这些差异对于编写高效且无误的代码至关重要。 #### 二、基本概念 1. **==(双等号)**: - ...

    Java面试题和解题答案

    二、== 和 equals 的区别是什么? 对于基本类型,==比较的是值; 对于引用类型,==比较的是地址; equals不能用于基本类型的比较; 如果没有重写equals,equals就相当于==; 如果重写了equals方法,equals比较的是...

    equals问题经典

    这里我们将深入探讨`equals()`方法的用法,以及它与`==`的区别,同时解决题目中提出的问题。 **问题一:** 在Java中,`String`类的实例有两种创建方式。一种是直接通过字面量,如`String s1 = "abc";`,这时字符串...

    JAVA编程

    在Java编程过程中,“==”和equals()方法常被用来比较对象或值的相等性,但它们之间存在着本质的区别。 1. **“==”运算符**: - 用于比较基本数据类型(如int、char等)的值是否相等。 - 用于比较引用类型(对象...

    java面经八股文整理

    本文总结了 Java 语言的基础知识,涵盖了 JDK、JRE、JVM 等概念,类和对象的区别、构造方法和普通方法的区别、作用域的四种类型、Integer 与 int 的区别、&和&&的区别、类变量与实例变量的区别、=="和equals的区别等...

    Java 33道面试题及答案.docx

    二、== 和 equals 的区别 == 对于基本类型来说是值比较,对于引用类型来说是比较的是引用。equals 默认情况下是引用比较,只是很多类重新了 equals 方法,把它变成了值比较。 例如,String x ="string";String y =...

    java基础知识面试题

    二、==和 equals 的区别 在 Java 中,== 和 equals 都可以用来比较两个对象是否相等,但它们有着不同的比较方式。 * ==:== 在基本数据类型间的比较是比较值是否相同,用在引用数据类型是比较内存地址是否相同。 *...

    钟煜.doc————电子版_doc版

    文档中的内容主要涉及Java编程语言的一些基础知识,包括`==`与`equals`的区别、Singleton模式的实现、String对象的创建、类型转换以及hashCode和equals的关系。以下是对这些知识点的详细解释: 1. `==`与`equals`的...

    Java初学者都必须理解的问题

    **问题二:“==”和`equals()`方法究竟有什么区别?** 在Java中,`==`操作符用于比较两个变量所指向的对象是否相同,即它们是否指向内存中的同一位置。而`equals()`方法则是用来比较两个对象的内容是否相等。 **...

    java 就业面试题大全

    以上总结了Java面试中常见的几个知识点:`&` 和 `&&` 的区别、`switch` 语句的应用范围、`==` 和 `equals` 方法的区别以及静态变量和实例变量的区别。这些知识点不仅对于面试准备非常重要,也是Java开发人员日常工作...

Global site tag (gtag.js) - Google Analytics