假设我有一个List<Integer> ls
并且我知道它的长度我们可以为bytebuffer分配长度* 4个字节并使用put到directlty read ls到缓冲区吗?
答案 0 :(得分:1)
这应该做你正在寻找的事情:
ByteBuffer buffer = ByteBuffer.allocate(ls.size()*4);
for (Integer i: ls)
buffer.putInt(i);
一个警告:此函数假定您的列表不包含任何 null 条目。
我认为你可以做得比这更好,因为Integer
中ls
对象的基础数组是这些Integer
的引用数组(指针)对象而不是它们包含的int
- 值。实际的Integer
对象将以某种随机顺序驻留在内存中,大致由创建时间决定。因此,您不太可能找到一些连续的内存块,其中包含您需要复制到ByteBuffer
的数据(我认为这就是您的意思&#34;直接阅读&# 34;它。)。因此,使用sun.misc.Unsafe
之类的东西可能无法帮助您。
即使你有一个int[]
而不是List<Integers>
,你可能也无法直接从内存中可靠地读取数据到ByteBuffer
,因为有些JVM&# 39; 64位计算机将在64位地址位置上对齐所有值以便更快地访问,这将导致&#34;间隙&#34;在ints
之间。然后是endianness的问题,这可能因平台而异......
编辑:
嗯...我刚刚看了一下这将要调用的OpenJDK source-code for the putInt()-function ......这是一个可怕的子功能调用。如果&#34; sun&#34; -implementation为&#34; bad&#34;,如果您正在寻找,您可能最好自己进行转换(使用移位和二进制操作)性能...最快的可能是将Integers
转换为byte[]
,然后使用ByteBuffer.wrap(...)
,如果您需要答案为ByteBuffer
。如果您需要代码,请告诉我......