当前位置: 首页 > news >正文

安吉网站开发nginx wordpress 配置

安吉网站开发,nginx wordpress 配置,微信小程序源代码,做网站买空间多少钱equals()和hashCode()区别#xff1f; equals()#xff1a;反映的是对象或变量具体的值#xff0c;即两个对象里面包含的值--可能是对象的引用#xff0c;也可能是值类型的值。 hashCode()#xff1a;计算出对象实例的哈希码#xff0c;并返回哈希码#xff0c;又称为…equals()和hashCode()区别 equals()反映的是对象或变量具体的值即两个对象里面包含的值--可能是对象的引用也可能是值类型的值。 hashCode()计算出对象实例的哈希码并返回哈希码又称为散列函数。根类Object的hashCode()方法的计算依赖于对象实例的D内存地址故每个Object对象的hashCode都是唯一的当然当对象所对应的类重写了hashCode()方法时结果就截然不同了。 之所以有hashCode方法是因为在批量的对象比较中hashCode要比equals来得快很多集合都用到了hashCode比如HashTable。 两个obj如果equals()相等hashCode()一定相等。 两个obj如果hashCode()相等equals()不一定相等Hash散列值有冲突的情况虽然概率很低。 所以 可以考虑在集合中判断两个对象是否相等的规则是 第一步如果hashCode()相等则查看第二步否则不相等; 第二步查看equals()是否相等如果相等则两obj相等否则还是不相等。 1、首先equals()和hashcode()这两个方法都是从object类中继承过来的。 equals()是对两个对象的地址值进行的比较即比较引用是否相同。 hashCode()是一个本地方法它的实现是根据本地机器相关的。 2、Java语言对equals()的要求如下这些要求是必须遵循的 A对称性如果x.equals(y)返回是“true”那么y.equals(x)也应该返回是“true”。 B反射性x.equals(x)必须返回是“true”。 C类推性如果x.equals(y)返回是“true”而且y.equals(z)返回是“true”那么z.equals(x)也应该返回是“true”。 D一致性如果x.equals(y)返回是“true”只要x和y内容一直不变不管你重复x.equals(y)多少次返回都是“true”。 任何情况下x.equals(null)永远返回是“false”x.equals(和x不同类型的对象)永远返回是“false”。 3、equals()相等的两个对象hashcode()一定相等 反过来hashcode()不等一定能推出equals()也不等 hashcode()相等equals()可能相等也可能不等。 为什么选择hashcode方法 以java.lang.Object来理解,JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会根据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。具体过程是这样: 1.newObject(),JVM根据这个对象的Hashcode值,放入到对应的Hash表对应的Key上,如果不同的对象确产生了相同的hash值,也就是发生了Hashkey相同导致冲突的情况,那么就在这个Hashkey的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。 2.比较两个对象的时候,首先根据他们的hashcode去hash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一定在这个key上的链表上。那么此时就只能根据Object的equal方法来比较这个对象是否equal。当两个对象的hashcode不同的话肯定他们不能equal. 下面我举个例子详细说明下。 list是可以重复的set是不可以重复的。那么set存储数据的时候是怎样判断存进的数据是否已经存在。使用equals()方法呢还是hashcode()方法。 假如用equals()那么存储一个元素就要跟已存在的所有元素比较一遍比如已存入100个元素那么存101个元素的时候就要调用equals方法100次。 但如果用hashcode()方法的话他就利用了hash算法来存储数据的。这样的话每存一个数据就调用一次hashcode()方法得到一个hashcode值及存入的位置。如果该位置不存在数据那么就直接存入否则调用一次equals()方法不相同则存相同不存。这样下来整个存储下来不需要调用几次equals方法虽然多了几次hashcode方法但相对于前面来讲效率高了不少。 为什么要重写equals方法 因为Object的equal方法默认是两个对象的引用的比较意思就是指向同一内存,地址则相等否则不相等如果你现在需要利用对象里面的值来判断是否相等则重载equal方法。 说道这个地方我相信很多人会有疑问相信大家都被String对象的equals()方法和纠结过一段时间当时我们知道String对象中equals方法是判断值的而是地址判断。 那照这么说equals怎么会是地址的比较呢 那是因为实际上JDK中String、Math等封装类都对Object中的equals()方法进行了重写。 我们先看看Object中equals方法的源码 1.publicbooleanequals(Objectobj){ 2.return(thisobj); 3.} 我们都知道所有的对象都拥有标识(内存地址)和状态(数据)同时“”比较两个对象的的内存地址所以说使用Object的equals()方法是比较两个对象的内存地址是否相等即若object1.equals(object2)为true则表示equals1和equals2实际上是引用同一个对象。虽然有时候Object的equals()方法可以满足我们一些基本的要求但是我们必须要清楚我们很大部分时间都是进行两个对象的比较这个时候Object的equals()方法就不可以了所以才会有String这些类对equals方法的改写依次类推Double、Integer、Math。。。。等等这些类都是重写了equals()方法的从而进行的是内容的比较。希望大家不要搞混了。 改写equals时总是要改写hashcode 这一点上《Effectivejava》中点7条和第8条讲的很详细如果看完该博客后你还不懂得话可以看看。里面也涉及到hashcode的设计由于内容较深我觉得我还接受不了所以就不讨论这个了。 java.lnag.Object中对hashCode的约定 1.在一个应用程序执行期间如果一个对象的equals方法做比较所用到的信息没有被修改的话则对该对象调用hashCode方法多次它必须始终如一地返回同一个整数。 2.如果两个对象根据equals(Objecto)方法是相等的则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。 3.如果两个对象根据equals(Objecto)方法是不相等的则调用这两个对象中任一个对象的hashCode方法不要求产生不同的整数结果。但如果能不同则可能提高散列表的性能。 根据上一个问题实际上我们已经能很简单的解释这一点了比如改写String中的equals为基于内容上的比较而不是内存地址的话那么虽然equals相等但并不代表内存地址相等由hashcode方法的定义可知内存地址不同没改写的hashcode值也可能不同。所以违背了第二条约定。 又如new一个对象再new一个内容相等的对象调用equals方法返回的true但他们的hashcode值不同将两个对象存入HashSet中会使得其中包含两个相等的对象因为是先检索hashcode值不等的情况下才会去比较equals方法的。 hashCode方法使用介绍 Hash表数据结构常识 哈希表基于数组。 缺点基于数组的数组创建后难以扩展。某些哈希表被基本填满时性能下降得非常严重。 没有一种简便得方法可以以任何一种顺序遍历表中数据项。 如果不需要有序遍历数据并且可以提前预测数据量的大小那么哈希表在速度和易用性方面是无与伦比的。 为什么HashCode对于对象是如此的重要 一个对象的HashCode就是一个简单的Hash算法的实现虽然它和那些真正的复杂的Hash算法相比还不能叫真正的算法它如何实现它不仅仅是程序员的编程水平问题而是关系到你的对象在存取是性能的非常重要的关系.有可能不同的HashCode可能会使你的对象存取产生成百上千倍的性能差别. 先来看一下在Java中两个重要的数据结构:HashMap和Hashtable虽然它们有很大的区别如继承关系不同对value的约束条件(是否允许null)不同以及线程安全性等有着特定的区别但从实现原理上来说它们是一致的.所以我们只以Hashtable来说明 在java中存取数据的性能一般来说当然是首推数组但是在数据量稍大的容器选择中Hashtable将有比数组性能更高的查询速度.具体原因看下面的内容. Hashtable在存储数据时一般先将该对象的HashCode和0x7FFFFFFF做与操作因为一个对象的HashCode可以为负数这样操作后可以保证它为一个正整数.然后以Hashtable的长度取模得到该对象在Hashtable中的索引. index(o.hashCode()0x7FFFFFFF)%hs.length; 这个对象就会直接放在Hashtable的每index位置对于写入这和数组一样把一个对象放在其中的第index位置但如果是查询经过同样的算法Hashtable可以直接从第index取得这个对象而数组却要做循环比较.所以对于数据量稍大时Hashtable的查询比数组具有更高的性能.既然一个对象可以根据HashCode直接定位它在Hashtable中的位置那么为什么Hashtable还要用key来做映射呢?这就是关系Hashtable性能问题的最重要的问题Hash冲突. 常见的Hash冲突是不同对象最终产生了相同的索引而一种非常甚至绝对少见的Hash冲突是如果一组对象的个数大过了int范围而HashCode的长度只能在int范围中所以肯定要有同一组的元素有相同的HashCode这样无论如何他们都会有相同的索引.当然这种极端的情况是极少见的可以暂不考虑但是对于同的HashCode经过取模则会产中相同的索引或者不同的对象却具有相同的HashCode当然具有相同的索引.所以对于索引相同的对象在该index位置存放了多个值这些值要想能正确区分就要依靠key来识别. 事实上一个设计各好的HashTable一般来说会比较平均地分布每个元素因为Hashtable的长度总是比实际元素的个数按一定比例进行自增(装填因子一般为0.75)左右这样大多数的索引位置只有一个对象而很少的位置会有几个元素.所以Hashtable中的每个位置存放的是一个链表对于只有一个对象是位置链表只有一个首节点(Entry)Entry的next为null.然后有hashCodekeyvalue属性保存了该位置的对象的HashCodekey和value(对象本身)如果有相同索引的对象进来则会进入链表的下一个节点.如果同一个索引中有多个对象根据HashCode和key可以在该链表中找到一个和查询的key相匹配的对象. 从上面我看可以看到对于HashMap和Hashtable的存取性能有重大影响的首先是应该使该数据结构中的元素尽量大可能具有不同的HashCode虽然这并不能保证不同的HashCode产生不同的index但相同的HashCode一定产生相同的index从而影响产生Hash冲突.对于一个象如果具有很多属性把所有属性都参与散列显然是一种笨拙的设计.因为对象的HashCode()方法几乎无所不在地被自动调用如equals比较如果太多的对象参与了散列.那么需要的操作常数时间将会增加很大.所以挑选哪些属性参与散列绝对是一个编程水平的问题.从实现来说一般的HashCode方法会这样: returnAttribute1.HashCode()Attribute1.HashCode()..[super.HashCode()] 我们知道每次调用这个方法都要重新对方法内的参与散列的对象重新计算一次它们的HashCode的运算如果一个对象的属性没有改变仍然要每次都进行计算所以如果设置一个标记来缓存当前的散列码只要当参与散列的对象改变时才重新计算否则调用缓存的hashCode这可以从很大程度上提高性能. 默认的实现是将对象内部地址转化为整数作为HashCode这当然能保证每个对象具有不同的HasCode因为不同的对象内部地址肯定不同(废话)但java语言并不能让程序员获取对象内部地址所以让每个对象产生不同的HashCode有着很多可研究的技术. 如果从多个属性中采样出能具有平均分布的hashCode的属性这是一个性能和多样性相矛盾的地方如果所有属性都参与散列当然hashCode的多样性将大大提高但牺牲了性能而如果只能少量的属性采样散列极端情况会产生大量的散列冲突如对人的属性中如果用性别而不是姓名或出生日期那将只有两个或几个可选的hashcode值将产生一半以上的散列冲突.所以如果可能的条件下专门产生一个序列用来生成HashCode将是一个好的选择(当然产生序列的性能要比所有属性参与散列的性能高的情况下才行否则还不如直接用所有属性散列). 如何对HashCode的性能和多样性求得一个平衡可以参考相关算法设计的书其实并不一定要求非常的优秀只要能尽最大可能减少散列值的聚集.重要的是我们应该记得HashCode对于我们的程序性能有着重要的影响在程序设计时应该时时加以注意. 请记住如果你想有效的使用HashMap你就必须重写在其的HashCode()。 还有两条重写HashCode()的原则 不必对每个不同的对象都产生一个唯一的hashcode只要你的HashCode方法使get()能够得到put()放进去的内容就可以了。即“不为一原则”。生成hashcode的算法尽量使hashcode的值分散一些不要很多hashcode都集中在一个范围内这样有利于提高HashMap的性能。即“分散原则”。至于第二条原则的具体原因有兴趣者可以参考BruceEckel的《ThinkinginJava》在那里有对HashMap内部实现原理的介绍这里就不赘述了。掌握了这两条原则你就能够用好HashMap编写自己的程序了。不知道大家注意没有java.lang.Object中提供的三个方法clone()equals()和hashCode()虽然很典型但在很多情况下都不能够适用它们只是简单的由对象的地址得出结果。这就需要我们在自己的程序中重写它们其实java类库中也重写了千千万万个这样的方法。利用面向对象的多态性——覆盖Java的设计者很优雅的构建了Java的结构也更加体现了Java是一门纯OOP语言的特性。 Java提供的Collection和Map的功能是十分强大的它们能够使你的程序实现方式更为灵活执行效率更高。希望本文能够对大家更好的使用HashMap有所帮助。 为了让学习变得轻松、高效今天给大家免费分享一套Java入门教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要资料的欢迎加入学习交流群928505736
http://www.zqtcl.cn/news/870139/

