[英]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.