equals()方法和"=="区别

对于重写equals()方法时,要符合5个原则
1,自反性:对于任何非空引用x,x.equals(x)应该返回true。
2,对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)应当也返回true。
3,传递性:对于任何引用x,y和z,如果x.equals(y),返回true,那么y.equals(x)也应当返回true。
4,一致性,如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)也应当返回true.
5,非空性,对于任意非空引用x,x.equals(null),应该返回false。

在重写equals()方法时,我们先说一下equals方法和 == 号的区别,
== 比较的是地址值,也就是引用是否指向同一地址,(堆上的对象),这在重写equals方法时,特别需要用到的
另外,getClas()函数的用法,获取的是实例的类型类,用类型类来表示一个类型,所有的类型类都是Class类的实例。
例如 A a = new A(); 则,a.getClass() 和 A.Class 是相等的
类型类是一一对应的,父类的类型类和子类的类型是不同的,
例如A是B的子类 则,a.getClass() 和 B.Class() 是不相等的

重写Java代码

Public User{
private String name;
private int age;
//底下是get()和set()方法
}
Public boolean equals(Object obj){
if(this == obj ){// 用 == 做比较,比较是否是两个引用指向同一对象
return true;// 则返回true第一原则
}           
if(null == obj){                    // 为null ,直接返回false
return false;                   //  第五原则
}
if(this.getClass() != obj.getClass()){          //如果不是同一类型则直接返回false
return false;                       
}
User user = (User)obj;
if(this.name.equals(user.name)&&this.age==user.age){
return true;
}
return false;
}

上面的name为什么用equals()方法?
当用equals()函数比较八大包装对象以及String对象时,默认比较的是值
就这样重写了equals()方法。


再来说一说,八大包装类型当中,用equals()和”==”的区别
在八大包装类型中
Byte
Short
Integer
Long
Float
Double
Character
Boolean
用 “==” 号比较时 会自动拆箱再进行比较
(注:包装类型就是引用类型,所以不同的封装类型引用”==”会报错)
但是例如两个Integer类型进行比较时,如果值在(-128~127)返回true,否则返回false
这与Integer.valueOf()的缓冲对象有关
另外格外需要注意的是new出来的包装类型,即使值相同也为false
因为,八大包装类型中,例如

    Integer i = 2;
    Float f = 3f;
    Double d = 4.00;

直接定义的还是在栈内存中,所以数值只有一个,但是new出来的对象,则就存在于堆上了,地址不相同,”==”号返回false;
例如

Integer ai = new Integer(2);
Integer ar = 2;
System.out.println(i==ai);
System.out.println(i==ar);

返回结果

false
true

对于equals(),如果是两个基本型的封装类型,会先比较类型,再比较值
如果参数是基本类型,会先进行装箱再进行以上比较
例如

        System.out.println(i.equals(ai));
        System.out.println(i.equals(2));   //会先装箱再比较值

返回结果为:

true
true

不同的基本数据类型,直接返回false

        System.out.println(i.equals(d));
        System.out.println(i.equals(2.0));
false
false

“==”如果是基本类型之间进行比较,例如

long l = 42;
float f = 42.0f;
System.out.println(l==f);

结果返回

true

因为基本类型之间的比较,会将低精度类型自动转为高精度类型再比较。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值