如何测试java中对象的等价性
来源:互联网 发布:网络诈骗手段及防范 编辑:程序博客网 时间:2024/06/06 09:51
我们都知道,基本数据类型的比较我们一般用关系运算符 “==”以及”!=“。当然,这两个运算符也适用于所有对象,然而比较的结果却并不一定与预想的结果相符。
下面看一串代码:
public class Equals { public static void main(String[] args) { Integer a1 = new Integer(12); Integer a2 = new Integer(12); System.out.println(a1==a2); System.out.println(a1!=a2); }}
关系操作符的运算结果是产生一个布尔值,初学java的读者也许会认为,第一个输出的是”true“,第二个输出的是”false“;然而结果却是下面:
大家可能感到惊奇,因为两个Integer a1和a2是一样的对象,那么它的内容也是相同的,可为什么输出的先是”false”,最后才是“true”,其实道理很简单,尽管两个对象的内容相同,然而它们对象的引用却是不同的,而“==”与“!=”比较的就是对象的引用。那么问题来了,我们改如何比较对象的内容呢?java类库中提供了一个equals()函数,就是用来比较对象的实际内容。
当我们把最后的输出代码改成:System.out.println(a1.equals(a2));它的运行结果则是:“true”,这就和我们预想的一样了。
然而事情并不是我们想象的那么简单,假如你创建了自己的类,就像下面一样:
class Value{ int i;}public class Equals { public static void main(String[] args) { Value a1 = new Value(); Value a2 = new Value(); a1.i=a2.i=100; System.out.println(a1.equals(a2)); }}
我们看看运行结果:
结果又是false。这就令人奇怪了。不是说好的equals()比较的是对象的内容吗?我想大家都知道,Java中所有的类都是继承于Object这个基类的,而Object基类中定义了一个equals()方法,默认的行为是比较对象的引用,也可以说是比较对象的内存地址,但在一些类库中,它们本身自定义了一个equals()函数,比如String,Integer,Date中,自定义的equals()函数比较的是对象的内容,而不再是比较类的所生成对象的内存地址了。所以,当我们自己设计了一个类的时候,想要比较对象的内容,只要自己定义一个equals()函数,来覆盖掉从Object类继承的equals()函数。代码如下:
class Value{ int i; public boolean equals(Value a2) { if(this.i==a2.i) return true; else return false; }}public class Equals { public static void main(String[] args) { Value a1 = new Value(); Value a2 = new Value(); a1.i=a2.i=100; System.out.println(a1.equals(a2)); }}
运行结果如下:
很明显,现在自定义的equals()是比较对象的内容的,而且已经成功的覆盖掉从Object继承的equals()函数。所以以后再对象的比较中,要留意我们是要比较对象的内容呢,还是比较对象所存放的内存地址,这样就能避免我们出差错噢。
- 如何测试java中对象的等价性
- 测试对象的等价性
- 测试对象的等价性
- 如何使用== 、!=和equals()来测试对象的等价性
- 测试对象的等价性(Thinking in Java 4th Edition)
- JAVA编程思想(第4版)测试对象的等价性
- 测试对象的等价性(== 与 equals)
- 从Java虚拟机来看Java对象的等价性
- java中的对象等价性讨论
- 测试对象的等价性以及==与equals的区别和用法
- 关系操作符(测试对象的等价性:判断对象的引用相等或对象的实际内容相等)附带源码
- 等价测试
- 代码的等价性
- php和asp对象的等价关系
- php和asp对象的等价关系
- php和asp对象的等价关系
- Objective-C 中对象的等价与同值的区别
- 如何修改地址薄的等价名
- 未闻花名ED《君がくれたもの》原文+罗马音+中文
- Android 学习笔记十三 通过绝对路径得到uri
- Linux目录结构及文件
- Leetcode 121. Best Time to Buy and Sell Stock (Easy) (cpp)
- Android Binder机制(三) ServiceManager守护进程
- 如何测试java中对象的等价性
- mac os下重置mysql密码
- Linux的oops内核调试信息 && Linux Kernel Panic报错解决思路
- Linux命令--dpkg
- PAT乙级练习题B1048. 数字加密
- Leetcode 66. Plus One (Easy) (cpp)
- Java 数组的详解
- linux (ubuntu) 虚拟环境下扩展硬盘空间
- 在线实时大数据平台Storm开发之wordcount