您的位置:首页 > Web前端 > JavaScript

javascript实现java中的HashMap的功能

2014-07-30 14:24 369 查看
/**

* BruceXX

*/

function HashMap(){

var DEFAULT_CAPACITY=16;

var MAX_CAPACITY=2147483647;

var DEFAULT_LOAD_FACTOR=0.75;

/************ splitline ***************/

var loadFactor=DEFAULT_CAPACITY;

var threshold=DEFAULT_CAPACITY*DEFAULT_LOAD_FACTOR*1;

//entry table

var entryTable=new Array(DEFAULT_CAPACITY);

var size=0;

/**

* return null if no key exists, else return the newValue replaced..

*/

this.put=function(key,val){

if(key!=null){

var hash=newHash(hashCode(key));

var i=indexFor(hash,entryTable.length);

for(var obj=entryTable[i];obj!=null;obj=obj.next){

if(obj.hash==hash &&obj.key==key ){

var oldVal=obj.val;

obj.val=val;

return oldVal;

}

}

addEntry(hash,key,val,i);

return null;

}

};

/**

* remove the key element

*/

this.remove=function(key){

if(key!=null){

var hash=newHash(hashCode(key));

var i=indexFor(hash,entryTable.length);

var prev = entryTable[i];

var e = prev;

while (e != null) {

var next = e.next;

if (e.hash == hash && key==e.key) {

size--;

if (prev == e)

entryTable[i] = next;

else

prev.next = next;

if(e!=null)

return e.val;

}

prev = e;

e = next;

}

}

};

this.get=function(key){

if(key!=null){

var hash=newHash(hashCode(key));

var i=indexFor(hash,entryTable.length);

for(var obj=entryTable[i];obj!=null;obj=obj.next){

if(obj.hash==hash && obj.key==key ){

return obj.val;

}

}

}

};

this.containsKey=function(key){

if(key!=null){

var hash=newHash(hashCode(key));

var i=indexFor(hash,entryTable.length);

for(var obj=entryTable[i];obj!=null;obj=obj.next){

if(obj.key==key && obj.hash==hash ){

return true;

}

}

}

return false;

};

this.containsValue=function(value){

if(value!=null){

var tab = entryTable;

for (var i = 0; i < tab.length ; i++)

for (var e = tab[i] ; e != null ; e = e.next)

if (value.equals(e.val))

return true;

}

return false;

}

this.size=function(){

return size;

};

this.getkeylist=function(){

var tmpKey=new Array();

for(var i=0;i<entryTable.length;i++){

for(var obj=entryTable[i];obj!=null;obj=obj.next){

tmpKey.push(obj.key);

}

}

return tmpKey;

};

this.clear=function(){

//modCount++;

var t=entryTable;

for(var i=0;i<entryTable.length;i++)

t[i]=null;

size=0;

}

function addEntry(h,k,v,index){

var entry=entryTable[index];

var item={"hash":h,"key":k,"val":v,"next":entry};

entryTable[index]=item;

if(size++>=threshold){

resize(2*entryTable.length);

}

//alert(index+","+entryTable[index].next.hash);

};

function resize(newCapacity){

var newTable=new Array(newCapacity);

transfer(newTable);

entryTable=newTable;

threshold=newCapacity*loadFactor*1;

};

function transfer(newTable) {

var src = entryTable;

var newCapacity = newTable.length;

for (var j = 0,len=src.length; j <len; j++) {

var e = src[j];

if (e != null) {

src[j] = null;

do {

var next = e.next;

var i = indexFor(e.hash, newCapacity);

e.next = newTable[i];

newTable[i] = e;

e = next;

} while (e != null);

}

}

};

function indexFor(h,len){

return h&(len-1);

};

function newHash(h){

h += ~(h << 9);

h ^= (h >>> 14);

h += (h << 4);

h ^= (h >>> 10);

return h;

};

function hashCode(str){

var h = 0, off = 0;

var len = str.length;

for(var i = 0; i < len; i++){

var tmp=str.charCodeAt(off++);

h = 31 * h + tmp;

if(h>0x7fffffff || h<0x80000000){

h=h & 0xffffffff;

}

}

return h;

};

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: