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

建一个公司网站要多久上海网站制作顾

建一个公司网站要多久,上海网站制作顾,网站业务员怎么给客户做方案,免费网络wifi连接image搞懂 Java equals 和 hashCode 方法分析完 Java List 容器的源码后#xff0c;本来想直接进入 Set 和 Map 容器的源码分析#xff0c;但是对于这两种容器#xff0c;内部存储元素的方式的都是以键值对相关的#xff0c;而元素如何存放#xff0c;便与 equals 和 hash…image搞懂 Java equals 和 hashCode 方法分析完 Java List 容器的源码后本来想直接进入 Set 和 Map 容器的源码分析但是对于这两种容器内部存储元素的方式的都是以键值对相关的而元素如何存放便与 equals 和 hashCode 这两个方法密切相关。所以在分析 Map 家族之前需要深入了解下这两个方法而且这两个方法在面试的时候也属于极有可能考察的问题。跟往常一样本文也尽可能结合面试题来重点讲解下 equals 和 hashCode 的使用以及意义。概述首先 equals 和 hashCode 两个方法属于 Object 基类的方法public boolean equals(Object obj) {return (this obj);}public native int hashCode();可以看出 equals 方法默认比较的是两个对象的引用是否指向同一个内存地址。而 hashCode 这是一个 native 本地方法其实默认的 hashCode 方法返回的就是对象对应的内存地址。hasCode 方法的注释这样说的 This is typically implemented by converting the internal address of the object into an integer,这一点我们通过 toString 方法也可以间接了解我们都知道 toString 返回的是「类名十六进制内存地址」由源码可以看出内存地址与 hashCode() 返回值相同。public String toString() {return getClass().getName() Integer.toHexString(hashCode());}面试题目 hashCode 方法返回的是对象的内存地址么答 Object 基类的 hashCode 方法默认返回对象的内存地址但是在一些场景下我们需要覆写 hashCode 函数比如需要使用 Map 来存放对象的时候覆写后 hashCode 就不是对象的内存地址了。equals 详解equals 方法既然是基类 Object 的方法我们创建的所有的对象都拥有这个方法并有权利去重写这个方法。该方法返回一个 boolean 值代表比较的两个对象是否相同这里的相同的条件由重写 equals 方法的类来解决。比如我们都知道 :String str1 abc;String str2 abc;str1.equals(str2);//true显然 String 类一定重写了 equals 方法否则两个 String 对象内存地址肯定不同。我们简单看下 String 类的 equals 方法public boolean equals(Object anObject) {//首先判断两个对象的内存地址是否相同if (this anObject) {return true;}// 判断连个对象是否属于同一类型。if (anObject instanceof String) {String anotherString (String)anObject;int n value.length;//长度相同的情况下逐一比较 char 数组中的每个元素是否相同if (n anotherString.value.length) {char v1[] value;char v2[] anotherString.value;int i 0;while (n-- ! 0) {if (v1[i] ! v2[i])return false;i;}return true;}}return false;}从源码我们也可以看出 equals 方法已经不单单是调用 thisobj来判断对象是否相同了。事实上所有 Java 定义好的一些现有的引用数据类型都重写了该方法。当我们自己定义引用数据类型的时候我们应该依照什么原则去判定两个对象是否相同这就需要我们自己来根据业务需求来把握。但是我们都需要遵循以下规则自反性(reflexive)。对于任意不为 null 的引用值 xx.equals(x) 一定是 true。对称性(symmetric)。对于任意不为 null 的引用值 x 和 y 当且仅当x.equals(y)是 true 时y.equals(x)也是true。传递性(transitive)。对于任意不为 null 的引用值x、y和z如果 x.equals(y) 是 true同时 y.equals(z) 是 true那么x.equals(z)一定是 true。一致性(consistent)。对于任意不为null的引用值x和y如果用于equals比较的对象信息没有被修改的话多次调用时 x.equals(y) 要么一致地返回 true 要么一致地返回 false。对于任意不为 null 的引用值 xx.equals(null) 返回 false。equals vs 说到 equals 怎么能不说 其实两个在初学 Java 的时候给新手还是带来了蛮多困惑的。对于这两个的区别需要看比较的对象是什么样的类型。我们都知道 Java 数据类型可分为 基本数据类型 和 引用数据类型。基本数据类型包括 byte, short, int , long , float , double , boolen char 八种。对于基本数据类型 操作符判断的是左右两边变量的值int a 10;int b 10;float c 10.0f;//以下输出结果均为 trueSystem.out.println((a b) (a b));System.out.println((b c) (b c));而对于引用数据类型 操作符判断就是等号两边的指向的对象的内存地址是否相同。也就是说通过 判断的两个引用数据类型变量如果相同则他们指向的肯定是同一个对象。EntryClass entryClass1 new EntryClass(1);EntryClass entryClass2 new EntryClass(1);EntryClass entryClass3 entryClass1;// (entryClass1 entryClass2) falseSystem.out.println( (entryClass1 entryClass2) (entryClass1 entryClass2));// (entryClass1 entryClass3) trueSystem.out.println( (entryClass1 entryClass3) (entryClass1 entryClass3));equals 与 操作符的区别总结如下若 两侧都是基本数据类型则判断的是左右两边操作数据的值是否相等若 两侧都是引用数据类型则判断的是左右两边操作数的内存地址是否相同。若此时返回 true , 则该操作符作用的一定是同一个对象。Object 基类的 equals 默认比较两个对象的内存地址在构建的对象没有重写 equals 方法的时候与 操作符比较的结果相同。equals 用于比较引用数据类型是否相等。在满足equals 判断规则的前体系两个对象只要规定的属性相同我们就认为两个对象是相同的。hashCode 方法hashCode 方法并没有 equals 方法使用的那么频繁说道 hashCode 方法就不得不结合 Java 的 Map 容器类似于 HashMap 这种使用了哈希算法容器会根据对象的hashCode返回值来初步确定对象在容器中的位置,然后内部再根据一定的 hash 算法来实现元素的存取。hash 法简介hash 算法又被成为散列算法基本上哈希算法就是将对象本身的键值通过特定的数学函数运算或者使用其他方法转化成相应的数据存储地址的。而哈希法所使用的数学函数就被称为 『哈希函数』又可以称之为散列函数。说了这么多定义的东西那这个 hash 算法究竟是干什么用的呢 我们可以通过一个例子来说明如果我们要在存放了的元素{046928} 的数组中找到数值等于 6 的值的索引我们会怎么做我们是不是需要遍历一遍数组才能拿到对应的索引。在数组较大的时候这往往是低效率的。如果我们能在数组存放的时候就按一定的规则放入元素在我们想找某个元素的时候在根据之前定好的规则就可以很快的得到我们想要的结果了。换句话说之前我们在数组中存放元素的顺序可能是依照添加顺序进行的但是如果我们是按照一种既定的数学函数运算得到要放入元素的值和数组角标的映射关系的话。那么我们在想取某个值的元素的时候就使用映射关系就可以找到对应的角标了。在常见的 hash 函数中有一种最简单的方法交「除留余数法」操作方法就是将要存入数据除以某个常数后使用余数作为索引值。 下面看个例子将 323 458 25 340 28 969 77 使用「除留余数法」存储在长度为11的数组中。我们假设上边说的某个常数即为数组长度11。 每个数除以11以后存放的位置如下图所示image试想一下我们现在想要拿到 77 在数组中的位置是不是只需要 arr[77%11] 77 就可以了。但是上述简单的 hash 算法缺点也是很明显的比如 77 和 88 对 11 取余数得到的值都是 0但是角标为 0 位置已经存放了 77 这个数据那88就不知道该去哪里了。上述现象在哈希法中有个名词叫碰撞碰撞若两个不同的数据经过相同哈希函数运算后得到相同的结果那么这种现象就做碰撞。于是在设计 hash 函数的时候我们就要尽可能做到降低碰撞的可能性尽量将要存入的元素经过 hash 函数运算后的结果尽量能够均匀的分布在指定的容器(我们在称之为桶)。hashCode 方法 与 hash 算法的关系其实 Java 中的有所的对象又拥有 hashCode 方法其实就是一种 hash 算法只是有的类覆写好提供给我们了有些就需要我们手动去覆写。比如我们可以看一下 String 提供给我们的 hashCode 算法public int hashCode() {int h hash;//默认是0if (h 0 value.length 0) {char val[] value;// 字符串转化的 char 数组中每一个元素都参与运算for (int i 0; i value.length; i) {h 31 * h val[i];}hash h;}return h;}前文说了 hashCode 方法与 java 中使用散列表的集合类息息相关我们拿 Set 来举例我们都知道 Set 中是不允许存放重复的元素的。那么我们凭借什么来判断已有的 Set 集合中是否有何要存入的元素重复的元素呢有人可能会说我们可以通过 equals 来判断两个元素是否相同。那么问题又来如果 Set 中已经有 10000个元素了那么之后在存入一个元素岂不是要调用 10000 次 equals 方法。显然这不合理性能低到令人发指。那要怎么办才能保证即高效又不重复呢答案就在于 hashCode 这个函数。经过之前的分析我们知道 hash 算法是使用特定的运算来得到数据的存储位置的那么 hashCode 方法就充当了这个特定的函数运算。这里我们可以简单认为调用 hashCode 方法后得到数值就是元素的存储位置(其实集合内部还做了进一步的运算以保证尽可能的均匀分布在桶内)。当 Set 需要存放一个元素的时候首先会调用 hashCode 方法去查看对应的地址上有没有存放元素如果没有则表示 Set 中肯定没有相同的元素直接存放在对应位置就好但是如果 hashCode 的结果相同即发生了碰撞那么我们在进一步调用该位置元素的 equals 方法与要存放的元素进行比较如果相同就不存了如果不相同就需要进一步散列其它的地址。这样我们就可以尽可能高效的保证了无重复元素的方法。面试题 hashCode 方法的作用和意义答 在 Java 中 hashCode 的存在主要是用于提高容器查找和存储的快捷性如 HashSet HashtableHashMap 等hashCode是用来在散列存储结构中确定对象的存储地址的hashCode 和 equals 方法的关系翻看Object 类对于 equals 方法的注释上有这这么一条请注意当这个方法被重写时通常需要覆盖{code hashCode}方法以便维护{code hashCode}方法的一般契约该方法声明相等对象必须具有相等的哈希码.可以看到如果我们出于某种原因复写了 equals 方法我们需要按照约定去覆写 hashCode 方法并且使用 equals 比较相同的对象必须拥有相等的哈希码。Object 对于 hashCode 方法也有几条要求在 Java 应用程序执行期间在对同一对象多次调用 hashCode 方法时必须一致地返回相同的整数前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行该整数无需保持一致。如果根据 equals(Object) 方法两个对象是相等的那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。如果根据 equals(java.lang.Object) 方法两个对象不相等那么对这两个对象中的任一对象上调用 hashCode 方法 不要求 一定生成不同的整数结果。但是程序员应该意识到为不相等的对象生成不同整数结果可以提高哈希表的性能。结合 equals 方法的我们可以做出如下总结调用 equals 返回 true 的两个对象必须具有相等的哈希码。如果两个对象的 hashCode 返回值相同调用它们 equals 方法不一返回 true 。我们先来看下第一个结论调用 equals 返回 true 的两个对象必须具有相等的哈希码。为什么这么要求呢比如我们还拿 Set 集合举例Set 首先会调用对象的 hashCode 方法寻找对象的存储位置如果两个相同的对象调用 hashCode 方法得到的结果不同那么造成的后果就是 Set 中存储了相同的元素而这样的结果肯定是不对的。所以就要求 调用 equals 返回 true 的两个对象必须具有相等的哈希码。那么第二条为什么 hashCode 返回值相同两个对象却不一定相同呢这是因为目前没有完美的 hash 算法能够完全的避免 「哈希碰撞」既然碰撞是无法完全避免的所以两个不相同的对象总有可能得到相同的哈希值。所以我们只能尽可能的保证不同的对象的 hashCode 不相同。事实上对于 HashMap 在存储键值对的时候就会发生这样的情况在 JDK 1.7 之前HashMap 对键的哈希值碰撞的处理方式就是使用所谓的‘拉链法’。 具体实现会在之后分析 HashMap 的时候说到。总结本文总结了 equals 方法和 hashCode 方法的作用和意义。并学习了在覆写这两个方法的时候需要注意的要求。需要注意的是关于这两个方法在面试的时候还是很有可能被问及的所以我们至少要明白hashCode 返回值不一定对象的存储地址比如发生哈希碰撞的时候。调用 equals 返回 true 的两个对象必须具有相等的哈希码。如果两个对象的 hashCode 返回值相同调用它们 equals 方法不一返回 true 。
http://www.zqtcl.cn/news/597832/