相关文章:

  • 个体户可以备案网站吗运营
  • 政务网站模版建一个团购网站
  • 信用网站建设方案软文内容
  • PHP网站开发方向企业宣传片制作公司光年映画
  • 满城住房和城乡建设局网站上海最好的网站是什么
  • 网站建设合作网络营销是什么模式
  • 做个网站怎样做的网站建设刂搜金手指下拉贰肆
  • 颍上网站建设个人租车网站源码
  • 建设银行海外招聘网站顺义公司建站多少钱
  • 医疗公司网站建设项目背景你做的网站可视区域多少钱
  • 韩国做暖暖网站怎么样自己建设一个网站
  • 徐州网站建设4禁止wordpress历史版本
  • 公司网站建设价格wordpress做排行榜单
  • 安徽网站推广营销设计请教个人主页网站怎么做啊
  • 甘肃省酒泉市做网站公司wordpress标签云代码
  • 淘宝客做网站备注怎么写的用手机做网站视频
  • 深圳专业网站建设制作价格低品牌网站建设网站
  • 织梦体育网站模板临沂建站程序
  • 重庆网站设计最佳科技好听的网络公司名字
  • 如何在人力资源网站做合同续签贵阳网站建设搜王道下拉
  • 多个域名的网站北京注册公司流程
  • 网站建站对象定制网站系统
  • 阳光家园广州网站网站公司怎么做的好
  • wordpress网站音乐放不全阳山做网站
  • 橙色企业网站源码网站下载软件
  • 满足客户的分销管理系统seo搜索引擎优化技术教程
  • 链接网站制作住房建设部官方网站专家注册
  • 北京保障性住房建设投资中心网站以网络营销为主题的论文
  • 数字火币交易网站开发网站建设设计图图片
  • 惠民建设局网站东莞公司建设网站