在我们写程序时经常会去比较两个变量是否相等,一般我们有两种方式去比较:equals与==,但是很多情况是不明就里,最后得出错误的结论。本文详解了equals与==。

Java程序中测试两个变量是否的两种方式:一种是利用==另一种是equals方法。当时用 == 来判断两个变量是否相等时,如果两个变量是基本数据类型变量且都是数值类型(不一定要去数据类型完全相同),则只要两个变量的值相等就返回true。但是对于两个引用类型变量,他们必须指向同一个对象时,== 才会返回true。==不可用于比较两个没有父子关系的对象。下面的程序就示范使用 == 来判断两种类型变量是否相等。

public void test2()

{

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类没有继承关系,

//所以下面语句导致编译错误

int a=10;

System.out.println("hello" == a);

}

、65.0f和'A'相等,对于str1和str2,因为他们是引用型变量,他们分别指向两个通过new关键字创建的String对象,因此str1和str2两个变量不想等。

   equals原理解析:

equals方法是Object类提供的实例方法,因此所以引用型变量都可以调用该方法来判断是否与其他变量相等。但是使用这种方法判断两个对象是否相等的标准和使用==是没有区别的。同样要求两个引用变量指向同一个对象才会返回true。

因此这个Object类提供equals方法没有太大的实际意义,如果希望采用自定义的标准则应该重写equals方法,

String类就是重写了改方法,其判断两个字符串相等的标准是只要两个变量的字符序列相同equals方法就返回true。下面代码即其实现原理。

public boolean equals(Object anObject) {

if (this == anObject) {

return true;

}

if (anObject instanceof String) {

String anotherString = (String) anObject;

int n = value.length;

if (n == anotherString.value.length) {

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

while (n-- != 0) {

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

其实用我们自己的方式去重写equals方法,实现让不可能相等的对象相等。

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")));

}

}

上面的例子定义了一个Person类,该类重写了equals方法,并且该方法总是返回true,也就是Person对象和任意引用类型变量进行equals方法都返回true,这就会造成Person对象和Dog对象相等的闹剧。

总结:

  1.基本数据类型: byte,short,char,int,long,float,double,boolean他们之间的比较,应用双等号(==),比较的是他们的值。

    2.引用类型变量:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。

    3.如果没有重写Object中equals方法,那么==与equals没有区别,所以我们在使用自定义类时,需要去重写equals方法。(java.lang.String类已重写了该方法,所以String的equals比较的是两个字符串的字符序列,当字符序列相同是返回true,否则返回false。

   希望通过上面Person类对象和Dog类对象相等的闹剧帮助大家去学习equals与==的区别。

六、Java基础---------equals 与 ==深入讲解的更多相关文章

  1. java基础—equals方法

    一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public s ...

  2. java基础(二)--main方法讲解

    main()函数是如下的固定格式,除了args可以修改名字,其余均不可以修改 public class TestBase02MainMath { public static void main(Str ...

  3. Java基础学习笔记六 Java基础语法之类和ArrayList

    引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner ...

  4. java基础01-03-注释、标识符、数据类型讲解

    java基础01-注释 java中的注释有三种: 单行注释 多行注释 文件注释 public class helloworld { public static void main(String[] a ...

  5. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  6. Java基础知识陷阱系列

    Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...

  7. java基础解析系列(六)---深入注解原理及使用

    java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer ja ...

  8. java基础解析系列(十一)---equals、==和hashcode方法

    java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...

  9. java基础解析系列(六)---注解原理及使用

    java基础解析系列(六)---注解原理及使用 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及 ...

随机推荐

  1. MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedList<T>结果集(转)

    namespace Entity { public interface IPagedList { /// <summary> /// 记录数 /// </summary> in ...

  2. There has been an error processing your request magento

    如果使用magento的过程中,出现以下页面: 说明出现了错误,但是亲,不用紧张,请根据"Error record number:xxxxxxxxx"的数字在网站根目录下的var/ ...

  3. UVA11538 - Chess Queen(数学组合)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  4. JS之toString方法

    1.JS中几乎每个值都有toString方法,null和undefined除外 2.对于字符串形式的值也可以使用toString()方法,返回该字符串的一个副本 3.toString(radix)方法 ...

  5. Hibernate 代码生成器

    Hibernate 代码生成器 点击Hibernate Code Generation 点击以下 创建管理代码生成配置 点击RUN.自动生成

  6. boost.compressed_pair源码剖析

    意义 当compressed_pair的某一个模板参数为一个空类的时候将对其进行“空基类优化”,这样可以使得compressed_pair占用的空间比std::pair的更小. 参考如下代码: #in ...

  7. jenkins+git实现docker持续部署

    jenkins所做的事情很简单,就拿我现在的情况来说吧,(1).每次开发完成,我都会push到我的远程仓库:(2).我再将我push到远程仓库的代码pull到我的测试服务器上:(3).在测试服务器上, ...

  8. 智能生活 科技无限 CTO VOICE 第二期 智能硬件创新创业专场演讲嘉宾招募

    生活不只有诗和远方,还有当下的痛点和需求 当可穿戴设备.虚拟现实.无人机.机器人进入人们视线甚至生活当中 下一个风口就在智能硬件领域上凸显 那么,创业者如何撕掉智能外衣,设计一款有竞争力的智能硬件? ...

  9. 通过ping确定网卡mtu

    使用 ping 测试确定网卡最佳 MTU 的方法 MTU ( Maximum Transmission Unit ,最大传输单元)是指某一层协议上一次能最大传输的数据量.当一个数据包超过 MTU 数据 ...

  10. Linux 创建用户和工作组

    创建用户 useradd user1                            #创建user1用户,创建user1用户同时会创建一个同名的工作组user1 passwd user1   ...