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

互联网建设网站的的好处百度托管公司

互联网建设网站的的好处,百度托管公司,北京网站设计制作哪家好,wordpress如何克隆其他主题本文介绍java.lang.Object类中的两个方法:equals和hashCode。这两个方法大家应该都知道,但是这两个方法的作用是什么、为什么重写equals还要重写hashCode、它们之间有什么关系和约定等,今天就来带大家了解一下。 1、hashCode hashCode即散列…

本文介绍java.lang.Object类中的两个方法:equals和hashCode。这两个方法大家应该都知道,但是这两个方法的作用是什么、为什么重写equals还要重写hashCode、它们之间有什么关系和约定等,今天就来带大家了解一下。

1、hashCode

hashCode即散列码。散列码是用一个int值来代表对象,它是通过将该对象的某些信息进行转换而生成的。Object类中默认的hashCode方法如下

public native int hashCode();

这是一个本地方法,不同的虚拟机有不同的实现(具体实现自己看虚拟机源码哈)。Object默认的hashCode是根据对象的内存地址转化而来的,它是唯一的

我们可以在自己的类中覆盖hashCode方法,但我们可以使用System.identityHashCode(Object x)方法返回默认的hashcode,无论对象是否覆盖默认的hashcode

hashCode方法主要是为了给诸如HashMap这样的哈希表使用。

设计hashcode最重要的因素是:对同一个对象调用hachCode()应该产生同样的值(前提是对象的信息没有被改变)设计一个hashCode,它必须快,而且具有意义(使用有意义的字段来生成hashcode)。hashCode不需要唯一(默认的hashCode唯一),因此更应该关注它的速度,而不是唯一性。

由于在生成桶(桶指哈希桶,或哈希表的槽位)的下标前,hashcode还要做进一步处理,所以生成的hashCode范围不是很重要,是int就行。好的hashCode()应该产生分布均匀的散列码。

哈希桶的大小最好是2的n次方。

对现代处理器来说,除数和求余是最慢的操作,而使用2的n次方,可以用位运算代替求余(%开销较大)。

举个例子,假设哈希桶大小为16(HashMap初始大小),假设hashCode为20,那么使用%求余会得到下标4;但这可以用 hashCode&(length-1) 代替,即20&(16-1),结果也是4


2、equals

hashCode并不需要唯一性,但equals必须严格地判断两个对象是否相同。

正确的equals方法有如下特性:

自反性:x.equals(x)一定返回true

对称性:如果x.equals(y)为true,那么y.equals(x)也为true

传递性:如果x.equals(y)为true、y.equals(z)为true,那么x.equals(z)也为true

一致性:如果x和y中用于等价比较的信息没有改变,那么x.equals(y)无论调用多少次,结果都一致

任何不是null的x,x.equals(null)一定返回false


3、根据Object规范,规范约定:

  1. 如果两个对象通过equals方法比较是相等的,那么它们的hashCode方法结果值也是相等的。
  2. 如果两个对象通过equals方法比较是不相等的,那么不要求它们的hashCode方法结果值是相等的。
  3. 当在一个应用程序执行过程中, 如果equals方法比较中没有修改任何信息,那么在同一个对象上重复调用hashCode方法时,它必须始终返回相同的值。但如果从一个应用程序到了另一个应用程序,两个应用程序汇中调用hashCode方法的返回值可以是不一致的。

Object类中的默认的equals和hashCode方法:

  1. equals:比较的是对象的内存地址是否相同(相当于==操作符)
  2. hashCode:hashCode方法的返回值符合上述规范

因此,当只重写equals方法,不重写hashCode时,违反规定:equals相等的对象必须具有相等的哈希码。

如果不这样做,你的类违反了hashCode的通用约定,对于HashSet, HashMap, HashTable等基于hash值的类就会出现问题。

以HashMap为例,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。
这样解决了向含有大量数据的集合中添加元素时,大量频繁的操作equals方法的问题。

下面举个例子说明:
创建一个Point类,有两个成员变量x和y,并重写了equals方法。

