Java HashMap VS Python 字典

说到编程语言的优势,java和python各有千秋。Java 和 Python 提供的最有用的功能之一是 HashMap 和字典。这两者的用例是相似的。基本上,每当我们需要存储一个键值对时,这些数据结构都会在它们各自的语言中使用。尽管它们似乎都在执行相同的功能,但本文解释了它们内部的不同之处。

基本原理

Java:它使用哈希原理,内部使用哈希码作为存储键值对的基础。在 hashcode 的帮助下,HashMap 将对象分布在数组存储桶(组合在一起的相似对象)中,这样 HashMap 将对象放入并在恒定时间 O(1) 内检索它。

Python : 它在后台使用可调整大小的哈希表的原理。赋予字典的键是具有内置哈希函数的对象。在散列函数的帮助下,键在数组中均匀分布。假设您存储的键都具有不同的散列值,这意味着字典需要恒定的时间——在计算机科学符号中为 O(1)——来检索一个键。

哈希码:

Java : Hashcode 是标识对象的整数值,使用对象的 hashcode() 方法构建。每个对象都有 hashcode() 方法,当调用时,它返回代表对象的整数值。两个不同的对象可以具有相同的标识符/哈希码,在这种情况下,为了唯一标识一个对象,使用对象的其他属性。hashcode() 方法查看对象属性,对其进行操作并提出代表该对象的特定整数值。hashcode 主要用于在 hashmap 表中分布和排列对象。

Python : 在 Python 中,哈希值是用于在查找字典时快速比较字典键的整数。创建字典时,正在被它调用。Python hash() 函数在内部调用 __hash__() 方法来对不同类型的数据进行操作类型。__hash__() 方法默认为任何对象设置。只有不可变对象可以散列。所以字典中的键应该是不可变的(int、float、bool、string、unicode、tuple)。在 python 中,两个不同的对象可能会产生相同的哈希值。例如:整数 2 和浮点数 2.0。这称为碰撞。Python 没有可以解决这个问题的散列函数。 

最终工作:

Java:生成键的哈希码,并将其用作将此键存储在内置 HashMap 数组中的索引。哈希码方法有助于将对象分配到某些类别或桶中。多个对象可以在同一个桶中结束,但已经被分类,我们现在要搜索的对象更少了。Equals 方法现在出现了。这有助于我们查看具有相同哈希码的对象并获取我们感兴趣的对象比较对象的内部属性。哈希码用作我们检索键的相应值的 hashmap 内部数组的索引。如果键在同一个桶中,将为这个哈希索引创建一个链表,并将各个键的值存储在这里。

Python :一个好的散列函数可以最大限度地减少冲突的数量,例如具有相同散列的不同键。Python 没有这种哈希函数。因此,它使用不同的方法将哈希码用作内置数组的索引。如果使用大小为 x 的数组来存储键/值对,那么我们使用等于 x-1 的掩码来计算数组中该对的槽索引。这使得槽索引的计算速度很快。如果仍然存在冲突,则不会创建链表,因为它会增加查找时间。所以对于这个问题,python 使用开放寻址。开放寻址是一种使用探测的冲突解决方法。如果我们有两个具有相同哈希码的键,第一个键已经在数组中占据了一个槽位,它会为具有相同哈希码的第二个键探测下一个空闲索引。

所以这些是java和python中两种数据结构之间的区别。两者对于不同的业务解决方案都很有用。对编程语言的最佳利用最终留给用户。

猜你喜欢

转载自blog.csdn.net/allway2/article/details/121342936
今日推荐