java中HashMap查找的时间复杂度是多少?

我知道哈希法的复杂度O(1)。
即使key的类型是某个类,也能哈希吗?java怎样哈希一个任意的类呢?
准确地说,是“java怎样哈希一个任意的类的实例呢?”

如果一个类没有重写hash方法,那么就是默认使用Object的hash方法。
怎么实现的,可以看Object类的源码。
hashMap是用数组加链表来实现的。

containsKey的复杂度是O(1)
containsValue的复杂度是O(n)
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-27
这个可以直接去看HashMap的源码,“java怎样哈希一个任意的类的实例呢?” 简单地说 就是通过类的equals和hashCode方法。追问

如果很好地实现了equals和hashCode方法,HashMap能保证以O(1)的复杂度查找我自定的类的实例吗?
以及,如果没有重写equals和hashCode方法,会影响吗效率吗?
(不考虑深判等)

追答

你不写的话,就不能用自定义的类做key,HashMap不能保证O(1)的复杂度,它是根据hashcode计算出一个对象在桶的位置,一般情况下,同一类不同对象能保证hashcode值不同就可以了。

理想的情况下在较好实现了hashcode后是复杂度是O(1),理想情况是所有键值对在桶中均匀分布,很显然不太现实把

本回答被提问者采纳

java中HashMap查找的时间复杂度是多少?
containsValue的复杂度是O(n)

HashMap最新面试题,夺命14问!
在Java中,HashMap的底层数据结构随着版本变迁有所变化。在JDK1.7中,HashMap采用"数组加链表"的结构,数组作为主体,链表则用于处理哈希冲突。而在JDK1.8中,引入了"数组加链表加红黑树"的结构,当链表过长时,会转为红黑树,以提高搜索效率,红黑树的搜索时间复杂度为O(logn)。HashMap的主要特点包...

List LinkedList HashSet HashMap底层原理剖析
数组在Java中连续存储,因此查询速度快,时间复杂度为O(1),插入数据时可能会慢,特别是需要移动位置时,时间复杂度为O(N),但末尾插入时时间复杂度为O(1)。数组需要固定长度,ArrayList默认长度为10,最大长度为Integer.MAX_VALUE。在添加元素时,如果数组长度不足,则会进行扩容。JDK采用复制扩容法,...

java中hashmap和treemap的区别
HashMap:由于其基于哈希表,所以在理想情况下,插入、删除和查找的时间复杂度为O。但在哈希冲突严重时,性能会下降。TreeMap:由于基于红黑树,它保证了元素的有序性,但同时也带来了额外的排序开销。因此,在插入、删除和查找操作中,TreeMap的时间复杂度通常高于HashMap。但在需要有序遍历的情况下,Tr...

HashMap的初始值, 简单底层说明
遍历和查找时,由于使用红黑树结构,时间复杂度为O(logn),显著提升性能。基于哈希原理,HashMap通过put()和get()方法存储和检索对象。put()方法根据键对象的hashCode()方法计算hashcode,确定存储位置;get()方法利用键对象的equals()方法找到正确的键值对。对于冲突(即相同hashcode的对象),它们将存储在...

map有哪些常用类 各有什么特点
一、HashMap 特点:基于哈希表的 Map 接口实现,提供键到值的映射关系。它允许使用 null 键和 null 值,并且在哈希表中进行查找、插入和删除操作的时间复杂度都是O(1)。但需要注意,当实际容量超过其设计容量时,HashMap 会进行再哈希操作,这可能导致性能下降。二、TreeMap 特点:基于红黑树实现的 ...

hashmap实现了什么接口
查找操作的平均时间复杂度为O(1)。3、动态扩容:当HashMap中的元素数量达到一定的阈值时,它会自动进行扩容,以提供更好的性能。4、允许使用近义词:HashMap允许使用近义词(即具有相同哈希码的对象)作为键。这有助于在需要时存储和检索类似但不完全相同的对象。以上内容参考:百度百科-Hashmap ...

HashMap是如何解决Hash碰撞的问题的
让多个key-value对,同时放在数组的同一个位置上。后面在get的时候,如果发现该位置挂了一个链表,只要遍历这个链表找到自己的key-value就可以了。这里就会有一个性能问题?假设你的链表随着时间的推移变得很长,在后续遍历的时候,性能就会比较差,时间复杂度是O(n)。所以HashMap做了一个优化,如果链...

map的时间复杂度是多少
HashMap是基于哈希表的,在O(1)跟O(n)之间,TreeMap是基于平衡二叉树的,为O(logn)C++中是log2(N)

HashMap以及其子类关键性总结
其实真正存放数据的是 Entry<K,V>[] table,Entry 是 HashMap 中的一个静态内部类,它有key、value、next、hash(key的hashcode)成员变量 多个Entry就构成hashMap的数据结构 数组+链表 get()当Hash冲突严重时,在桶上形成的链表越来越长,这样在查询时的效率就会越来越低,时间复杂度为o(N)TREEIFY_...

相似回答