[英]HashMap dont stay stable in android
嗨我想在HashMap中保存一个对象,如果它不存在,那么如果它是exsit我想用新数据控制它的值。 如果数据发生变化而不是我想做的...... 其他。 但每当我试图比较新数据和哈希值时,我发现它们每次都是相同的。 我该如何处理这个问题。 有代码:
BluetoothLeDevice deviceLe;
private Map<String, byte[]> mMacMap;
byte [] integer0 =new byte[4];
byte[] tempInteger0=new byte[4];
public void addSensor(String macId, BluetoothLeDevice deviceLe) {
byte [] addSensorrecord=deviceLe.getScanRecord();
int j=0;
for(int i=15;i<19;i++)
{
integer0 [j]=addSensorrecord[i];
j++;
}
if (mMacMap.containsKey(macId)) {
tempInteger0 = mMacMap.get(macId);
if(!integer0 .equals(tempInteger0))
{
mMacMap.remove(macId);
mMacMap.put(macId, integer0 );
new SendBLEData().execute(deviceLe);
}
} else {
final byte [] LocalInteger0=new byte[4];
int t=0;
for(int i=15;i<19;i++)
{
LocalInteger0[t]=addSensorrecord[i];
t++;
}
mMacMap.put(macId, LocalInteger0);
new SendBLEData().execute(deviceLe);
}
}
我猜,你的问题在这里:
!Integer0.equals(tempInteger0))
我想你想比较两个数组; 你会惊讶地发现它们总是与众不同......
您的问题是:数组上的equals()不会对数组内容进行比较。 换句话说:如果你要比较的数组是一个且相同的话,这个对equals()的调用只给出“true”,如:
int a[] = { 1 };
int b[] = a;
int c[] = { 1 };
这里:
a.equals(b) --> true
但
a.equals(c) --> false
在比较数组内容时,您应该使用ArrayList。 因为两个ArrayList对象在包含完全相同的相等元素时是相等的 。
你会看到:你在数组上使用等于你的代码做出决定。 所以,你要么改为ArrayLists; 或者使用Arrays.equals()作为用户hamsty建议。
只是添加了已经发布的答案。
删除下面没有必要,简单的put将替换旧值
mMacMap.remove(macId);
mMacMap.put(macId, integer0 );
来自javadoc
如果映射先前包含键的映射,则旧值将替换为指定的值。 (当且仅当m.containsKey(k)返回true时,地图m才包含密钥k的映射。)
您是否考虑将字节15-19转换为字符串并将其添加到地图键中? 这将消除阵列比较并使查找更快。
!Integer0.equals(tempInteger0))
是你的问题。
用它来比较数组的内容:
Arrays.equals(Integer0, tempInteger0)
问题是以下一系列事件:
macId
不在mMacMap
,插入new byte[4];
进入地图 macId
中的mMacMap
,由于其他答案提到的数组比较问题,上一步创建的数组永远不会匹配integer0
,使用对macId
的引用替换地图中的integer0
macId
中的mMacMap
,因为该数组是对integer0
的引用,它将始终进行正比较,并且内容将不再更新。 基本上由这两个问题引起:
Array#equals
行为不直观,使用静态方法Arrays.equals
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.