- 浏览: 87475 次
- 性别:
- 来自: 广州
最新评论
昨天说了布朗运算,今天详细解释一下其中的==运算符和Object的equals方法。
首先,在说这些之前,我们来补充说明一下JAVA的数据类型。在JAVA里面,有2种数据类型,第一种叫primitive(简单数据类型),另一种是Object.
简单数据类型的特点是:
1)类名是关键字
2)没有包名,没有方法可以访问,不是Object的子类
可以看出,这类数据是常用的数据,而且为了节省空间,它们没有继承Object,去除类多于的方法,节省了内存空间。
常用的简单数据类型包括:
int,long,short,double,float,byte,char,boolean,void
关于其可存储的数值范围大家可以去网上搜索
需要特别说明的是,void只适用于定义函数返回类型,不能用于运算。
为什么会提及简单类型运算呢?因为要说明==运算符和equals方法,会涉及到它们。
我们首先看看以下代码:
相信大家可以马上回答上面的输出结果是true
接下来,我们可以看看JDK1.5的新特性:简单数据类型和对象类型数据的比较:
上面的结果也是true哦,因为jdk1.5很只能的能把基础数据类型转换为对应的对象,然后再进行值比较。
为了更好地让大家了解这个改进,我来演示以下上述的代码在1.4时代要怎么实现:
简单类型在以前一定要先转换为对象才可以和对象比较哦,当然你把对象转换为简单类型比较更加保险。
为什么?因为以下对象之间的比较使用==和equals方法往往是不一样的。
equals方法,是Object的一个public方法,用于对比两个对象之间的值的异同。那它和==比较有什么不同呢?当==用于对象之间的比较时,类似于C的===,比较的是两个对象的hashCode。而这个hashCode是由存储对象的地址位得来的,为了保证每个对象的唯一性。在Object里面我们可以通过hashCode()来查看当前实例的hashCode代码。
来看看Object.equals(Object)代码:
然后它的说明里面已经说明了这个方法是对比两个对象的hashCode返回的值。理论上,每个new出来的Object之间的hashCode是不一样的:
你可以看到这个例子里面,两个hashCode是不一样的。
所以,对于对象值的比较,我们建议大家调用equals方法,并且如果你的类如果涉及到对比运算的话,也最好重写这个方法,实现你的比较逻辑。
让我们最后来看看Integer.equals(Object)方法
所以,如果我们直接用==对比两个Integer类,实际上会去对比两个实例的hashCode,而且调用的不是Integer类本身的hashCode,而是Object父类的hashCode。可以看看下面的两端代码:
首先是Integer的hashCode方法
这个value就是Integer保存的int值,这个理论上来说,会使以下的代码显示true:
但是实际上我们发现了,实际最后的结果是false。而且从第一行和第二行显示的内容可以知道a.hashCode()和new Integer(1).hashCode()都是1。
所以我们就清楚了以下几点:
1)==用于进行简单数据类型之间的比较
2)==用于比较两个对象是否同一实例
3).equals方法用于比较两个对象的值,我们可以根据实际需要重写特定对象的equals()方法以实现同类对象之间的特定比较逻辑。
今天到此为止,明天谈谈类型强转。
首先,在说这些之前,我们来补充说明一下JAVA的数据类型。在JAVA里面,有2种数据类型,第一种叫primitive(简单数据类型),另一种是Object.
简单数据类型的特点是:
1)类名是关键字
2)没有包名,没有方法可以访问,不是Object的子类
可以看出,这类数据是常用的数据,而且为了节省空间,它们没有继承Object,去除类多于的方法,节省了内存空间。
常用的简单数据类型包括:
int,long,short,double,float,byte,char,boolean,void
关于其可存储的数值范围大家可以去网上搜索
需要特别说明的是,void只适用于定义函数返回类型,不能用于运算。
为什么会提及简单类型运算呢?因为要说明==运算符和equals方法,会涉及到它们。
我们首先看看以下代码:
package operator; public class EqualComparation { public static void main(String[] args) { int a=1; int b=1; System.out.println(a == b); } }
相信大家可以马上回答上面的输出结果是true
接下来,我们可以看看JDK1.5的新特性:简单数据类型和对象类型数据的比较:
package operator; public class EqualComparation { public static void main(String[] args) { Integer a=1; int b=1; System.out.println(a == b); } }
上面的结果也是true哦,因为jdk1.5很只能的能把基础数据类型转换为对应的对象,然后再进行值比较。
为了更好地让大家了解这个改进,我来演示以下上述的代码在1.4时代要怎么实现:
package operator; public class EqualComparationForJDK14 { public static void main(String[] args) { Integer a= Integer.valueOf(1); int b=1; System.out.println(a.equals(Integer.valueOf(b))); } }
简单类型在以前一定要先转换为对象才可以和对象比较哦,当然你把对象转换为简单类型比较更加保险。
为什么?因为以下对象之间的比较使用==和equals方法往往是不一样的。
equals方法,是Object的一个public方法,用于对比两个对象之间的值的异同。那它和==比较有什么不同呢?当==用于对象之间的比较时,类似于C的===,比较的是两个对象的hashCode。而这个hashCode是由存储对象的地址位得来的,为了保证每个对象的唯一性。在Object里面我们可以通过hashCode()来查看当前实例的hashCode代码。
来看看Object.equals(Object)代码:
public boolean equals(Object obj) { return (this == obj); }
然后它的说明里面已经说明了这个方法是对比两个对象的hashCode返回的值。理论上,每个new出来的Object之间的hashCode是不一样的:
package object; public class HashCodeDemo { public static void main(String[] args) { Object a = new Object(); Object b = new Object(); System.out.println(a.hashCode()); System.out.println(b.hashCode()); } }
你可以看到这个例子里面,两个hashCode是不一样的。
所以,对于对象值的比较,我们建议大家调用equals方法,并且如果你的类如果涉及到对比运算的话,也最好重写这个方法,实现你的比较逻辑。
让我们最后来看看Integer.equals(Object)方法
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
所以,如果我们直接用==对比两个Integer类,实际上会去对比两个实例的hashCode,而且调用的不是Integer类本身的hashCode,而是Object父类的hashCode。可以看看下面的两端代码:
首先是Integer的hashCode方法
public int hashCode() { return value; }
这个value就是Integer保存的int值,这个理论上来说,会使以下的代码显示true:
Integer a =1; System.out.println(a.hashCode()); System.out.println(new Integer(1).hashCode()); System.out.println(a == new Integer(1));
但是实际上我们发现了,实际最后的结果是false。而且从第一行和第二行显示的内容可以知道a.hashCode()和new Integer(1).hashCode()都是1。
所以我们就清楚了以下几点:
1)==用于进行简单数据类型之间的比较
2)==用于比较两个对象是否同一实例
3).equals方法用于比较两个对象的值,我们可以根据实际需要重写特定对象的equals()方法以实现同类对象之间的特定比较逻辑。
今天到此为止,明天谈谈类型强转。
发表评论
-
JAVA简单教程:数据库操作(三)——PreparedStatement和动态SQL
2010-03-12 12:30 8614如果我们的SQL语句是固 ... -
JAVA简单教程:数据库操作(二)
2010-03-10 11:09 2133今天来分析一下上次的 ... -
JAVA简单教程:数据库操作(一)
2010-03-05 16:40 1866最近依然是事情太多,一直无法坚持每天写份blog,对不起大家。 ... -
每天JAVA简单教学:枚举类
2010-02-02 14:41 1509今天给大家介绍一个JDK1.5的新特性:枚举类 先来看看以下 ... -
每天JAVA简单教学:类定义,成员类,抽象类及接口类
2010-01-27 11:58 1560最近忙得快疯掉了,而且着凉了病得好辛苦。。。不过今天还是能抓紧 ... -
每天JAVA简单教学:类型强转
2010-01-19 11:56 7581关于类型,我们说了不 ... -
每天JAVA简单教学:布朗运算
2010-01-15 14:46 2229布朗值,就是true和false,对于产生这两个值的运算,就是 ... -
每天JAVA简单教学:基本运算符
2010-01-13 18:09 1059今天来介绍一些基础运算符,先用int整数类型做介绍,最后用St ... -
每天简单JAVA教学:循环语法(二)
2010-01-07 10:07 1434自从JRE升级到1.5以后,java的for循环就更加方便了。 ... -
每天简单JAVA教学:循环语法(一)
2010-01-06 13:32 2059现在开始介绍跟变成有密切关系的Java语法,首先来介绍循环的写 ... -
每天简单JAVA教学:super和this
2010-01-05 11:49 1540因为实在太忙这么多天来都没时间上来写东西,感觉非常对不起大家。 ... -
每天简单JAVA教学:变量
2009-12-28 16:02 1226很抱歉,最近事忙,所以很少有时间上来写东西,希望大家见谅。 ... -
每天简单JAVA教学:类继承,重写、重构及重载,final的用法
2009-12-23 12:25 3973昨天事忙,所以没时间给大家写blog,抱歉一下。 今天说的内 ... -
每天简单JAVA教学:JVM的内存管理,static的用法
2009-12-21 14:41 2567今天的主题是介绍static和final这两个指示器的用法。但 ... -
每天简单JAVA教学:Modifier
2009-12-18 10:31 9512昨天给大家介绍了怎么进行同一个类里面的方法调用,今天将会给大家 ... -
每天简单JAVA教学:方法的调用
2009-12-17 14:59 1245继续我们的简单教学。 ... -
每天简单JAVA教学:第一个main程序分析
2009-12-16 23:12 1546上次我们轻松地完成了H ... -
每天简单JAVA教学:Hello World!
2009-12-16 00:39 1507以下文章只适合新手,新是很新很新的新。。。。自认对编程和JAV ...
相关推荐
Java程序设计:2 基本数据类型与基本操作2.ppt
Java程序设计:2 基本数据类型与基本操作1.ppt
Java程序设计:2 基本数据类型与基本操作part3.ppt
适合练手、课程设计、毕业设计的Java项目源码:简易订销管理系统.rar 适合练手、课程设计、毕业设计的Java项目源码:简易订销管理系统.rar 适合练手、课程设计、毕业设计的Java项目源码:简易订销管理系统.rar 适合...
很多编程语言都依赖于特定的计算机类型和对数据类型属性的具体编译实现,比如word和integer数据类型的大小等。另一方面,Java的虚拟机负责定义其内置数据类型的各方面内容。这就意味着不管Java虚拟机(JVM)运行在...
Java数据类型和MySql数据类型对应一览
资源名称:Java编程基础知识变量与数据类型资源目录:【】11957c6aed0bbd30e284837b53bc3a6f【】2.Java编程基础知识变量与数据类型1.数据类型初阶【】2.Java编程基础知识变量与数据类型10.浮点类型【】2.Java编程...
Java数据类型和MySql数据类型对应表
资源:Java数据类型精解 作者:Shenkxiao 版本:1.0 pdf 主要内容: Java数据类型 1.1 基本数据类型 1.2 对象数据类型 1.3 引用数据类型 1.4 数组数据类型 上传理由:基础文档共享,对Java初学者有很大的...
JAva基本的数据类型和基本操作相关源代码打包,像一些标识符、变量、赋值语句和赋值表达式、算术运算符、数值类型转换、字符数据类型及其运算、特殊字符的转义序列表示、字符型char数据与数值型数据之间的转换、从...
掌握Java基本数据类型 掌握直接量的表示 计算机的基本作用就是做运算。运算的数据可以由用户输入、从文件获得。 我们可以把数据进行归类,整数、小数、一串字符、单个字符。 数据类型 例如 课程名称:“高等数学”、...
java入门教程:数据类型_运行时常量池.docx
Java'第一章:基本数据类型
java教学课件:第6章 数据流的运用.ppt
在Java中,基本数据类型是指原始的数据类型,它们是用于存储基本数据值的数据类型。Java的基本数据类型包括以下几种: 整数类型:byte、short、int、long 浮点类型:float、double 字符类型:char 布尔类型:...
JAVA数据类型 关键字 标识符 数据类型强制转换
java入门教程:数据类型_Java理论与实践如何正确使用Volatile变量.docx
java入门教程:数据类型_设置GC新生代区大小.docx
Java中的基本数据类型Java中的基本数据类型Java中的基本数据类型Java中的基本数据类型Java中的基本数据类型Java中的基本数据类型Java中的基本数据类型Java中的基本数据类型Java中的基本数据类型Java中的基本数据类型...