值比较和引用比较在java中的运用

 
 
如果我们对预定义类型使用==或者!=,就是值比较;如果我们对自定义类型的两个变量(引用)使用==或者!=,就是引用比较,也就是只比较内存地址。
我们也可以调用自定义类型的equals方法进行比较。由于所有的自定义类型都是从Object派生,而Object类已经实现了equals方法,而这种默认的实现实际上就是引用比较,如果我们的自定义类需要提供值比较的语义,就需要重写该函数,并且在文档中说明。因此,我们不能简单理解为equales就是值比较,在某些情况下默认继承而来的引用比较更加符合某些场合的应用。
String类型的equals提供了值比较的语义,比如:
String str1=new String("x");
String str2=new String("x");
System.out.println(str1.equals(str2));
第三行代码将打印出true。因此我们要小心不同的类的equals方法可能语义不一样。
 
因此在设计自己的类的时候,要考虑是否要实现值比较的操作,如果这不是必需的,就无需改写从Object类派生的equals方法。
如果你针对需要实现自己的equals方法,请牢记java.lang.Object的规范:
equals方法实现了等价关系( equivalence relation):
• 自反性(reflexive)。对于任意的引用值x,x . e q u a l s ( x )一定为t r u e。
• 对称性(symmetric)。对于任意的引用值x和y,当且仅当y . e q u a l s ( x )返回t r u e时,x .equals( y)也一定返回true。
• 传递性(transitive)。对于任意的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回t r u e,那么x . e q u a l s (z)也一定返回t r u e。
• 一致性(consistent)。对于任意的引用值x和y,如果用于equals比较的对象信息没有被修改的话,那么,多次调用x .equals(y)要么一致地返回t r u e,要么一致地返回false。
• 对于任意的非空引用值x,x . e q u a l s ( n u l l )一定返回false。
 
       c++中通常使用操作符重载operator=来达到这种效果,但是java认为操作符重载容易出错,所以没有支持这种技术。
 
详细例子可以参见<<Effective C++>>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值