【问题标题】:contains method for list of array of bytes包含字节数组列表的方法
【发布时间】:2015-01-06 22:58:38
【问题描述】:

所以我有一个列表List<byte[]> 可以说是“fullList”,因此其他一些代码会生成另一个包含一些byte[] partialList 的列表。所以我使用.contain 方法,它总是无法从fullList 中搜索得到的部分列表中的字节[]。这是为什么呢??

List<byte[]> fullList = {some byte[] arrays added here..}
List<byte[]> partialList = {some byte[] arrays added here..}

byte[] toCheck = partialList.get(0);
System.out.println("The check is "+ fullList.contains(tocheck));

【问题讨论】:

  • 因为它不在列表中?
  • 我知道 byte[] 应该在列表中。我正在生成它们。
  • 您使用不同的代码生成两个列表。然后拉出元素并询问它是否在 third 列表中(leafs)。并提供no关于这些列表中任何内容的信息。
  • 抱歉,已重命名。列表包含一些使用 jaxb 解析的 xml 文档的哈希值。
  • 除非我弄错了,Java 数组不能正确实现 equals,因此只有当它们是完全相同的对象引用时,才会认为两个 byte[] 相等。如果这些是散列的,请尝试将这些 byte[] 编码为 IntegerLong

标签: java list bytearray contains


【解决方案1】:

问题在于 Java 数组 do not implement equals properly,即两个数组只有在它们的内存地址相同时才被认为是“相等的”,即它们是完全相同的对象引用。

byte[] foo = {1,2,3};
byte[] bar = {1,2,3};
System.out.println(foo.equals(bar)); // prints 'false'

要解决此问题,您可以将这些byte[] 编码为数字并改用List&lt;Integer&gt;(或Long),或者使用Arrays.equals 实现您自己的包含方法

boolean contains(List<byte[]> arrays, byte[] other) {
    for (byte[] b : arrays)
        if (Arrays.equals(b, other)) return true;
    return false;
}

【讨论】:

  • 因此,对于我得到的每个 sha-256 哈希(我用它填充列表),我将它编码为一些数字。好的,谢谢..
猜你喜欢
  • 2019-08-13
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
相关资源
最近更新 更多