深入Java对象的比较
一、简单类型比较
Java中,比较简单类型变量用“==”,只要两个简单类型值相等即返回ture,否则返回false;
二、引用类型比较
引用类型比较比较变态,可以用“==”,也可以用“equals()”来比较,equals()方法来自于Object类,每个自定义的类都可以重写这个方法。Object类中的equals()方法仅仅通过“==”来比较两个对象是否相等。
在用“==”比较引用类型时,仅当两个应用变量的对象指向同一个对象时,才返回ture。言外之意就是要求两个变量所指内存地址相等的时候,才能返回true,每个对象都有自己的一块内存,因此必须指向同一个对象才返回ture。
在用“equals()”比较引用类型时,情况就比较复杂,甚至有些变态,容易掉进陷阱。
在Java API中,有些类重写了equals()方法,它们的比较规则是:当且仅当该equals方法参数不是
null,两个变量的类型、内容都相同,则比较结果为true。这些类包括:String、Double、Float、Long、Integer、
Short、Byte、、Boolean、BigDecimal、BigInteger等等,太多太多了,但是常见的就这些了,具体可以查看API中类的
equals()方法,就知道了。
解析变态的Boolean类
:在这些类中,最最变态的是要数Boolean类了,我感觉是开发Boolean类的人员头脑进水了。我也不想细说了,你有好四中方式来创建一个Boolean对象(两构造方法,两个静态方法valueOf(),推荐用静态方法)。
Boolean类的变态之处不在于其equals()方法。而是在于Boolean对象创建方法。其实Boolean类的对象最多有两个,其
toString()值分别是true和false。当且仅当用true或者"true"创建的Boolean类为同一个对象且toString()值为
true。其他的字符串或者false创建的Boolean对象的值一律相等且toString()值为false。
三、重写equals()方法
在定义一个类的时候,如果涉及到对象的比较,应该重写equals()方法。重写的一般规则是:
1、先用“==”判断是否相等。
2、判断equals()方法的参数是否为null,如果为null,则返回false;因为当前对象不可能为null,如果为null,则不能调用其equals()方法,否则抛java.lang.NullPointerException异常。
3、当参数不为null,则如果两个对象的运行时类(通过getClass()获取)不相等,返回false,否则继续判断。
4、判断类的成员是否对应相等。往下就随意发挥了。呵呵!
四、总结
“==”比较对象是否引用了同一个对象,或者比较简单类型变量值是否相等。
Object类的equals()方法用来比较是否一个对象(内存地址比较),可以重写。
JDK中有些类重写了equals()方法,只要类型、内容都相同,就认为相等。
很变态的Boolean类,仅存在两个实例。具体可查看API。
一般来说,一个类如果涉及到比较,应该重写equals()方法,因为内存地址比较没有意义。
分享到:
相关推荐
本书内容由浅入深,紧密结合实际,利用大量典型实例,详细讲解Java面向对象的编程思想、编程语法和设计模式,介绍常见Java类库的用法,总结优化 Java编程的各种宝贵经验,深入阐述Java虚拟机执行Java程序的原理。...
《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...
《Java程序设计案例教程》教学课件05深入Java面向对象.pdf《Java程序设计案例教程》教学课件05深入Java面向对象.pdf《Java程序设计案例教程》教学课件05深入Java面向对象.pdf《Java程序设计案例教程》教学课件05深入...
在JAVA平台上开发应用程序的时候,有一个很大的特点就是其是在应用程序运行的时候才建立对象。换句话说,在程序运行的时候,才会最终确定对象的归属,即对象应该存储在什么地方。由于存储在不同的区域,其在性能上会...
深入浅出Java 2面向对象程序设计深入浅出Java 2面向对象程序设计
MLDN魔乐JAVA_09深入引用、this关键字、对象比较.rar
模块5 深入Java面向对象 《Java程序设计案例教程》教学课件05深入Java面向对象全文共47页,当前为第1页。 学习目标 01 了解Java面向对象程序设计的思想原则。 02 掌握类的结构、定义及对象的创建和使用。 03 掌握...
深入探索Java对象的序列化 对象序列化就是把对象写入到输出流中,用来存储或者传输。 对象的反序列化就是从输入流中读取对象。 要序列化的对象应该实现Serializable接口。 Serializable接口是一个标识接口,...
不错的java面向对象文档,对初学者帮助很大,快快下载吧
java深入面向对象编程课件包括java深入面向对象编程试卷,里面有详细的关于java深入面向对象编程的讲解
深入Java关键字null
面向对象经典讲解 深入浅出, 事例深刻,有助于更进一步了解 java 面向对象
第二部分是7-13章,对JVM、Java源代码和字节代码操作、类加载器、对象生命周期、多线程、并发编程、泛型、安全等Java平台的核心技术进行了深入解析,掌握这部分内容有助于深入理解Java的底层原理;第三部分为第14章...
MLDN魔乐JAVA_09深入引用、this关键字、对象比较 corejava
java-深入面向对象程序设计
Java内存分配与管理是Java的核心技术之一,今天我们深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的...
java面向对象编程,深入解析java编程思想,加深你对java编程的了解
面向对象程序设计JAVA 多线程自学教程ppt
Java面向对象经典解析,深入理解面向对象思想,有案例