【问题标题】:HashMap dont stay stable in androidHashMap 在 android 中不能保持稳定
【发布时间】:2016-08-17 13:37:04
【问题描述】:

您好,我试图在 HashMap 中保存一个对象,如果它不存在,而不是它存在,我想用新数据控制它的值。如果数据发生变化而不是我想做的事情。别的。但是每当我尝试比较新数据和哈希值时,我看到它们每次都是相同的。我该如何处理这个问题。有代码:

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);
        }
    }

【问题讨论】:

  • 提示:阅读 java 编码风格指南。变量名以小写字母开头。你应该使用能够说明变量意图的名称;所以...... Integer0 数组到底是什么?您会发现,仅凭您编写代码的方式就会到处造成混乱。
  • 那么:为了理解您的代码,我们需要查看您正在使用的变量的声明。
  • 添加了声明
  • tempInteger0 仍然丢失。并记录在案:转到帮助中心以了解如何编写“代码不工作”问题。提示:不是这样的。

标签: java android arrays hashmap


【解决方案1】:

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

!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 对象包含完全相同的 equal 元素时,它们是 equal

您会看到:您正在对数组使用等于来在代码中做出决定。因此,您要么更改为 ArrayLists;或者按照用户 hamsty 的建议使用 Arrays.equals()。

【讨论】:

  • 也许你是对的,但是当我调试它时,我可以看到它们是相同的。
  • 然后让我们改写一下:使用数组来完成这样的任务绝对是非常糟糕的做法;很有可能引起问题。
  • 我的问题是当扫描记录改变时 hashmap 会自动更新
  • 您的哈希图正在更新,因为您正在覆盖作为全局变量的 integer0,可能会创建一个本地数组。 equals 的情况总是相等的,因为您正在将数组与其自身进行比较。请记住,您只是在比较数组地址而不是它们的实际内容
  • fuadj 但第一次调用这个函数时,我在 else 语句中放了一个局部变量 LocalInteger0。
【解决方案2】:

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

下面的remove不是必须的,一个简单的put就会替换掉旧值

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

来自javadoc

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

您是否考虑过将字节 15-19 变成一个字符串并将它们添加到 maps 键中?这将消除数组比较并使查找速度更快。

【讨论】:

    【解决方案3】:
     !Integer0.equals(tempInteger0)) 
    

    是你的问题。

    用它来比较数组的内容:

    Arrays.equals(Integer0, tempInteger0)
    

    【讨论】:

    • 我的问题不是平等,任何问题都与哈希图有关。当扫描记录发生变化时,它会自动更新。
    【解决方案4】:

    问题在于以下事件序列:

    1. macId 不在mMacMap 中,将new byte[4]; 插入到地图中
    2. macIdmMacMap 中,由于另一个答案提到的数组比较问题,上一步中创建的数组永远不会匹配integer0,将映射中的macId 替换为对integer0 的引用
    3. macIdmMacMap 中,由于数组是对integer0 的引用,所以总是会比较正,内容不会再更新。
    4. 重复 3。

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

    1. Array#equals行为不直观,使用静态方法Arrays.equals
    2. Java 很大程度上基于引用,因此如果您将某些内容插入到映射中,它不会被复制,而只是创建一个新的引用;如果您之后更改共享对象(如数组),这可能会咬到您。

    【讨论】:

      猜你喜欢
      • 2015-08-02
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多