一 概念简介
1 ==和equals比较运算符:==要求两个引用变量指向同一对象时才返回true,equals方法则允许用户提供自定义的相等规则。
2 object类提供的equals方法判断两个对象相等的标准与==完全相同。因此开发者通常需要重写equals方法。
二 ==号比较应用
1 代码示例
public class EqualTest { public static void main(String[] args) { int it = 65; float fl = 65.0f; // 将输出true System.out.println("65和65.0f是否相等?" + (it == fl)); char ch = 'A'; // 将输出true System.out.println("65和'A'是否相等?" + (it == ch)); String str1 = new String("hello"); String str2 = new String("hello"); // 将输出false System.out.println("str1和str2是否相等?" + (str1 == str2)); // 将输出true System.out.println("str1是否equals str2?" + (str1.equals(str2))); // 由于java.lang.String与EqualTest类没有继承关系, // 所以下面语句导致编译错误 // System.out.println("hello" == new EqualTest()); } }
2 运行结果
65和65.0f是否相等?true
65和'A'是否相等?true
str1和str2是否相等?false
str1是否equals str2?true
3 结果分析
如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就将返回true。
如果是两个引用类型变量,只有它们指向对一对象时,==判断才会返回true。
三 字符串的==号比较
1 代码示例
public class StringCompareTest { public static void main(String[] args) { // s1直接引用常量池中的"黑客攻击" String s1 = "黑客攻击"; String s2 = "黑客"; String s3 = "攻击"; // s4后面的字符串值可以在编译时就确定下来 // s4直接引用常量池中的"黑客攻击" String s4 = "黑客" + "攻击"; // s5后面的字符串值可以在编译时就确定下来 // s5直接引用常量池中的"黑客攻击" String s5 = "黑" + "客" + "攻击"; // s6后面的字符串值不能在编译时就确定下来, // 不能引用常量池中的字符串 String s6 = s2 + s3; // 使用new调用构造器将会创建一个新的String对象, // s7引用堆内存中新创建的String对象 String s7 = new String("黑客攻击"); System.out.println(s1 == s4); // 输出true System.out.println(s1 == s5); // 输出true System.out.println(s1 == s6); // 输出false System.out.println(s1 == s7); // 输出false } }
2 运行结果
true
true
false
false
3 结果分析
JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本,例子中s1,s4,s5所引用的字符串可以在编译期确定下来,因此它们都引用常量池中的同一字符串对象。
使用new String()创建的字符串是在运行时创建出来的,它保存在运行时内存区,不会放入常量池中。
四 equals方法错误应用
1 代码示例
class Person { // 重写equals()方法,提供自定义的相等标准 public boolean equals(Object obj) { // 不加判断,总是返回true,即Person对象与任何对象都相等 return true; } } // 定义一个Dog空类 class Dog{} public class OverrideEqualsError { public static void main(String[] args) { Person p = new Person(); System.out.println("Person对象是否equals Dog对象?" + p.equals(new Dog())); System.out.println("Person对象是否equals String对象?" + p.equals(new String("Hello"))); } }
2 运行结果
Person对象是否equals Dog对象?true
Person对象是否equals String对象?true
3 结果分析
造成这种荒唐结果的原困是重写Person类的equaIs方法时没有任何判断,无条件返回true。
五 equals方法正确应用
1 代码示例
class Person { private String name; private String idStr; public Person(){} public Person(String name , String idStr) { this.name = name; this.idStr = idStr; } // 此处省略name和idStr的setter和getter方法。 // name的setter和getter方法 public void setName(String name) { this.name = name; } public String getName() { return this.name; } // idStr的setter和getter方法 public void setIdStr(String idStr) { this.idStr = idStr; } public String getIdStr() { return this.idStr; } // 重写equals()方法,提供自定义的相等标准 public boolean equals(Object obj) { // 如果两个对象为同一个对象 if (this == obj) return true; // 只有当obj是Person对象 if (obj != null && obj.getClass() == Person.class) { Person personObj = (Person)obj; // 并且当前对象的idStr与obj对象的idStr相等才可判断两个对象相等 if (this.getIdStr().equals(personObj.getIdStr())) { return true; } } return false; } } public class OverrideEqualsRight { public static void main(String[] args) { Person p1 = new Person("孙猴子" , "12343433433"); Person p2 = new Person("孙行者" , "12343433433"); Person p3 = new Person("局八戒" , "99933433"); // p1和p2的idStr相等,所以输出true System.out.println("p1和p2是否相等?" + p1.equals(p2)); // p2和p3的idStr不相等,所以输出false System.out.println("p2和p3是否相等?" + p2.equals(p3)); } }
2 运行结果
p1和p2是否相等?true
p2和p3是否相等?false
3 结果分析
通常而言,正确重写equals方法应满足:自反性,对称性,传递性,一致性,对于任何不是null的x,x.equals(null)一定返回faIse。
相关推荐
详细介绍和讲解Java中的==和equals区别
能够加强对java中equals与==区别的理解。
java中比较值大小,==和equals的区别,基本数据类型和引用数据类型比较值方法
对于开发的程序员小伙伴,大家肯定对于==和equals不陌生,而且会经常用到他,那么又有几个能够说清楚了==和equals是怎么回事呢?他了呢两个有什么区别呢? 比较 == 比较的是栈中的值,基本数据类型是变量值,引用...
java中equals和==的区别.doc java中equals和==的区别.doc
Java中的==与equals()实例方法Java中测试两个变量是否相等的方法有两个,一个是用==运算符,另一个就是object类提供的equals()方法。2
关于Java中==的用法与equals的用法,醉重要的是比较它们的不同之处
简单介绍java中的“==”和equals
主要介绍了Java中==与equals的区别小结,本文总结结论:== 与 equals()比较的内容是不同的,equals()方式是String类中的方法,它用于比较两个对象引用所指的内容是否相等,而 == 比较的是两个对象引用的地址是否相等,...
==和equals方法究竟有什么区别? == 操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。 ...
主要介绍了java 中equals和==的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了java基础之 “==”与“equals”区别详解,需要的朋友可以参考下
【Java面试题】equals与==的区别
主要介绍了Java中==运算符与equals方法的区别及intern方法详解的相关资料,需要的朋友可以参考下
Java解惑系列之一--equals和==之间究竟有什么区别 稍微学过一些java的同学都可能在网络上看到这样的一道题: 在java语言当中,equals和==之间究竟有什么区别? 而这道题的答案也是千篇一律: equals是用来比较对象...
Java面试题07.==和equals的区别.mp4
用此blog记录我学习的过程,文中若有不恰当的地方,还望友情指出互相学习。 一、== 主要有两种比较形式 基本数据类型(也称原始数据类型):byte,...Java中所有的类都继承自Object类,equals()方法就在Object类中被
主要介绍了java==运算符和equals()方法的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
下面小编就为大家带来一篇Java中==符号与equals()的使用详解(测试两个变量是否相等)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