相关文章:

  • 恩施网站优化七牛云可以做网站的存储空间吗
  • 网站建设的源代码有什么作用网站维护包括哪些
  • 广东广东网站建设工作网站qq登录 开发
  • 中山网页网站设计模板access 数据库做网站
  • 阿里云网站做网站的服务器用什么系统
  • 什么公司做网站最好怎么给网站做快照
  • 官方网站建设的方法有哪些方面邮箱号码大全
  • 电商app软件山东网络推广优化排名
  • 国内产品网站w源码1688网站关键词描述字数
  • 网站404 模板wordpress 文字插件下载
  • 河南民基建设工程有限公司网站齐齐哈尔建设局网站首页
  • 响应式网站建设推荐乐云践新三丰云免费云服务器
  • 长沙网站建设模板uc浏览器访问网站
  • 擼擼擼做最好的导航网站陕西政务服务网注册公司流程
  • 怎样做商城网站的推广wordpress用php哪个版本好
  • 网站功能模块建设建设网站考证
  • 网站代码结构成都住建局官网报名入口
  • 吴桥县网站建设房产门户网站模板
  • 标签化网站网络服务类型及其所采用的网络协议
  • 做网站服务器应该怎么配置网页美工设计实践性教案
  • 响应式网站导航栏内容泰安网站营销推广
  • 南通营销网站开发软件开发工具名词解释
  • 吉林企业网站模板建站哪个好wordpress后台新建慢
  • 整合营销的成功案例肇庆seo优化
  • 网站关键字标签合肥高端网站建设设计公司哪家好
  • 大型企业网站设计案例免费在线看片
  • 云南网站开发公司找哪家网站弹出式链接后台怎么做
  • 电商网站的支付模块怎么做企业网站建设招标文件
  • 旅游在线网站开发十八个免费的舆情网站
  • 网站怎么申请百度小程序火车头采集发布wordpress