Java中Object类
Object类是Java所有类的超类,在Java中所有类都是由它扩展来的,可以用Object类型的变量来引用(接收)任意类型的对象.但要
想对接收的对象进行具体操作,就需要进行类型转换,将Object类型转换为接收的对象的类型.在Java中只有基本数据类型不是对象,其他类型都扩展于Object.
这里介绍Object类的equals()方法和hashCode()方法
1.equals()方法
equals()是开发中常用的判断的方法之一,与equals()方法常放在一起比较的是==,现在比较的是Object类中的equals()和String类中的equals()方法.源码如下图所示
Object类中equals()方法
String类中的equals()方法
Object类是所有类的超类,它的equals()方法和hashCode()方法是可以被重载的,通过源码可以看出,String类重写了equals()方法和hashCode()方法.
在String类中equals()方法用来判断两个对象的内容是否相等,在Object类中,equals()方法判断的是两个对象是否是相同的引用,如果引用是相等的,那么两个对象也一定相等,对于纯字符串比较来说,直接比较的是两个独立对象内容的值是否相等,也就是String字符串的比较.以下示例说明这一点.
以上是按照个人想法做出的测试,如果有兴趣,可自行尝试多种方式测试.
Java语言规范要求equals方法具有以下特性:
1.自反性:对于任何非空引用x,x.equals(x)应该返回true
2.对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,那么x.equals(y)也应该返回为true
3.传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true
4.一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)方法应该返回同样的结果
5.非null:对于任何非空引用x,x.equals(null)应该返回false
2.hashCode()方法
hash code(散列码),是由对象导出的一个整型值.散列码没有规律,如果x和y是两个不同的对象,x.hashCode()和y.hashCode()
基本不会相同.在此比较的还是String类和Object类的区别.
# Object类的hashCode()方法
# String类的hashCode()方法
Object类中的hashCode()方法是返回的对象在内存中的地址转成的int的值,每个对象都有一个默认的散列码,值为对象的存储
地址String类的hashCode()方法和object类的hashCode方法的区别就是,String类的hashCode()方法覆盖了Object类的
hashCode()方法,构成了重载,String的hashCode()方法是String字符串里面的每个字符的字符值得hashCode的和,只要字符串的内容一样,那么他们的hashCode就会一样,Object是用本地方法得到的内存地址的int值,以下示例可以说明这一点.
程序运行结果,s和t的hash值相同,证明了String类的散列码是由内容导出的,而sh和th的hash值不同,是因为在StringBuffer中没有定义hashCode()方法,所以它的散列码也就是hash值是由Object类的默认的hashCode()方法导出的对象存储的地址.
JDK中对hashCode()方法的作用,以及实现时的注意事项做了一下说明:
(1)hashCode()在hash表中起作用,如:HashMa,HashSet
(2)如果对象在equals()方法中的内容没有改变,那么hashCode()值也始终不变
(3)如果两个对象使用equals()方法判断为相等,那么hashCode()方法也应该相等
(4)如果两个对象使用equals()方法判断为不相等,那么hashCode()方法也必须不相等
hashCode()方法在哈希表中起作用,当我们向哈希表中添加对象object时,会首先调用hashCode()方法计算object的哈希码,通过哈希码直接定位object在哈希表中的位置,如果该位置没有对象,可以直接将object插入,如果有对象(可能有多个,通过链表实现),调用equals()方法比较这些对象的是否跟object对象是否相等,如果相等,不保存object对象,如果不相等,将object对象加入到链表中.这也说明了为什么两个对象使用equals()方法判断为相等,那么hashCode()方法也应该相等,如果两个对象相等,那么在哈希表中只应该出现一次.
以上纯属个人观点,如有不足或错误,欢迎指正
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云PHP Composer全量镜像正式上线!(附下载地址)
今天,阿里云正式上线PHP Composer全量镜像,所有PHP开发者都可以通过我们的开发者社区developer.aliyun.com/composer加速Composer安装器。 这款镜像工具的最大优势是快,几乎实现与PHP Packagist官方实时同步,每隔30秒刷新全国CDN缓存。它基于阿里云的对象存储OSS和CDN研发同步系统,通过任务分发,实现同步的快速和稳定。 为什么要开发这款镜像工具? 这其实来自客户和阿里巴巴集团业务的共同诉求。 阿里云上有数万PHP SDK用户,提高安装成功率必然要求有最快的镜像同步工具。 此外,有近6万企业的开发者活跃在我们的一站式企业协同研发云——云效平台上,通过云效平台构建PHP工程,这同样离不开镜像同步工具。 为什么要开放这款工具的下载? 因为我们也是PHP社区的受益者,希望以此回馈。也希望在广泛PHPer的监督下,打磨更好的工具。 过去一周,我们进行了小范围的开发者公测。 非常高兴的是,在没有任何官方推广的情况下,这款工具单日下载量就超过30万次,不少开发者甚至自发宣传推广。在惊喜、感恩的同时,我们也发现了不少问题,不断进行完善和调整。 ...
- 下一篇
网站漏洞检测 Metinfo 6.2.0上传漏洞详情与修复方案
Metinfo CMS系统被爆出网站存在漏洞,可上传任意文件到网站根目录下,从而使攻击者可以轻易的获取网站的webshell权限,对网站进行篡改与攻击,目前该网站漏洞影响范围是Metinfo 6.2.0最新版本,以及以前的所有Metinfo版本都可以利用,关于该Metinfo漏洞的详情我们来详细的分析:首先该网站漏洞的利用前提是windows系统,PHP语言的版本是小于5.3,相当于旧的服务器都会按照这个环境来配置网站,我们来看下出现漏洞的代码,Metinfo在上传方面写了一个专门的上传功能,非常的强大,使用doupfile进行上传,我们来看下代码,如下图所示:我们从上面的代码中可以看出上传文件有一些模式,还有变量的信息,info这个变量是可以控制的,我们看下upfile跟upload调用的方法是什么作用,追踪分析代码发现这个是用来存储上传文件的路径信息的,这2个变量值会直接将上传的路径给改变,这也是该漏洞产生的原因,我们接着继续分析代码的漏洞,Metinfo在使用doupfile上传的时候回对上传的文件名进行安全过滤,基本的一些脚本文件都已经过滤掉了,只能上传一些图片格式的文件,使用...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Red5直播服务器,属于Java语言的直播服务器
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)