我已经声明并初始化了这些哈希表:
Hashtable<String,Integer> ht = new Hashtable<String,Integer>();
ht.put("due", 2);
ht.put("tre", 3);
ht.put("uno", 1);
Hashtable<String,Integer> ht = new Hashtable<String,Integer>();
ht.put("dodici", 12);
ht.put("tredici",13);
ht.put("nove", 9);
ht.put("dieci", 10);
我想使用JDI从哈希表中提取值来比较元素对,我有一个方法,它具有参数ArrayReference s0,s1 ArrayReference,参数parameter1,parameter2参数:
if(parameter1.getType().name().equals("java.util.Hashtable")){
System.out.println(" - Hashtable/HashMap - ");
ObjectReference o = (ObjectReference) parameter1.getValue();
ObjectReference o2 = (ObjectReference) parameter2.getValue();
ClassType ct = (ClassType) o.type();
System.out.println("ct "+ ct.allFields());
Value x=o.getValue(ct.fieldByName("table") ); // hashtable.Entry
Value y=o2.getValue(ct.fieldByName("table"));
System.out.println(y.toString());
System.out.println(o.getValue(ct.fieldByName("table")));
Parameter p1 =new Parameter(ct.fieldByName("table").name(),x.type(),x);
Parameter p2 =new Parameter(ct.fieldByName("table").name(),y.type(),y);
if(p1 != null && p2!=null)
distObject = getDistanceCollections(p1,p2);
}
...
else if(s0.getValue(i-1).type().name().equals("java.util.Hashtable$Entry")){
ObjectReference ox = (ObjectReference) s0.getValue(i-1);
ObjectReference oy = (ObjectReference) s1.getValue(j-1);
ClassType ct = (ClassType) ox.type();
ClassType ct2 = (ClassType) oy.type();
System.out.println("ct field Entry: "+ct + ct.allFields());
Value keyx= ox.getValue(ct.fieldByName("key"));
Value valuex= ox.getValue(ct.fieldByName("value"));
Value keyy= oy.getValue(ct2.fieldByName("key"));
Value valuey= oy.getValue(ct2.fieldByName("value"));
if(s0.getValue(i-1).type().name().equals("java.util.Hashtable$Entry")){
Parameter p1 =new Parameter(ct.fieldByName("value").name(),valuex.type(),valuex);
Parameter p2 =new Parameter(ct2.fieldByName("value").name(),valuey.type(),valuey);
if(p1 != null && p2!=null)
match = getDistanceCollections(p1,p2);
}
...
for (int j = 1; j < len1; j++) {
System.out.println( s1.getValue(j-1));
}
for (int i = 1; i < len0; i++)
System.out.println( s0.getValue(i-1));
...
else if(typeName.equals("java.lang.Integer")
||typeName.equals("java.lang.Boolean")
||typeName.equals("java.lang.Double")
||typeName.equals("java.lang.Float")
||typeName.equals("java.lang.Byte")
||typeName.equals("java.lang.Long")
||typeName.equals("java.lang.Short")
||typeName.equals("java.lang.Character")){
Value x=o.getValue(ct.fieldByName("value")); //Integer.value
Value y=o2.getValue(ct2.fieldByName("value"));
System.out.println("Valori: x = "+x+" y ="+y);
distObject = (double) getDistancePrimitive(x.type(), x,y.type(),y);
double matchInternal= distObject;
...
问题是在提取值时我会丢失一个元素。此元素不在内存中。 Java版本:1.8.0_40
输出: http://i.imgur.com/BrqctVj.gif
有谁知道如何解决?
答案 0 :(得分:0)
Hashtable对象根据键的哈希值将对键值存储在表中。如果两个不同的键具有相同的哈希值,则第二个值将存储为该哈希值的下一个值。
您可以在此处查看图形示例:hashTable
当你使用JDI时,如你的例子中你有“java.util.Hashtable”,你必须提取字段表(你是怎么做的),然后你将获得一个“java.util.Hashtable $ Entry”classType。
此类型有4个字段 java.util.Hashtable $ Entry.hash,java.util.Hashtable $ Entry.key,java.util.Hashtable $ Entry.value,java.util.Hashtable $ Entry.next , 现在你只处理键和值,并且因为你不考虑 next 字段而丢失了一个值。