繁体   English   中英

HashMap在android中保持稳定

[英]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)

问题是以下一系列事件:

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

基本上由这两个问题引起:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM