繁体   English   中英

我们可以直接在Java的字节缓冲区中读取对象吗?

[英]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);

一个警告:此函数假定您的列表不包含任何条目。

我认为您不能做得更好,因为lsInteger对象的基础数组是对这些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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM