Java 理论与实践:哈希

2016-02-19 18:58 4 1 收藏

下面是个超简单的Java 理论与实践:哈希教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - 编程语言 】


  每个Java对象都有hashCode()和 equals()方法。许多类忽略(Override)这些方法的缺省实施,以在对象实例之间提供更深层次的语义可比性。在Java理念和实践这一部分,Java开发人员Brian Goetz向您介绍在创建Java类以有效和准确定义hashCode()和equals()时应遵循的规则和指南。您可以在讨论论坛与作者和其它读者一同探讨您对本文的看法。(您还可以点击本文顶部或底部的讨论进入论坛。)
  
  虽然Java语言不直接支持关联数组 -- 可以使用任何对象作为一个索引的数组 -- 但在根Object类中使用hashCode()方法明确表示期望广泛使用HashMap(及其前辈Hashtable)。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式中支持散列可以促进基于散列的容器的开发和使用。
  
  定义对象的相等性
  
  Object类有两种方法来推断对象的标识:equals()和hashCode()。一般来说,假如您忽略了其中一种,您必须同时忽略这两种,因为两者之间有必须维持的至关重要的关系。非凡情况是根据equals() 方法,假如两个对象是相等的,它们必须有相同的hashCode()值(尽管这通常不是真的)。
  
  特定类的equals()的语义在Implementer的左侧定义;定义对特定类来说equals()意味着什么是其设计工作的一部分。Object提供的缺省实施简单引用下面等式:
  
  public boolean equals(Object obj) { return (this == obj); }
  
  在这种缺省实施情况下,只有它们引用真正同一个对象时这两个引用才是相等的。同样,Object提供的hashCode()的缺省实施通过将对象的内存地址对映于一个整数值来生成。由于在某些架构上,地址空间大于int值的范围,两个不同的对象有相同的hashCode()是可能的。假如您忽略了hashCode(),您仍然可以使用System.identityHashCode()方法来接入这类缺省值。
  
  忽略 equals() -- 简单实例
  
  缺省情况下,equals()和hashCode()基于标识的实施是合理的,但对于某些类来说,它们希望放宽等式的定义。例如,Integer类定义equals() 与下面类似:
  
  public boolean equals(Object obj) {
  
  return (obj instanceof Integer
  
  && intvalue() == ((Integer) obj).intvalue());
  
  }
  
  在这个定义中,只有在包含相同的整数值的情况下这两个Integer对象是相等的。结合将不可修改的Integer,这使得使用Integer作为HashMap中的要害字是切实可行的。这种基于值的Equal方法可以由Java类库中的所有原始封装类使用,如Integer、Float、Character和Boolean以及String(假如两个String对象包含相同顺序的字符,那它们是相等的)。由于这些类都是不可修改的并且可以实施hashCode()和equals(),它们都可以做为很好的散列要害字。为什么忽略 equals()和hashCode()?
  
  假如Integer不忽略equals() 和 hashCode()情况又将如何?假如我们从未在HashMap或其它基于散列的集合中使用Integer作为要害字的话,什么也不会发生。但是,假如我们在HashMap中使用这类Integer对象作为要害字,我们将不能够可靠地检索相关的值,除非我们在get()调用中使用与put()调用中极其类似的Integer实例。这要求确保在我们的整个程序中,只能使用对应于特定整数值的Integer对象的一个实例。不用说,这种方法极不方便而且错误频频。
  
  Object的interface contract要求假如根据 equals()两个对象是相等的,那么它们必须有相同的hashCode()值。当其识别能力整个包含在equals()中时,为什么我们的根对象类需要hashCode()?hashCode()方法纯粹用于提高效率。Java平台设计人员预计到了典型Java应用程序中基于散列的集合类(Collection Class)的重要性--如Hashtable、HashMap和HashSet,并且使用equals()与许多对象进行比较在计算方面非常昂贵。使所有Java对象都能够支持 hashCode()并结合使用基于散列的集合,可以实现有效的存储和检索。
  
  实施equals()和hashCode()的需求
  
  实施equals()和 hashCode()有一些限制,Object文件中列举出了这些限制。非凡是equals()方法必须显示以下属性:
  
  Symmetry:两个引用,a和 b,a.equals(b) if and only if b.equals(a)
  
  Reflexivity:所有非空引用, a.equals(a)
  
  Transitivity:If a.equals(b) and b.equals(c), then a.equals(c)
  
  Consistency with hashCode():两个相等的对象必须有相同的hashCode()值
  
  Object的规范中并没有明确要求equals()和 hashCode() 必须一致 -- 它们的结果在随后的调用中将是相同的,假设“不改变对象相等性比较中使用的任何信息。”这听起来象“计算的结果将不改变,除非实际情况如此。”这一模糊声明通常解释为相等性和散列值计算应是对象的可确定性功能,而不是其它。
  
  对象相等性意味着什么?
  
  人们很轻易满足Object类规范对equals() 和 hashCode() 的要求。决定是否和如何忽略equals()除了判定以外,还要求其它。在简单的不可修值类中,如Integer(事实上是几乎所有不可修改的类),选择相当明显 -- 相等性应基于基本对象状态的相等性。

来源:https://www.tulaoshi.com/n/20160219/1619657.html

延伸阅读
标签: 电脑入门
1. 实验目 的理解shell程序的功能。 学会shell的使用。 建造一个简单的shell。 2. 实验内容 基本任务:编写一个简单的shell程序,实现以下基本的命令。 1) 浏览目录和文件的各种属性 ls -l? 2) 回显 echo、 3) 显示文件内容 cat、more、 4) 创建目录mkdir、 5) 删除目录rmdir、 6) 删...
首先,本文的目标读者是正在从事技术工作的架构师。为了避免浪费大家的才智,我会避免讲述一些陈腐的最佳实践,例如"日常构建(build daily)"、"测试一切(test everything)"和"经常集成( integrate often)。 任何具有称职架构师的项目都有分工明确的、定义良好的团队结构。他们还为进行编码检查、构建代码(每日或在需要时)、进行测试(...
public class RoleRight  {  private static Hashtable rightList = new Hashtable(); /**  *br方法说明:初始化数据  *br输入参数:  *br返回类型:  */  public void init()  { String[] accRoleList = {"admin","satrap","manager","user","...
标签: Web开发
ASP与存储过程(Stored Procedures)的文章不少,但是我怀疑作者们是否真正实践过。我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那么回事。对于简单的应用,这些资料也许是有帮助的,但仅限于此,因为它们根本就是千篇一律,互相抄袭,稍微复杂点的应用,就全都语焉不详了。     现在,我基...
摘要 通过本章的学习,读者应能知道GUI(图形用户界面)的概念,并且能够使用Java语言来构建一个令人心旷神怡的GUI界面,使你的程序更具有感召力。把握标签、按钮、文本框、选择框、滚动条……等等各种GUI部件的使用方法。 -------------------------------------------------------------------------------- ...

经验教程

489

收藏

76
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部