javascript实现java中的Map,代码是在国外的一个网站上看到的(http://stackoverflow.com/questions/368280/javascript-hashmap-equivalent
),自己稍作了修改,之前也看到过有人用2个数组实现了Map,但是我感觉效率比较低,现在这个我感觉效率还可以,自己做了下测试,代码如下:
Map.js
function Map(linkItems) {
this.current = undefined;
this._size = 0;
if(linkItems === false){
this.disableLinking();
}
}
/**
* 获取当前map
* @return 当前对象
*/
Map.noop = function() {
return this;
};
/**
* 非法操作
* @return
*/
Map.illegal = function() {
throw new Error("非法操作,Map已经被禁用");
};
/**
*
* @param obj
* @param foreignKeys
* @return
*/
Map.from = function(obj, foreignKeys) {
var map = new Map;
for(var prop in obj) {
if(foreignKeys || obj.hasOwnProperty(prop)){
map.put(prop, obj[prop]);
}
}
return map;
};
/**
* 禁用map
* @return
*/
Map.prototype.disableLinking = function() {
this.link = Map.noop;
this.unlink = Map.noop;
this.disableLinking = Map.noop;
this.next = Map.illegal;
this.key = Map.illegal;
this.value = Map.illegal;
this.clear = Map.illegal;
return this;
};
/**
* 返回hash值 例如:number 123
* @param value key/value
* @return
*/
Map.prototype.hash = function(value) {
return (typeof value) + ' ' + (value instanceof Object ? (value.__hash || (value.__hash = ++arguments.callee.current)) : value.toString());
};
/**
* 返回map的长度
* @return
*/
Map.prototype.size = function() {
return this._size;
};
Map.prototype.hash.current = 0;
/**
* 通过key获取value
* @param key
* @return
*/
Map.prototype.get = function(key) {
var item = this[this.hash(key)];
return item === undefined ? undefined : item.value;
};
/**
* 向map中添加数据
* @param key 键
* @param value 值
* @return
*/
Map.prototype.put = function(key, value) {
var hash = this.hash(key);
if(this[hash] === undefined) {
var item = { key : key, value : value };
this[hash] = item;
this.link(item);
++this._size;
}else{
this[hash].value = value;
}
return this;
};
/**
* 通过key删除数据
* @param key
* @return
*/
Map.prototype.remove = function(key) {
var hash = this.hash(key);
var item = this[hash];
if(item !== undefined) {
--this._size;
this.unlink(item);
delete this[hash];
}
return this;
};
/**
* 清除map
* @return
*/
Map.prototype.clear = function() {
while(this._size){
this.remove(this.key());
}
return this;
};
/**
* 处理队列
* @param item
* @return
*/
Map.prototype.link = function(item) {
if(this._size == 0) {
item.prev = item;
item.next = item;
this.current = item;
}else {
item.prev = this.current.prev;
item.prev.next = item;
item.next = this.current;
this.current.prev = item;
}
};
Map.prototype.unlink = function(item) {
if(this._size == 0){
this.current = undefined;
}else {
item.prev.next = item.next;
item.next.prev = item.prev;
if(item === this.current){
this.current = item.next;
}
}
};
/**
* 获取下一个
* @return
*/
Map.prototype.next = function() {
this.current = this.current.next;
return this;
};
/**
* 获取key
* @return
*/
Map.prototype.key = function() {
return this.current.key;
};
/**
* 获取value
* @return
*/
Map.prototype.value = function() {
return this.current.value;
};
测试代码如下:
-
var l=
10000
;
-
var map=
new
Map();
-
var start=
new
Date().getTime();
-
for
(var i=
0
;i<l;i++){
-
map.put(
"key_"
+i,
new
Date());
-
}
-
var end=
new
Date().getTime();
-
document.write(
"向map中添加了 "
+l+
" 个Date对象.........."
);
-
document.write(
"<br/>"
);
-
document.write(
"耗时 "
+(end-start)+
" 毫秒,map的长度为:"
+map.size());
-
document.write(
"<br/>"
);
-
document.write(
"在map中提取全部数据.........."
);
-
document.write(
"<br/>"
);
-
start=
new
Date().getTime();
-
for
(var i=
0
;i<map.size();i++){
-
map.get(
"key_"
+i).getTime();
-
}
-
end=
new
Date().getTime();
-
document.write(
"耗时 "
+(end-start)+
" 毫秒"
);
-
document.write(
"<br/>"
);
-
document.write(
"清空map.........."
);
-
document.write(
"<br/>"
);
-
start=
new
Date().getTime();
-
map.clear();
-
end=
new
Date().getTime();
-
document.write(
"耗时 "
+(end-start)+
" 毫秒,map的长度为:"
+map.size());
-
document.write(
"<br/>"
);
var l=10000;
var map=new Map();
var start=new Date().getTime();
for(var i=0;i<l;i++){
map.put("key_"+i,new Date());
}
var end=new Date().getTime();
document.write("向map中添加了 "+l+" 个Date对象..........");
document.write("<br/>");
document.write("耗时 "+(end-start)+" 毫秒,map的长度为:"+map.size());
document.write("<br/>");
document.write("在map中提取全部数据..........");
document.write("<br/>");
start=new Date().getTime();
for(var i=0;i<map.size();i++){
map.get("key_"+i).getTime();
}
end=new Date().getTime();
document.write("耗时 "+(end-start)+" 毫秒");
document.write("<br/>");
document.write("清空map..........");
document.write("<br/>");
start=new Date().getTime();
map.clear();
end=new Date().getTime();
document.write("耗时 "+(end-start)+" 毫秒,map的长度为:"+map.size());
document.write("<br/>");
测试结果如下:
1.IE7
2.Firefox 3.6.8
3.谷歌浏览器5.0
方法next的使用:
-
var map=
new
Map();
-
map.put(
"key_1"
,
"value_1"
);
-
map.put(
"key_2"
,
"value_2"
);
-
map.put(
"key_3"
,
"value_3"
);
-
var m=map.next();
-
document.write(
"map.next:key="
+m.key()+
" value="
+m.value());
-
document.write(
"<br/>"
);
-
m=map.next();
-
document.write(
"map.next:key="
+m.key()+
" value="
+m.value());
var map=new Map();
map.put("key_1","value_1");
map.put("key_2","value_2");
map.put("key_3","value_3");
var m=map.next();
document.write("map.next:key="+m.key()+" value="+m.value());
document.write("<br/>");
m=map.next();
document.write("map.next:key="+m.key()+" value="+m.value());
结果如下:
-
map.next:key=key_2 value=value_2
-
map.next:key=key_3 value=value_3
分享到:
相关推荐
在Java编程中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。本文将深入探讨如何在不依赖第三方库的情况下,实现JSON与Java对象(如Map、List)之间的互换。我们将分析...
在某些场景下,如果需要兼容JavaScript或者使用类似的方法,可能会使用`Object.keys(map).length`,但这是JavaScript中的写法,在Java中并不适用。 3. **Java 8及Lambda表达式遍历Map** 自Java 8开始,引入了...
在编程领域,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于服务器与客户端之间的...通过理解和应用这些知识,开发者可以有效地在Java项目中实现JSON与Map的互换,并保证数据的标准化表示。
在Web开发中,Ajax(Asynchronous JavaScript and XML)和JSON(JavaScript Object Notation)是两种常用的技术,用于实现页面的异步数据交互和数据传输。Java作为后端服务器语言,常与它们配合处理数据,尤其是当...
通过以上步骤,我们可以利用 `json-lib` 实现 JSON 与 Java 对象的高效互转。这个库不仅提供了基本的转换功能,还支持自定义转换规则和处理复杂的数据结构,是 Java 开发中的实用工具。在实际开发中,根据具体需求...
总结来说,为了在JavaScript中实现类似于Java Map的功能,我们可以选择自定义对象或使用ES6的Map数据结构。自定义对象简单易懂,适用于不涉及复杂操作的情况;而ES6的Map则提供了更为强大和标准的API,适用于大型...
总结一下,Map和Object互转以及Map和JSON互转是Java Web开发中常见的需求。前者可以通过反射、Apache Commons BeanUtils或者Introspector类来实现,而后者则可以使用专门的JSON处理库如Gson、Jackson或Fastjson。...
本源码提供了一个基于JavaScript和Java的电影院管理系统的设计。项目包含2138个文件,其中包括954个JavaScript...该项目旨在为电影院提供高效的管理服务,通过JavaScript和Java技术实现,以提升用户体验和操作便捷性。
根据提供的文件信息,本文将详细解释如何在JavaScript中模拟Java中的`Map`功能,并实现一组基本的操作方法。这种做法有助于理解两种语言之间处理键值对数据结构的不同方式,并且能够帮助开发者利用JavaScript来构建...
本系统是一款基于JavaScript、Java和CSS的Java_web豪车租车信息管理系统源码,总计包含334个文件,其中包括176个JavaScript文件、80个Java文件、33个JSP文件、16个CSS文件、11个JPG文件、5个PNG文件、4个MAP文件、1...
以上就是Java中实现数据分页显示的关键点,涉及数据库查询、参数传递、前端渲染等多个环节。实践中,我们需要结合具体的应用场景和性能需求,选择合适的方法和工具来实现高效、友好的分页功能。
在现代Web开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java应用中,经常会遇到需要将Java对象或集合等数据结构转换为JSON字符串的需求...
Java 8引入了Nashorn JavaScript引擎,允许Java程序直接执行JavaScript代码,实现Java和JavaScript之间的互操作。 十、Type注解 Java 1.8允许在类型上使用注解,增强了编译时和运行时的类型检查,如@NonNull用于...
在这个特定的场景中,"REST_JavaMap_Req_java_JSON_" 提示我们讨论的是如何在Java中使用Map对象作为REST请求的数据模型,并通过JSON(JavaScript Object Notation)进行序列化和反序列化。JSON是一种轻量级的数据...
本项目是基于JavaScript和Java的学生宿舍管理系统设计源码,包含320个文件,其中包括200个JavaScript文件、35个Java源文件、23个CSS样式文件、14个LESS样式文件、14个SCSS样式文件、11个MAP文件、4个HTML文件、2个...
Java中的JSON转换是开发过程中常见的任务,特别是在与服务器进行数据交互时。JSON(JavaScript Object ...通过使用适当的库和理解转换机制,你可以轻松地在Java对象和JSON格式之间进行转换,实现高效的数据交换。
在Java开发中,数据交换和存储经常涉及XML、JSON以及List和Map之间的转换。XML(eXtensible Markup Language)是一种用于标记数据的格式,而JSON(JavaScript Object Notation)则是一种轻量级的数据交换格式,两者...
下面将详细介绍这款工具的实现原理、功能以及相关的Java编程知识点。 1. **Java基础** Java是一种跨平台的编程语言,具有“一次编写,到处运行”的特性。它的面向对象特性使得开发像单位换算工具这样的应用变得...
Direct Web Remoting (DWR) 是一个开源的Java库,它允许JavaScript在浏览器端与服务器端的Java对象进行交互,实现Ajax应用。这个"dwR练习实例(各种数据转换list,map,数组等)"是一个用于学习DWR如何处理和转换不同...
在Java中,我们经常需要将JSON字符串与Map对象互相转换,以便处理数据。本篇文章将详细探讨使用Jackson库和json-lib库这两种流行的方式进行转换,并分析它们之间的差异。 **一、Jackson库** Jackson是Java开发的高...