Java字节集

Java字节集,java,Java,有人能帮我知道如何在Java中获得一组字节吗? 谢谢您从Java集合框架中设置选项 如果您想利用Java集合框架,您可以使用一个。不幸的是,Java泛型不能与primitive一起工作。是字节的框类型。也许您可以使用的实现是;它是一个,因此您可以按其自然顺序对(装箱的)字节进行排序 另见 相关问题 (是的,很不幸) 位集性能选项 另一个选择是一种新的方法。这是一种非常节省时间和空间的数据结构,它使用位实现集合表示,即,如果设置了位i,则int i是“在集合中” 位集不是Java集合

有人能帮我知道如何在Java中获得一组字节吗? 谢谢您

从Java集合框架中设置
选项 如果您想利用Java集合框架,您可以使用一个。不幸的是,Java泛型不能与primitive一起工作。是
字节
的框类型。也许您可以使用的实现是;它是一个,因此您可以按其自然顺序对(装箱的)
字节进行排序

另见
相关问题
  • (是的,很不幸)

位集
性能选项 另一个选择是一种新的方法。这是一种非常节省时间和空间的数据结构,它使用位实现集合表示,即,如果设置了位
i
,则
int i
是“在集合中”

位集
不是Java集合框架的一部分

下面是一个示例用法:

    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
请注意,您可以设置超出
字节范围的

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

    byte b = -1;
    // bytes.set(b); // throws IndexOutOfBoundsException
    bytes.set(b & 0xFF);
    System.out.println(bytes);
    // {3, 7, 11, 255, 1000}
    for (int i = -1; (i = bytes.nextSetBit(i + 1)) != -1; ) {
        byte b = (byte) i;
        System.out.println(b);
    }
    // 3, 7, 11, -1, -24
然后,您可以按如下方式迭代集合中的所有
字节

    byte b = -1;
    // bytes.set(b); // throws IndexOutOfBoundsException
    bytes.set(b & 0xFF);
    System.out.println(bytes);
    // {3, 7, 11, 255, 1000}
    for (int i = -1; (i = bytes.nextSetBit(i + 1)) != -1; ) {
        byte b = (byte) i;
        System.out.println(b);
    }
    // 3, 7, 11, -1, -24
注意,由于字节[-128127]
int[0255]
的映射,负数在正数之后<代码>位集
也有助于对其他
位集
进行有效的集操作,如
异或
等于
相交

相关问题
    • Java的
      字节的范围是
      -128..127
      ,而不是
      0..255
可以有一个
集合
,但不能有
集合
,字节是对象,字节是原语。如果创建一组字节,则可以向其中添加字节值,这些值将动态自动装箱为字节,从而获得预期的结果

    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);
应该注意的是,尽管这个方法非常清晰,并且使用了大家熟悉的Java Collections框架,但是如果您在集合上做了大量工作,那么自动装箱可能会成为一个性能问题——但是要想看到这种效果,您真的必须对其进行改进


已经提出了更高性能的替代方案,如Polygene润滑油公司的
java.util.BitSet
或Jon Skeet的阵列解决方案。

正如Polygene润滑油公司所说,您可以拥有
集。另一个简单的选择是:

boolean[] byteSet = new boolean[256];

这将非常有效地检查或设置每个值,并且对值集进行迭代只需要256次迭代:)

如果您经常需要包含基元类型的集合,请查看。它实现了每个基元类型的主要集合类型,这应该比使用包装器字节类更快、内存效率更高


其他类似的库也可以使用。

如果要频繁修改集合,我想我会使用此解决方案(或包装它的简单类)。持续的自动装箱可能会减慢速度。这是如何处理具有负值的字节的?@Tom:您只需将128添加到任何索引或类似的内容中。应对它的各种方式。基本上,我们只需要256个布尔值。@尼克:注意,在这种情况下,自动装箱可能不会太糟糕,因为所有装箱的字节值都被缓存了-它不会不断创建对象。谢谢所有的答案。我不需要操纵布景。我只需要有一对IP地址(源和目标)。然后每对我需要保留两条信息。可能是两个集合,将根据它们的索引进行映射!像setA:set of IP addresses一样,设置B关于这些IP地址的信息。@Red Lion:那么您需要的是一个
映射,而不是两个集。请看我答案中关于
Map
接口提供的内容的链接。@Polygenlubricants:我不能使用Map,因为它只将一个键映射到一个值。我需要的是总共节省192.168.1.65 209.85.229.91 140045 0.00124 4条信息。你一定有很多时间在你的手上。。。但深度回答不错