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

标签: javaequalsstringobjectc++文档
2810人阅读 评论(2) 收藏 举报
分类:
 
 
如果我们对预定义类型使用==或者!=,就是值比较;如果我们对自定义类型的两个变量(引用)使用==或者!=,就是引用比较,也就是只比较内存地址。
我们也可以调用自定义类型的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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5142956次
    • 积分:63775
    • 等级:
    • 排名:第29名
    • 原创:1203篇
    • 转载:22篇
    • 译文:1篇
    • 评论:1140条
    文章分类
    最新评论
    算法专家朋友的博客
    清如许的博客