`
L.G.Alexander
  • 浏览: 157936 次
  • 性别: 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面试题,10万字208道Java经典面试题总结(附答案)

    2. ==和equals的区别: ==用于比较基本类型变量的值,对于引用类型,它比较的是两个引用是否指向同一个对象。而equals方法默认行为与==类似,但可以通过重写来比较对象的内容,例如在自定义类中比较对象属性。 3. ...

    Java最常见的面试题208道.docx

    2. ==和equals(): `==`比较基本数据类型的值,对象引用时比较内存地址;equals()是对象的方法,用于比较对象内容。 3. hashcode()和equals():当两个对象equals()返回true时,hashcode()通常也应该相同,以满足哈希...

    Java面试题含答案.doc

    十四、Integer 和 int 的区别 14. Integer 与 int 的区别。 答案:Integer是对象,int是基本类型。 十五、Math 方法 15. Math.round(11.5) 等 於 多 少 ? Math.round(-11.5)等於多少? 答案:Math.round(11.5)=...

    java程序员面试整理3(1).pdf

    十四、hashCode() 和 equals() 方法 hashCode() 和 equals() 方法都是用于比较两个对象是否相等的,但它们有所不同。hashCode() 方法返回一个对象的哈希码,而 equals() 方法比较两个对象的实际值是否相等。 十五...

    Java精选面试题.pdf

    2. ==和equals的区别 * 对于基本类型,==比较的是值是否相同。 * 对于引用类型,==比较的是引用是否相同。 代码示例: ```java String x = "string"; String y = "string"; String z = new String("string"); ...

    java笔记字符串的应用

    Java 字符串应用笔记涵盖了 equals 和 == 的区别、字符串相关函数的使用、String 和 StringBuffer 的使用、StringBuffer 的 capacity 属性和命令行参数的使用等知识点。这些知识点是 Java 开发的基础,理解这些知识...

    java面试题

    #### 四、`==` 和 `equals` 方法的区别 - **`==` 操作符**: 专门用来比较两个变量的值是否相等,即比较变量所对应的内存中存储的数值是否相同。它适用于比较基本类型的数据或引用变量是否相等。 - **`equals` 方法...

    java语言程序设计课后习题答案借鉴.pdf

    总结来说,Java中比较字符串时需注意"=="与"equals()"的区别,而提取整数的每一位数字可以采用多种方法,具体选择取决于需求,如已知整数值或需要用户输入。在实际编程中,根据具体情况选择合适的方法至关重要。

    java程序员滴宝典

    #### 十四、Request对象的主要方法 **知识点:Request对象的主要方法。** 1. `setAttribute(String name, Object value)`:设置名字为`name`的`request`的参数值。 2. `getAttribute(String name)`:返回由`name`...

    Java经典问题答案(带书签)

    - ==与equals的区别:==是比较操作数的内存地址,而equals是比较操作数的内容。 - 堆内存与栈内存的区别:堆内存用于存储对象实例,而栈内存用于存储局部变量和方法调用。 - 变量不赋值与赋null的区别:未初始化的...

    Java第一阶段和第二阶段的面试题,笔试题

    #### == 和 equals 的区别 1. **== 运算符**: - 比较基本数据类型时,比较的是值是否相等。 - 比较引用数据类型时,比较的是它们指向的内存地址是否相同。 2. **equals 方法**: - 用于比较引用数据类型,比较...

    宝典2023版,java最新的学习资料

    **十四、访问修饰符的作用域** - **问题:** 请说出作用域`public`、`private`、`protected`以及不写时的区别。 - **解答:** `public`表示可以在任何地方被访问;`private`表示只能在当前类中被访问;`protected`...

    java面试刷题必备163章

    #### 三十四、`String`与`StringBuffer`的区别 34. **`String`与`StringBuffer`**: - `String`:不可变,适用于少量的字符串操作。 - `StringBuffer`:可变,适用于大量的字符串操作,并且线程安全。 #### 三十...

    变态级JAVA程序员面试32问

     第十四,数组有没有length()这个方法? String有没有length()这个方法?  第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?  第十六,Set里的元素是不能重复的,那么用什么...

    Java笔试题(完整最新版)

    #### 十四、接口与抽象类的区别 - **知识点概述**: - 抽象类可以有构造方法,接口中不能有构造方法。 - 抽象类中可以有普通成员变量,接口中没有普通成员变量。 - 接口中的方法默认是公共抽象的,而抽象类中的...

    Java面试.doc

    **十四、数据库** 深入理解MySQL,包括索引、事务、存储引擎等,并熟悉NoSQL数据库如MongoDB。 **十五、缓存** Redis的使用,如缓存策略、数据结构和操作命令。 **十六、JVM** 了解JVM内存模型,垃圾回收机制,...

    JAVA程序员面试常见JAVA基础知识

    #### 十四、常见的运行时异常 - **ArithmeticException**: 算术异常,如除以零。 - **ArrayStoreException**: 数组存储异常,试图向数组中存放不兼容类型的对象。 - **ClassCastException**: 类型转换异常,强制...

    2011版java复习.doc

    - **问题**: `"=="`和`equals`方法究竟有什么区别? - **解答**: - `==`: 检查两个变量或实例指向的是不是同一个对象。 - `equals`: 用来比较两个对象的值是否相等。 #### 十二、静态变量与实例变量 - **问题**...

    2021-2022计算机二级等级考试试题及答案No.10059.docx

    3. Set集合与equals()和==的区别:在Java中,Set集合确保元素不重复。判断元素是否重复主要通过`equals()`方法,而非`==`。`equals()`方法用于比较对象的内容是否相等,而`==`则比较对象的引用是否指向同一内存位置...

    个人心血吊打面试官 nb

    **三、`==`和`equals()`的区别** - **`==`**:比较的是两个变量所指向的对象的内存地址是否相同。 - **`equals()`**:比较的是两个对象的内容是否相同。默认情况下,`equals()`方法的行为与`==`相同,但在某些类中...

Global site tag (gtag.js) - Google Analytics