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