map和hashmap

C++

1.C++的map容器和使用技巧

http://www.cnblogs.com/anywei/archive/2011/10/27/2226830.html


2.C++中hashmap的介绍

http://blog.chinaunix.net/uid-20773165-id-1847822.html

map和hashmap还是有区别的。

hash_map和map的区别在哪里?

  • 构造函数。hash_map需要hash函数,等于函数;map只需要比较函数(小于函数).
  • 存储结构。hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其memory数据结构是不一样的。

什么时候需要用hash_map,什么时候需要用map?

总体来说,hash_map 查找速度会比map快,而且查找速度基本和数据数据量大小,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n)小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。但若你对内存使用特别严格,希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且hash_map的构造速度较慢。

现在知道如何选择了吗?权衡三个因素: 查找速度, 数据量, 内存使用。



Java

3.Java中Hashmap实现原理分析

http://blog.csdn.net/vking_wang/article/details/14166593

数组的特点是,寻址容易,但是插入和删除困难。因为它需要移动被修改元素后面的若干元素位置。

链表的特点是,寻址困难,但是插入和删除容易。

Hashmap就是中和了数组和链表的有点,找到了一个寻址容易同时插入删除也容易的方法,它采用的是数组+链表的实现方式。

HashMap里面有一个静态内部类,重要的属性有key,value和next..Hashmap的基础就是一个线性数组,这个数组就是Entry[],Map的内容存放在Entry[]里面。

在一个长度为len的数组中,每一个元素存放的是一个链表的头结点。这些元素是通过什么样的方式存放在数组中呢?一般是通过取模的方式,key%len获得。

如何对hashmap进行存取呢?

如果两个key通过key%len获得的数组index相同,会不会覆盖?不会。Entry类中有一个next属性,作用是指向下一个Entry.比如说第一个键值对A进来,通过该计算key的hash得到数组的Index=0,则Entry[0]=A。如果一会又来一个键值对B,通过计算Index同样也是0,那么Hashmap会这么做:B.next=A,Entry[0]=B.这样通过next,就将所有的键值对串联起来了,形成了一个链表。



4.Java中hashmap的两种遍历方式(Entryset 和keyset),entryset的效率更好

http://www.cnblogs.com/meieiem/archive/2011/11/02/2233041.html



5.在java中map是一个接口,而hashmap是一个类,它实现了map所有的方法






你可能感兴趣的:(map和hashmap)