javascript实现java中的Map,代码是在国外的一个网站上看到的(http://stackoverflow.com/questions/368280/javascript-hashmap-equivalent),自己稍作了修改,之前也看到过有人用2个数组实现了Map,但是我感觉效率比较低,现在这个我感觉效率还可以,自己做了下测试,代码如下: 
Map.js

  1. function Map(linkItems) {
  2. this.current = undefined;
  3. this._size = 0;
  4. if(linkItems === false){
  5. this.disableLinking();
  6. }
  7. }
  8. /**
  9. * 获取当前map
  10. * @return 当前对象
  11. */
  12. Map.noop = function() {
  13. return this;
  14. };
  15. /**
  16. * 非法操作
  17. * @return
  18. */
  19. Map.illegal = function() {
  20. throw new Error("非法操作,Map已经被禁用");
  21. };
  22. /**
  23. *
  24. * @param obj
  25. * @param foreignKeys
  26. * @return
  27. */
  28. Map.from = function(obj, foreignKeys) {
  29. var map = new Map;
  30. for(var prop in obj) {
  31. if(foreignKeys || obj.hasOwnProperty(prop)){
  32. map.put(prop, obj[prop]);
  33. }
  34. }
  35. return map;
  36. };
  37. /**
  38. * 禁用map
  39. * @return
  40. */
  41. Map.prototype.disableLinking = function() {
  42. this.link = Map.noop;
  43. this.unlink = Map.noop;
  44. this.disableLinking = Map.noop;
  45. this.next = Map.illegal;
  46. this.key = Map.illegal;
  47. this.value = Map.illegal;
  48. this.clear = Map.illegal;
  49. return this;
  50. };
  51. /**
  52. * 返回hash值 例如:number 123
  53. * @param value key/value
  54. * @return
  55. */
  56. Map.prototype.hash = function(value) {
  57. return (typeof value) + ' ' + (value instanceof Object ? (value.__hash || (value.__hash = ++arguments.callee.current)) : value.toString());
  58. };
  59. /**
  60. * 返回map的长度
  61. * @return
  62. */
  63. Map.prototype.size = function() {
  64. return this._size;
  65. };
  66. Map.prototype.hash.current = 0;
  67. /**
  68. * 通过key获取value
  69. * @param key
  70. * @return
  71. */
  72. Map.prototype.get = function(key) {
  73. var item = this[this.hash(key)];
  74. return item === undefined ? undefined : item.value;
  75. };
  76. /**
  77. * 向map中添加数据
  78. * @param key 键
  79. * @param value 值
  80. * @return
  81. */
  82. Map.prototype.put = function(key, value) {
  83. var hash = this.hash(key);
  84. if(this[hash] === undefined) {
  85. var item = { key : key, value : value };
  86. this[hash] = item;
  87. this.link(item);
  88. ++this._size;
  89. }else{
  90. this[hash].value = value;
  91. }
  92. return this;
  93. };
  94. /**
  95. * 通过key删除数据
  96. * @param key
  97. * @return
  98. */
  99. Map.prototype.remove = function(key) {
  100. var hash = this.hash(key);
  101. var item = this[hash];
  102. if(item !== undefined) {
  103. --this._size;
  104. this.unlink(item);
  105. delete this[hash];
  106. }
  107. return this;
  108. };
  109. /**
  110. * 清除map
  111. * @return
  112. */
  113. Map.prototype.clear = function() {
  114. while(this._size){
  115. this.remove(this.key());
  116. }
  117. return this;
  118. };
  119. /**
  120. * 处理队列
  121. * @param item
  122. * @return
  123. */
  124. Map.prototype.link = function(item) {
  125. if(this._size == 0) {
  126. item.prev = item;
  127. item.next = item;
  128. this.current = item;
  129. }else {
  130. item.prev = this.current.prev;
  131. item.prev.next = item;
  132. item.next = this.current;
  133. this.current.prev = item;
  134. }
  135. };
  136. Map.prototype.unlink = function(item) {
  137. if(this._size == 0){
  138. this.current = undefined;
  139. }else {
  140. item.prev.next = item.next;
  141. item.next.prev = item.prev;
  142. if(item === this.current){
  143. this.current = item.next;
  144. }
  145. }
  146. };
  147. /**
  148. * 获取下一个
  149. * @return
  150. */
  151. Map.prototype.next = function() {
  152. this.current = this.current.next;
  153. return this;
  154. };
  155. /**
  156. * 获取key
  157. * @return
  158. */
  159. Map.prototype.key = function() {
  160. return this.current.key;
  161. };
  162. /**
  163. * 获取value
  164. * @return
  165. */
  166. Map.prototype.value = function() {
  167. return this.current.value;
  168. };

测试代码如下:

  1. var l=10000;
  2. var map=new Map();
  3. var start=new Date().getTime();
  4. for(var i=0;i<l;i++){
  5. map.put("key_"+i,new Date());
  6. }
  7. var end=new Date().getTime();
  8. document.write("向map中添加了  "+l+" 个Date对象..........");
  9. document.write("<br/>");
  10. document.write("耗时  "+(end-start)+" 毫秒,map的长度为:"+map.size());
  11. document.write("<br/>");
  12. document.write("在map中提取全部数据..........");
  13. document.write("<br/>");
  14. start=new Date().getTime();
  15. for(var i=0;i<map.size();i++){
  16. map.get("key_"+i).getTime();
  17. }
  18. end=new Date().getTime();
  19. document.write("耗时  "+(end-start)+" 毫秒");
  20. document.write("<br/>");
  21. document.write("清空map..........");
  22. document.write("<br/>");
  23. start=new Date().getTime();
  24. map.clear();
  25. end=new Date().getTime();
  26. document.write("耗时  "+(end-start)+" 毫秒,map的长度为:"+map.size());
  27. document.write("<br/>");

测试结果如下: 
1.IE7

2.Firefox 3.6.8

3.谷歌浏览器5.0

方法next的使用:

  1. var map=new Map();
  2. map.put("key_1","value_1");
  3. map.put("key_2","value_2");
  4. map.put("key_3","value_3");
  5. var m=map.next();
  6. document.write("map.next:key="+m.key()+" value="+m.value());
  7. document.write("<br/>");
  8. m=map.next();
  9. document.write("map.next:key="+m.key()+" value="+m.value());

结果如下:

    1. map.next:key=key_2 value=value_2
    2. map.next:key=key_3 value=value_3

javascript 实现java中的Map的更多相关文章

  1. Map java中的map 如何修改Map中的对应元素

    Map java中的map 如何修改Map中的对应元素 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象.         Map的接口         Map ...

  2. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  3. Java中遍历Map集合的四种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  4. JAVA中关于Map的九大问题

    通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的.下面就以K和V来代表键和值,来说明一下java中关于Map的九大问题. 0.将Map转换为List类型 在java中Map接口提 ...

  5. java中遍历map对象的多种方法

    在Java中如何遍历Map对象   How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...

  6. java中遍历MAP,嵌套map的几种方法

    java中遍历MAP的几种方法 Map<String,String> map=new HashMap<String,String>();    map.put("us ...

  7. 谈谈java中遍历Map的几种方法

    java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...

  8. Java开发知识之Java中的Map结构

    Java开发知识之Java中的Map结构 一丶Map接口 Map没有实现Collection接口,提供的是Key 到Value的映射. Map中.不能包含相同的Key,每个Key只能映射一个Value ...

  9. Java中遍历map的四种方法 - 转载

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

随机推荐

  1. [Linux]vbox 虚拟机加入新磁盘

    情况是这种,開始创建虚拟机的时候硬盘设置太小了.仅仅有10g,我如今通过vbox的设置给这个linux(centos6.6)虚拟机加入了一块硬盘. 以下的操作就是怎么把硬盘挂载到系统中. 通过 fdi ...

  2. minigui杂项

    官方下载地址 MiniGUI简介 http://www.minigui.com/zhcn/download/ MiniGUI3.0.12 移植到mini2440 在海思hi3520上移植minigui ...

  3. ASP.NET MVC中权限控制的简单实现

    1.重写AuthorizeAttribute类,用自己的权限控制逻辑重写AuthorizeCore方法 public class MyAuthorizeAttribute : AuthorizeAtt ...

  4. UNIX网络编程读书笔记:UNIX域协议

    概述 UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API与在不同主机上执行客户/服务器通信所用的API(套接口API)相同.UNIX域协议可视为进程间通信 ...

  5. ERROR security.UserGroupInformation: Priviledge...

    http://my.oschina.net/u/617085/blog/71740 "Failed to set permissions of path"问题 参考文献:https ...

  6. GridLayout with span

    Widgets can span multiple columns or rows in a grid. In the next example we illustrate this. #!/usr/ ...

  7. Linux-软件包管理-yum在线管理-网络yum源

    cd /etc/yum.repos.d/  切换到etc目录下面的yum.repos.d这个目录中ls   查看当前linux系统的yum源文件信息,其中CentOS-Base.repo文件为默认的y ...

  8. C# 之 FTPserver中文件上传与下载(一)

            近期接手这样一个文件上传到ftpserver的一个功能,接下来就给大家解析一下这一功能. 首先,今天我们要讲的是怎么创建一个FTPserver. 1.首先我们创建一个用户,当然不想创建 ...

  9. querySelector与getElementBy等的区别

    获取元素DOM对象有很多种方法,以前一直在用getElementById和getElementsByTagName等,现在对这些方法和querySelector做一个总结. 常见的获取元素的方法有3种 ...

  10. poj1936

    非连续子串匹配题,直接模拟 /** \brief poj 1936 * * \param date 2014/8/5 * \param state AC * \return memory 804k t ...