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

原创 2007年09月19日 14:39:00
 
 
如果我们对预定义类型使用==或者!=,就是值比较;如果我们对自定义类型的两个变量(引用)使用==或者!=,就是引用比较,也就是只比较内存地址。
我们也可以调用自定义类型的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++>>
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java中两个对象的比较 equals()方法和==号的区别

在Java中,时不时我们会把两个对象进行,然而得到的结果却不是我们想的结果,这是怎么回事呢? 一、两种形式的比较:比较时,我们要弄清楚是哪一种比较。       1.值类型比较       即内容...

CollectionUtils.isNotEmpty

项目中引用的明明是commons.collections-3.2.1.jar (3.2版的),但服务器启动后,调用CollectionUtils.isNotEmpty 方法时, 却总是报 NoS...

常见对象_常见对象_Object类的equals()方法

package cn.itcast_03; public class Student { private String name; private int age; public Stude...

关于java String的“==”和equals()比较、引用的小问题

这是一个老生常谈的问题了,不过我最近才仔细看。 一点体会,笔而记之。   先看这几句代码   [java] view plaincopyprint? ...

java中基本概念引用及和C语言中指针比较

第一点:什么是引用类型       引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。       在java里面除去基本数据类型的其它类型都...

JAVA之equals对于引用类型比较的方式不同呢

因为equals这个方法是Object,所以我们首先查看一下Object对与此方法的解释: Objec类equals方法(源码): public boolean equals(Object o...
  • mmd0308
  • mmd0308
  • 2017年06月16日 16:33
  • 102

关于java String的“==”和equals()比较、引用的小问题

这是一个老生常谈的问题了,不过我最近才仔细看。 一点体会,笔而记之。   先看这几句代码   [java] view plaincopyprint? ...

java中的String 类型易错点总结(相等比较和传值问题)

---------------------- android培训、java培训、期待与您交流! ---------------------- 毕老师视频看了一个月了,发现前面的东西很容易忘记。Jav...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:值比较和引用比较在java中的运用
举报原因:
原因补充:

(最多只允许输入30个字)