任何人都可以帮助我知道如何在Java中使用“Set”字节? 谢谢
答案 0 :(得分:10)
Set<Byte>
选项
如果您想利用Java Collections Framework,可以拥有java.util.Set<Byte>
。不幸的是,Java泛型不适用于原语。 java.lang.Byte
是byte
的框类型。也许您可以使用的实现是TreeSet
;它是SortedSet
,因此您可以按照自然顺序对(盒装)byte
进行排序。
BitSet
性能选项另一个选项是java.util.BitSet
。这是一个非常节省时间和空间的数据结构,它使用位实现集合表示,即如果设置了位int i
,i
就是“在集合中”。
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
进行有效的设置操作,例如or
,and
,xor
,equals
,intersects
等
byte
is signed
byte
的范围是-128..127
,而不是0..255
。答案 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类相比,它应该更快,内存效率更高。
其他类似的库也可用。