背景
位输入流由字节数组支持。有几种方法可以从该字节数组读取各种强制的原始数组。
问题
有重复的代码。Java缺少原始类型的泛型,因此重复是不可避免的。
码
重复的代码在以下方法中显而易见:
@Override
public long readBytes(final byte[] out, final int offset, final int count, final int bits) {
final int total = offset + count;
assert out != null;
assert total <= out.length;
final long startPosition = position();
for (int i = offset; i < total; i++) {
out[i] = readByte(bits);
}
return position() - startPosition;
}
@Override
public long readShorts(final short[] out, final int offset, final int count, final int bits) {
final int total = offset + count;
assert out != null;
assert total <= out.length;
final long startPosition = position();
for (int i = offset; i < total; i++) {
out[i] = readShort(bits);
}
return position() - startPosition;
}
注意如何final byte[] out
涉及到readByte(bits)
同样final short[] out
涉及readShort(bits)
。这些关系是问题的症结所在。
题
如何消除重复(如果有的话),而不会造成重大的性能损失(例如,通过自动装箱)?
有关
6
不,您在那无能为力。复制是唯一的选择。
—
安迪·特纳
使用第三方原始集合
—
Vince Emigh
Java lacks generics on primitive types, so perhaps the repetition is unavoidable.
对。(通常这不是什么大问题,因为很少有程序需要多个不同的原语。您也可以通过将原语放入类中并使用对象序列化来“修复”此问题,尽管这样做可能会比较慢。 )
另外,(记住这一点)如果您正在读取大量的原语(如您的代码似乎表明),请使用或
—
markspace
ByteBuffer
这类方法来卸载一些最低级别的工作。 docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/...asDoubleBuffer()
asShortBuffer()
注意,有一些努力将原始的通用支持引入Java,
—
Zabuzard
List<int>
例如etc。可能在2-5年左右的时间内发布。它被称为瓦尔哈拉计划。