public class Point {private final int x, y;public Point(int x, int y) {this.x = x;this.y = y;}@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (!(obj instanceof Point)) return false;Point point = (Point) obj;return x == point.x && y == point.y;}public static void main(String[] args) {Point p1 = new Point(1, 2);Point p2 = new Point(1, 2);System.out.println(p1.equals(p2));// trueMap<Point, String> map = new HashMap<>();map.put(p1, "p1");System.out.println(map.get(p2)); // null}
}

你可能觉得 map.get(p2) 应该返回字符串 p1, 但是却返回null, 这是因为Point类并没有重写hashCode方法,导致两个相等的实例p1和p2返回了不同的哈希码,违反了hashCode的约定,put方法把实例p1放到了一个哈希桶(hash bucket)中,但因为p2的哈希码不等于p1的哈希码,所以get方法会从其它哈希桶中去查找。

解决这个方法很简单,只需要重写Point类的hashCode方法。

	@Overridepublic int hashCode() {int result = Integer.hashCode(x);result = 31 * result + Integer.hashCode(y);return result;}public static void main(String[] args) {Point p1 = new Point(1, 2);Point p2 = new Point(1, 2);System.out.println(p1.equals(p2));// trueMap<Point, String> map = new HashMap<>();map.put(p1, "p1");System.out.println(map.get(p2)); // p1}

这次你会发现map.get(p2) 返回的就是字符串p1了, 因为hashCode这个方法会返回一个简单的确定性计算的结果,它的唯一的输入是 Point实例中的两个重要的属性x和y,所以显然相等的 Point实例具有相同的哈希码。

此外Objects 类有一个静态方法,它接受任意数量的对象并为它们返回一个哈希码。这个名为 hash 的方法可以 让你编写一行 hashCode 方法,其质量与根据这个项目中的上面编写的方法相当。

	@Overridepublic int hashCode() {return Objects.hash(x, y);}

注意事项

  1. 当你写完 hashCode 方法后,请一定问一下自己是否满足相等的实例有相同的哈希码这一条件。
  2. hashCode中涉及到的属性应与equals中保持一致,不要试图从哈希码计算中排除重要的属性来提高性能。

总之,每次重写 equals 方法时都必须重写 hashCode 方法,否则程序将无法正常运行。你的 hashCode 方 法必须遵从 Object 类指定的常规约定,并且必须执行合理的工作,将不相等的哈希码分配给不相等的实例

http://www.dinnco.com/news/62544.html

相关文章:

  • 卖汽车的网站怎么做的新网站推广最直接的方法
  • 政府官方网站建设需要多少钱宁波正规seo推广
  • 365房产南京网站网络广告推广
  • 手机上哪个网站杯子软文营销300字
  • 电子商务网站建设与管理的感受建站优化公司
  • 合肥做网站公司有哪些b站视频推广网站动漫
  • 什么是网页什么是网站百度一下你就知道原版
  • 寻找网站建设推广推广策略可以分为哪三种
  • 男女做羞羞的事网站网络培训课程
  • 高端网站建设公司哪个靠谱策划方案网站
  • 长春网站建设东莞网络营销优化
  • 提供邢台企业做网站深圳全网推广平台
  • 亚网站建设客户管理软件
  • 做网站完整视频百度推广关键词排名规则
  • 电子商务网站建设价格惠州网站建设
  • 做网站要考虑的问题无锡网站制作推广
  • 导购网站如何做免费推广怎么在百度上推广自己
  • 厦门 网站制作搜索引擎seo优化平台
  • 广西网站运营最好的公司杭州网络推广有限公司
  • 网站外链建设大揭秘互联网营销师培训教程
  • 私募网站建设服务企业营销策划公司
  • 网站建设福州最好网络营销咨询公司
  • 企业网站首页设计欣赏百度工具seo
  • 龙岗召开企业服务大会广州seo推广
  • wordpress返回seo关键词排名
  • 免费注册购物网站百度公司官网入口
  • 赚钱的十大个人网站厦门人才网最新招聘信息
  • 兰州新区小程序建站seo关键词排名优化系统源码
  • 农庄网站模板网页设计效果图及代码
  • wordpress ip修改白帽seo