情景上這樣的:我有一個重寫了equals方法的類,該類源碼如下。然后用一程序將此類多次循環put到HashMap中去,但每次put到1500次左右時,就會出現NullPointerException。
在map.put的方法中,會先去判斷put進去的對象是否已經存在于map中,判斷方法調用的就是該對象的重寫的equals方法,如果說我寫的equals有問題的話,為什么前1000多次左右不會出現問題而在最后出現問題呢?起初以為是放到HashMap中的對象太大會出現內存溢出,但并未出現outofmemory異常,用JProfiler進行監測時也發現和heap的使用也沒關系……有哪位兄弟幫我解釋一下……
重寫了equals方法的類:
public class myPolSchema {
// @Field
private String GrpContNo;
private String GrpPolNo;

public String getGrpContNo() {
return GrpContNo;
}

public void setGrpContNo(String aGrpContNo) {
GrpContNo = aGrpContNo;
}

public String getGrpPolNo() {
return GrpPolNo;
}

public void setGrpPolNo(String aGrpPolNo) {
GrpPolNo = aGrpPolNo;
}

public boolean equals(Object otherObject) {
if (this == otherObject)
return true;
if (otherObject == null)
return false;
if (getClass() != otherObject.getClass())
return false;
myPolSchema other = (myPolSchema) otherObject;
return GrpContNo.equals(other.getGrpContNo())
&& GrpPolNo.equals(other.getGrpPolNo());
}
}
測試類:
import java.util.* ;
public class MultiThreading{
// implements Runnable
Map m=Collections.synchronizedMap(new HashMap());
//HashMap m=new HashMap();
Hashtable t=new Hashtable();
public myPolSchema polschema;
public void run()
{
polschema=new myPolSchema();
m.put(polschema, "UPDATE");
System.out.println("put end at " + new Date());
}
public static void main(String[] args) throws Exception {
MultiThreading t=new MultiThreading();
for(int i=0;i<=25000;i++){
try{
t.run();
//Thread.sleep(100);
}
catch(Exception ex){
//在我本地測試時當運行大概1500左右次的時間就會拋出NullPointerException
System.out.println("i is: " + i);
throw ex;
}
}
}

}
如果您有興趣,請下載這兩個類的源碼并實際測試:
/Files/foxinsky/sourceCode.rar
如果哪位兄臺有好的解決方案,請不吝賜教!
在map.put的方法中,會先去判斷put進去的對象是否已經存在于map中,判斷方法調用的就是該對象的重寫的equals方法,如果說我寫的equals有問題的話,為什么前1000多次左右不會出現問題而在最后出現問題呢?起初以為是放到HashMap中的對象太大會出現內存溢出,但并未出現outofmemory異常,用JProfiler進行監測時也發現和heap的使用也沒關系……有哪位兄弟幫我解釋一下……
重寫了equals方法的類:

































測試類:





























如果您有興趣,請下載這兩個類的源碼并實際測試:
/Files/foxinsky/sourceCode.rar
如果哪位兄臺有好的解決方案,請不吝賜教!