一:equals与==的区别

(1)基本数据类型

  byte,short,char,int,long,float,double,boolean

  此类数据类型的比较需要使用==,此时比较的是他们的值,若相等,则返回true,若不同,则返回false;

  注:

  Integer a =1000;

  Integer b=1000;

  if (a==b)....

  此时返回为false,因为Integer表示的不是基本数据类型,而是基本类型Int所对应的类,所以此时==比较的是对象是否指向同一个存储区域。

(2) 类

  Object类中的equals方法检测的是一个对象是否等于另一个对象,或者判断两个对象是否引用了同一个对象;

  当对两个对象使用==进行比较时,比较的是他们在内存中的存放地址,所以只有同一个new出来的对象的两个对象变量比较时,才会返回true,否则比较的结果即为false。

public class EqualsTest
{
public static void main(String[] args)
{
Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee alice2 = alice1;
Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1); System.out.println("alice1 == alice2: " + (alice1 == alice2)); System.out.println("alice1 == alice3: " + (alice1 == alice3)); System.out.println("alice1.equals(alice3): " + alice1.equals(alice3)); System.out.println("alice1.equals(bob): " + alice1.equals(bob));

  }
  //代码来自CoreJava

编译结果是:

alice1 == alice2: true//alice1和alice2是同一个new出来的两个对象,所以返回true

alice1 == alice3: false//虽然alice1和alice3的对象中的参数相同,但内存中的存放地址不同,所以使用==判断结果为false

alice1.equals(alice3): true
alice1.equals(bob): false

    Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
boss.setBonus(5000);
System.out.println("carl.equals(boss): " + carl.equals(boss));

编译结果:

carl.equals(boss): false

  其中Manager是Employee的子类,因此Manager对象比较,首先调用超类的equals方法,如果检测失败,对象就不可能相等,在此代码中,carl和boss在超类中的域都相等,因此需要比较子类中的实例域,由于boss.setBonus(5000);的存在,因此实例域不同,所以输出false。

附:CoreJava中推荐的完美equals方法建议:

1.显式参数命名的otherObject,需要将它转换成另一个叫做other的变量。

2.检测this与otherObject是否引用同一个对象。

    if(this==otherObject)return ture

3.检测otherObject是否为空,如果为空,则返回false。这个很有必要。

4.比较this与otherObject是否属于同一个类,如果equals的语义在每个子类中有所改变,就使用getClass进行检测。

    if(getClass!=otherObject。getClass())return false。如果所有的子类都拥有统一的语义,就使用instanceof检测。

5.将otherObject转换为相应的类类型变量。

6.使用==比较基本类型域,使用quals比较对象域。如果所有的域都匹配,就返回true,否则返回false。如果在子类中重新定义了equals,就要在其中包含调用super.equals(other)。

Java中相等测试的更多相关文章

  1. 使用 Visual Studio Team Test 进行单元测试和java中的测试

    C#中test测试地 方法一. 1.从NUnit官网(http://www.nunit.org/index.php)下载最新版本NUnit,当前版本为NUnit2.5.8. 2.安装后,在VS2008 ...

  2. java中如何测试一段代码的运行时间

    一.以毫秒为单位.long startTime = System.currentTimeMillis(); //获取开始时间 doSomething(); //测试的代码段 long endTime ...

  3. Java中简单测试FastDFS的文件上传

    pom.xml文件内容如下: <dependencies> <!-- fastdfs --> <dependency> <groupId>org.cso ...

  4. Java中测试对象的等价性

    Java中用于测试对象的等价性有三个操作符:== , != 和 Equals() 对于基本类型即int,boolean, byte 等等来说,==和 != 比较的是 基本类型的内容,这和c.c++是一 ...

  5. 关于java中的编码问题

    ok,今天搞了一天都在探索java字符的编码问题.十分头疼.最后终于得出几点: 1.网上有很多博客说判断一个String的编码的方法是通过如下代码;但其实这个代码完全是错的,用一种编码decode后, ...

  6. JAVA中的CountDownLatch、CyclicBarrier、Semaphore的简单测试

    因公司需要做一个对于CountDownLatch的分享,特写了此blog. 具体细节可以参见:小结java自带的跟锁相关的一些类 在做这个分享的过程中发现了Main和junit的运行的区别,在另外一个 ...

  7. java中如何使用Junit测试

    java中如何使用Junit测试 一.总结 一句话总结:a.单元测试的测试代码在test文件夹下,和源码不在同一个文件夹下 b.测试的类方法都以test开头,后面接要测试的类或者方法的名字 1.JUn ...

  8. Java 中静态代码块初始化问题测试

    Java 中静态代码块初始化问题测试 原创 情况一:变量是 static final 修饰的"编译期常量",如 public static final String a = &qu ...

  9. 关于Java中的HashMap的深浅拷贝的测试与几点思考

    0.前言 工作忙起来后,许久不看算法,竟然DFA敏感词算法都要看好一阵才能理解...真是和三阶魔方还原手法一样,田园将芜,非常可惜啊. 在DFA算法中,第一步是需要理解它的数据结构,在此基础上,涉及到 ...

随机推荐

  1. java面试题之ssh

    1.写出你熟悉的开源框架以及各自的作用(项目中为什么使用SSH) 答:框架:hibernate,spring,struts1/struts2. Hibernate主要用于数据持久化:封装了JDBC操作 ...

  2. namenode 无法启动之每次开机需要重新格式化-tmp

    最近遇到了一个问题,执行start-all.sh的时候发现JPS一下namenode没有启动        每次开机都得重新格式化一下namenode才可以        其实问题就出在tmp文件,默 ...

  3. [Unity3D]调用Android接口

    简介 有一些手机功能,Unity没有提供相应的接口,例如震动,例如不锁屏,例如GPS,例如... 有太多的特殊功能Unity都没有提供接口,这时候,我们就需要通过使用Android原生的ADT编辑器去 ...

  4. Form表单的操作

    form对象 <form name=“form1” action=“login.php” method=“post”></form> form对象的属性 name:表单名称 m ...

  5. 3D中的切线空间简介

    转自:http://www.cnblogs.com/cxrs/archive/2009/10/25/1589515.html 1. 什么是Tangent space? Tangent space和wo ...

  6. mysql 批量创建表,利用存储过程

    最近根据需求,需要提前创建一批日志表,以日期结尾,每天创建一张,例如XXX20160530,请参考如下: BEGIN    DECLARE `sName` VARCHAR(128);   DECLAR ...

  7. Bayeux

    Bayeux是一种用来在客户端和服务器端传输低延迟的异步消息(主要通过http)的一种协议.它定义的消息通过命名通道进行路由并且能够进行交互传 送:server -> client, clien ...

  8. Ubuntu系统启用Apache Mod_rewrite模块

    在终端中执行 sudo a2enmod rewrite 指令后,即启用了 Mod_rewrite 模块. 另外,也可以通过将 /etc/apache2/mods-available/rewrite.l ...

  9. PHP版本区别

  10. # 20145210 《Java程序设计》第06周学习总结

    教材学习内容总结 第十章 输入\输出 10.1 InputStream与OutputStream •串流设计的概念 •java将输入\输出抽象化为串流,数据有来源及目的地,衔接两者的是串流对象 •从应 ...