Java字节集

时间:2010-08-07 09:41:16

标签: java

任何人都可以帮助我知道如何在Java中使用“Set”字节? 谢谢

4 个答案:

答案 0 :(得分:10)

Java Collections Framework 中的

Set<Byte>选项

如果您想利用Java Collections Framework,可以拥有java.util.Set<Byte>。不幸的是,Java泛型不适用于原语。 java.lang.Bytebyte的框类型。也许您可以使用的实现是TreeSet;它是SortedSet,因此您可以按照自然顺序对(盒装)byte进行排序。

另见

相关问题


BitSet性能选项

另一个选项是java.util.BitSet。这是一个非常节省时间和空间的数据结构,它使用位实现集合表示,即如果设置了位int ii就是“在集合中”。

BitSet不是Java Collections Framework的一部分。

以下是一个示例用法:

    BitSet bytes = new BitSet();

    bytes.set(3);
    bytes.set(7);
    bytes.set(11);
    bytes.set(11);
    bytes.set(1000);

    System.out.println(bytes);
    // {3, 7, 11, 1000}

    System.out.println(bytes.cardinality()); // 4

    System.out.println(bytes.get(10)); // false

请注意,您可能set位超出byte范围。

实际上,您不能直接set byte范围内的所有位,因为byte是Java中的签名数据类型。您可以使用位屏蔽将byte范围内的任何int转换为0..255,如下所示:

    byte b = -1;
    // bytes.set(b); // throws IndexOutOfBoundsException
    bytes.set(b & 0xFF);
    System.out.println(bytes);
    // {3, 7, 11, 255, 1000}

然后,您可以按如下方式迭代集合中的所有byte

    for (int i = -1; (i = bytes.nextSetBit(i + 1)) != -1; ) {
        byte b = (byte) i;
        System.out.println(b);
    }
    // 3, 7, 11, -1, -24

请注意,由于byte [-128,127]int [0,255]的映射,在积极情况之后会出现负数。 BitSet还有助于针对其他BitSet进行有效的设置操作,例如orandxorequalsintersects

相关问题

答案 1 :(得分:4)

正如多基因润滑剂所说,你可以拥有Set<Byte>。另一个简单的替代方案是:

boolean[] byteSet = new boolean[256];

检查或设置每个值非常有效 - 迭代这组值只需要256次迭代:)

答案 2 :(得分:3)

您可以拥有Set<Byte>但不能拥有Set<byte>,字节是对象,字节是基元。如果你创建了一组Byte,那么你可以为它添加字节值,它们会在运行时自动装入Bytes,为你提供预期的结果。

    Set<Byte> byteSet = new HashSet<Byte>();
    byte b1 = 1;
    Byte b2 = 1;
    byte b3 = 2;
    byteSet.add(b1);
    byteSet.add(b2);
    byteSet.add(b3);
    System.out.println(byteSet);

输出:

[1, 2]

应该注意的是,尽管这种方法非常清晰并且使用了熟悉的Java Collections Framework,但是如果你在集合上做了很多工作,自动装箱可能会成为一个性能问题 - 但要看到这个效果你真的不得不锤击它。

已经提出了更多高效的替代品,例如polygenelubricants的java.util.BitSet或Jon Skeet的阵列解决方案。

答案 3 :(得分:1)

如果您经常需要包含基本类型的集合,请查看Primitive Collections for Java。它实现了每种基本类型的主要集合类型,与使用包装器Byte类相比,它应该更快,内存效率更高。

其他类似的库也可用。