深刻理解IdentityHashMap

2021-08-28 01:34:00 字數 2458 閱讀 9064

新建pojo

package test;

public class cat

public string getname()

public void setname(string name)

public integer getage()

public void setage(integer age)

public boolean equals(object obj)

if (!(obj instanceof cat))

cat p = (cat) obj;

if (this.name.equals(p.name) && this.age == p.age) else

}public int hashcode()

public string tostring()

}

測試:

public class testmap  )

public static void main(string args)

//hashmap

map mpx = new hashmap();

mpx.put(new cat("kitty",1), "kitty_1");

mpx.put(new cat("jime",2), "jime_2");

mpx.put(new cat("kitty",1), "kitty_2");

set> allsetx = mpx.entryset();

iterator> iterx = allsetx.iterator();

while (iterx.hasnext())

system.out.println("**********====identityhashmap:");

//identityhashmap

map imp = new identityhashmap();

imp.put(new cat("kitty",1), "kitty_1");

imp.put(new cat("jime",2), "jime_2");

imp.put(new cat("kitty",1), "kitty_2");

set> iset = imp.entryset();

iterator> iterxx = iset.iterator();

while (iterxx.hasnext())

}}

控制台輸出:

2 --> t

1 --> t

姓名:jime;年齡:2 --> jime_2

姓名:kitty;年齡:1 --> kitty_2

**********====identityhashmap:

姓名:kitty;年齡:1 --> kitty_2

姓名:kitty;年齡:1 --> kitty_1

姓名:jime;年齡:2 --> jime_2

檢視hashmap的put(k,v)

public v put(k key, v value) 

}modcount++;

addentry(hash, key, value, i);

return null;

}

檢視:identityhashmap.put(object obj, object obj1)

public object put(object obj, object obj1)

modcount++;

aobj[j] = obj2;

aobj[j + 1] = obj1;

if(++size >= threshold)

resize(i);

return null;

}

總結:[color=blue]1.簡單說identityhashmap與常用的hashmap的區別是:

前者比較key時是「引用相等」而後者是「物件相等」,即對於k1和k2,當k1==k2時,

identityhashmap認為兩個key相等,而hashmap只有在k1.equals(k2) == true 時才會認為兩個key相等。

2.identityhashmap 允許使用null作為key和value. 不保證任何key-value對的之間的順序,

更不能保證他們的順序隨時間的推移不會發生變化。

3.identityhashmap有其特殊用途,比如序列化或者深度複製。或者記錄物件**。

舉個例子,jvm中的所有物件都是獨一無二的,哪怕兩個物件是同乙個class的物件

,而且兩個物件的資料完全相同,對於jvm來說,他們也是完全不同的,

如果要用乙個map來記錄這樣jvm中的物件,你就需要用identityhashmap,而不能使用其他map實現[/color]

深刻理解IdentityHashMap

新建pojo package test public class cat public string getname public void setname string name public integer getage public void setage integer age public...

JS深刻理解補充

對於函式的理解,首先看乙個函式定義 function functiondefined 顯而易見,functiondefined 為函式名字,在js中為指向這個函式體的指標,代表這個函式的指標的變數,並且和原始資料型別一樣儲存在棧中。而functiondefined函式體則儲存在堆中。每當new出乙個...

深刻理解fork呼叫

fork 是linux中的系統呼叫函式,用於建立程序,建立失敗返回 1,建立成功會返回兩次 不是返回了兩個值,而是返回了兩次 需要注意的是fork呼叫一次返回兩次 對父程序而言它返回的是子程序的id,對子程序而言它返回0。子程序是父程序的副本,它將獲得父程序資料空間 堆 棧等資源的副本。注意,子程序...