簡體   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