HashMap在android中保持稳定

时间:2016-08-17 13:37:04

标签: java android arrays hashmap

嗨我想在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);
        }
    }

4 个答案:

答案 0 :(得分:2)

我猜,你的问题就在这里:

!Integer0.equals(tempInteger0))

你要比较两个数组;你会惊讶地发现它们总是不同......

你的问题是:数组上的equals()没有对数组内容进行比较。换句话说:这个对equals()的调用只给出&#34; true&#34;如果您要比较的数组是同一个,例如:

  int a[] = { 1 };
  int b[] = a;
  int c[] = { 1 };

下面:

 a.equals(b) --> true

 a.equals(c) --> false

在比较数组内容时,您应该使用ArrayList。因为两个ArrayList对象相等,因为它们包含完全相同的相等元素。

你会看到:你在数组上使用等于你的代码做出决定。所以,你要么改为ArrayLists;或者使用Arrays.equals()作为用户hamsty建议。

答案 1 :(得分:1)

只是对已发布的答案进行了一些补充。

下面的删除不是必需的,简单的put将替换旧值

mMacMap.remove(macId);
mMacMap.put(macId, integer0 );

来自javadoc

  

如果地图以前包含该键的映射,则为旧值   由指定的值替换。 (据说地图m包含一个   当且仅当m.containsKey(k)将返回时,映射键k   真。)

您是否考虑过将字节15-19转换为字符串并将其添加到地图键上?这将消除数组比较并使查找更快。

答案 2 :(得分:0)

 !Integer0.equals(tempInteger0)) 

是你的问题。

用它来比较数组的内容:

Arrays.equals(Integer0, tempInteger0)

答案 3 :(得分:0)

问题是以下一系列事件:

  1. macId不在mMacMap,将new byte[4];插入地图
  2. macId中的
  3. mMacMap,由于其他答案提到的数组比较问题,上一步创建的数组永远不会匹配integer0,请替换地图中的macId引用integer0
  4. macId位于mMacMap,因为数组是integer0的引用,它将始终进行正比较,内容将不再更新。
  5. 重复3次。
  6. 基本上由这两个问题引起:

    1. Array#equals行为不直观,请使用静态方法Arrays.equals
    2. Java是基于参考的,所以如果你在地图中插入一些内容,它就不会被复制,而只是创建一个新的引用;如果您之后更改了共享对象(如数组),这可能会让您感到厌烦。