Java 哈希:它是如何在内部工作的?

Java 哈希:它是如何在内部工作的?,java,algorithm,data-structures,hash,Java,Algorithm,Data Structures,Hash,这听起来可能是一个非常模糊的问题,但事实并非如此。我已经浏览了维基上的描述,但理解起来并没有多大帮助 我正在寻找一些简单的答案来回答一些比较复杂的话题,比如散列。以下是我的问题: 我们所说的散列是什么意思?它是如何在内部工作的 它遵循什么算法 HashMap、HashTable和HashList之间有什么区别 我们所说的“恒定时间复杂性”是什么意思?为什么散列的不同实现会给出恒定时间操作 最后,为什么在大多数面试问题中询问Hash和LinkedList,测试受访者的知识是否有任何特定的逻辑 我知

这听起来可能是一个非常模糊的问题,但事实并非如此。我已经浏览了维基上的描述,但理解起来并没有多大帮助

我正在寻找一些简单的答案来回答一些比较复杂的话题,比如散列。以下是我的问题:

  • 我们所说的散列是什么意思?它是如何在内部工作的
  • 它遵循什么算法
  • HashMap
    HashTable
    HashList
    之间有什么区别
  • 我们所说的“恒定时间复杂性”是什么意思?为什么散列的不同实现会给出恒定时间操作
  • 最后,为什么在大多数面试问题中询问
    Hash
    LinkedList
    ,测试受访者的知识是否有任何特定的逻辑
  • 我知道我的问题清单很大,但如果我能得到这些问题的明确答案,我将不胜感激,因为我真的很想理解这个主题

  • 散列意味着生成(希望是)表示值的唯一数字
  • 不同类型的值(
    Integer
    String
    等)使用不同的算法来计算哈希代码
  • HashMap和HashTable是映射;它们是unqiue键的集合,每个键都与一个值关联。
    Java没有HashList类。哈希集是一组唯一的值
  • 从哈希表中获取项的时间与表的大小有关。
    计算散列不一定是与被散列的值相关的恒定时间。
    例如,计算字符串的哈希值涉及到对字符串的迭代,并且对于字符串的大小来说不是常数时间
  • 这些都是人们应该知道的事情
  • 散列是将给定的实体(用java术语-对象)转换为某个数字(或序列)。散列函数是不可逆的,即不能从散列中获取原始对象。在内部,它是通过JVM获取一些内存地址来实现的(对于
    java.lang.Object

  • JVM地址是不重要的细节。每个类都可以用自己的算法覆盖
    hashCode()
    方法。Modren Java IDE允许生成好的hashCode方法

  • Hashtable和hashmap是同一件事。它们是键-值对,其中键是散列的。哈希列表和哈希集不存储值-只存储键

  • 常量时间意味着,无论哈希表(或任何其他集合)中有多少个条目,通过其键查找给定对象所需的操作数都是常量,即-1,或接近1

  • 这是计算机科学的基础资料,应该每个人都熟悉它。我认为谷歌已经明确指出哈希表是计算机科学中最重要的数据结构

  • 是关于哈希的一个很好的解释。例如,如果要存储字符串“Rachel”,则对该字符串应用哈希函数以获取内存位置。
    myHashFunction(key:“Rachel”value:“Rachel”)-->10
    。该函数可能会为输入“Rachel”返回10,因此假设您有一个大小为100的数组,则存储“Rachel”在索引10处。如果要检索该元素,只需调用
    GetmyHashFunction(“Rachel”)
    ,它将返回10。请注意,在本例中,键为“Rachel”,值为“Rachel”但是您可以为该键使用另一个值,例如出生日期或对象。您的哈希函数可能会为两个不同的输入返回相同的内存位置,在这种情况下,如果您实现自己的哈希表,您将发生冲突。您必须处理此问题,可能需要使用链表或其他技术

  • 使用的是一些常见的哈希函数。一个好的哈希函数满足以下条件:每个键都有可能散列到n个内存插槽中的任意一个,而与任何其他键散列到的位置无关。其中一种方法称为除法。我们将k的剩余部分除以n,将k映射到n个插槽中的一个。
    h(k)=k mod n
    。例如,如果数组大小为
    n=100
    ,并且键为整数
    k=15
    ,则
    h(k)=10

  • 哈希表是同步的,而哈希映射不是。 Hashmap允许将空值作为键,但Hashtable不允许

  • 哈希表的目的是在添加和获取元素时具有O(c)恒定的时间复杂度。在大小为N的链表中,如果要获取最后一个元素,则必须遍历所有列表,直到获取为止,因此复杂度为O(N)。使用哈希表,如果要检索元素,只需传递键,哈希函数将返回所需元素。如果哈希函数实现良好,它将以恒定时间O(c)运行,这意味着您不必遍历哈希表中存储的所有元素。您将“立即”获得元素

  • 当然,程序员/开发人员计算机科学家需要了解数据结构和复杂性=)

  • 我们所说的散列是什么意思 它在内部工作吗

    哈希是表示原始字符串的较短固定长度值或键的转换。它不是索引。哈希的核心是哈希表。它包含项目数组。哈希表包含来自数据项键的索引,并使用此索引将数据放入数组中

    它遵循什么算法

    简单地说,大多数哈希算法都在逻辑“index=f(key,arraylelength)”上工作

    最后,为什么在大多数面试中 Hash和LinkedList的问题是 问:有什么具体的逻辑吗 它来自测试受访者的 知识


    这关系到你在逻辑推理方面有多出色。每个程序员都知道它是最重要的数据结构。

    我将尝试对哈希及其目的进行简单的解释
    int hash(const char* str){
        int rez = 0;
        for (int i = 0; i < strlen(str); i++)
            rez = rez * 37 + str[i];
        return rez % NUMBER_OF_PARTITIONS;
    };