说我有一个List<Integer> ls
,我知道它的长度,我们可以为字节缓冲区分配length * 4个字节,并使用putltilst将ls读入缓冲区吗?
这应该可以满足您的需求:
ByteBuffer buffer = ByteBuffer.allocate(ls.size()*4);
for (Integer i: ls)
buffer.putInt(i);
一个警告:此函数假定您的列表不包含任何空条目。
我认为您没有比这更好的方法了,因为其中的Integer
对象基础数组ls
是对这些Integer
对象而不是其包含的int
-values的引用(指针)数组。实际Integer
对象将以某种随机顺序驻留在内存中,大致取决于创建它们的时间。因此,不太可能找到连续的内存块,其中包含需要复制到自己的数据ByteBuffer
(我认为这就是“直接读取”它的意思。)因此,类似using之类的东西sun.misc.Unsafe
可能无法在这里为您提供帮助。
即使您使用了aint[]
而不是a,List<Integers>
您也可能无法可靠地将数据直接从内存中直接读取到您的中ByteBuffer
,因为64位计算机上的某些JVM会将64位地址位置上的所有值对齐,以实现更快的访问,会导致您之间的“差距” ints
。还有一个问题,字节序可能因平台而异...
编辑:
嗯...我只是看了一下将要调用的putInt()函数的OpenJDK源代码...子函数调用真是一团糟。如果“ sun”实现很糟糕,那么如果您要寻找性能,最好自己进行转换(使用shift和binary-ops)...最快的方法可能是将您的转换Integers
为一byte[]
,然后使用ByteBuffer.wrap(...)
,如果你需要的答案的ByteBuffer
。让我知道您是否需要代码...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句