[英]could we read an object directly into the bytebuffer in java?
说我有一个List<Integer> ls
,我知道它的长度可以为字节缓冲区分配length * 4个字节,并使用putltil将ls直接读入缓冲区吗?
这应该可以满足您的需求:
ByteBuffer buffer = ByteBuffer.allocate(ls.size()*4);
for (Integer i: ls)
buffer.putInt(i);
一个警告:此函数假定您的列表不包含任何空条目。
我认为您不能做得更好,因为ls
的Integer
对象的基础数组是对这些Integer
对象的引用(指针)数组,而不是它们包含的int
-values。 实际的Integer
对象将以某种随机顺序驻留在内存中,大致取决于创建它们的时间。 因此,不太可能找到连续的内存块,其中包含需要复制到ByteBuffer
(我认为这是“直接读取”它的意思。) 因此,使用sun.misc.Unsafe
类的东西可能无法在这里为您提供帮助。
即使您使用int[]
而不是List<Integers>
您也可能无法将数据直接从内存中可靠地读取到ByteBuffer
,因为64位计算机上的某些JVM会将64位计算机上的所有值对齐地址位置以加快访问速度,这将导致ints
之间的“间隙”。 还有一个问题, 字节序可能因平台而异...
编辑:
嗯...我只是看了将要调用的putInt()函数的OpenJDK源代码 ...子函数调用真是一团糟。 如果“ sun”实现很糟糕,那么如果您要寻找性能,最好自己进行转换(使用shift和binary-ops)...最快的方法可能是转换Integers
转换为byte[]
,然后如果需要答案作为ByteBuffer
,则使用ByteBuffer.wrap(...)
。 让我知道您是否需要代码...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.