java - 如何检测列表是否已更改?

标签 java hash mutable

我在一个鲜为人知的专有框架管理的类中有一个 List 字段。

注释 @BindMagic 由框架管理,因此底层列表有时会发生变化:它可能会被重新创建,或者它的元素可能会发生变化。

class SharedEntity{

  @BindMagic // this annotation does a magic that we cannot control
  private List<Map<String,Object>> values;

  public boolean isChangedSincePreviousCall(){
    // check if "values" have changed since the previous call of this method          
  }
}

我同意这是一个糟糕的设计,但让我们假设没有可能影响它。

不时(不是每次突变)需要检查列表是否已更改。例如,我想用 isChangedSincePreviousCall 方法来完成。 也许,像哈希和这样的东西会很好。但我很好奇是否有更好的方法。

检测列表是否更改的最佳做法是什么?

最佳答案

使用散列不是确定的,因为可以从不同的输入生成相同的散列,尽管这种可能性很小。

“被改变”和“与众不同”意味着不同的事情。考虑其中一个映射中的条目,该条目从 "A"-> 1 更改为 "A"-> 2 然后返回到 "A"-> 1 在对您的方法的调用之间再次调用 - 它已更改但没有不同。我假设你的意思是“不同”。

检查时复制一份,并与当前状态进行比较。假设 map 值为 immutable :

class SharedEntity {

    @BindMagic
    private List<Map<String, Object>> values;
    private List<Map<String, Object>> valuesCopy;

    public boolean isChangedSincePreviousCall() {
        newCopy = new ArrayList<>(values);
        boolean result = !Objects.equals(valuesCopy, newCopy);
        valuesCopy = newCopy;
        return result;
    }
}

如果 Map 值是(或包含)可变对象,则您必须在创建副本时对它们进行深度复制。

仅供引用 Objects#equals()如果两个参数都为空,则返回 true

关于java - 如何检测列表是否已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56661418/

相关文章:

python - 如何测试可变的隐含结果?

rust - 迭代递归结构时无法获取可变引用 : cannot borrow as mutable more than once at a time

c++ - Boost-range 不适用于 C++1y init-capture 可变 lambda

Linux/X11下的Java keyPress/keyRelease问题

java - 迭代数组并打印不同的字符串输出

c++ - 什么哈希算法用于快速文件哈希?

hash - 根据已知的输入和输出对哈希函数进行逆向工程

项目之间共享的 Java 域对象

java - EntityManager 未注入(inject)

Ruby:使用默认键+数组值创建散列