對於需要24位無符號數據類型的應用程序。 不幸的是,這種數據類型在Java中不可用。我打算將它作爲一個新類來實現。但我不確定這樣的實現的性能。Java中的自定義數據類型
建議寫我自己的班級嗎?
如果這是可取的,是否有可能取得良好的表現?
對於需要24位無符號數據類型的應用程序。 不幸的是,這種數據類型在Java中不可用。我打算將它作爲一個新類來實現。但我不確定這樣的實現的性能。Java中的自定義數據類型
建議寫我自己的班級嗎?
如果這是可取的,是否有可能取得良好的表現?
如果你想節省空間,你可以使用int的caluclation和映射中的最小顯著3個到字節[],或只是三個字節:
public static byte[] convert(int i) {
return new byte[]{ (i & 0xff0000) >> 16, (i & 0xff00) >> 8, (i & 0xff) };
}
public static int convert(byte[] b) {
if (b == null && b.length != 3)
throw new IllegalArgumentException();
return (b[2] << 16) | (b[1] << 8) | b;
}
(無法驗證它是否是錯誤免費但至少它應該給一個想法)
+1謝謝,這似乎是我的問題的一個很好的解決方案。還讓我問一個小問題。爲了表示數字的實際值,我們不能使用byte [] value = new byte [3]等字節數組而不是int數據類型。 – 2010-08-16 06:48:05
根據'int'計算索引值比在'byte []'上執行要容易得多。我會離開基於計算的'int',並將索引轉換爲一個數組(或三個字節)來保存它們。你可以將byte []'包裝到Integer24Bit類中,但不會節省空間。 – 2010-08-16 07:08:10
請注意,通過爲每個值存儲一個字節[3],您不會節省任何空間,因爲每個數組都有自己的開銷。你想把所有的整數存儲在一個大字節[]中,並且有一些計算每個字節開始位置的方法(如果每個字節只有3個字節,它可以是數組[index%3])。 – Avi 2010-08-16 08:17:44
據推測,你的意思是實現它作爲使用較大的數據類型和邊界檢查,像這樣一類:
public class Unsigned24 {
private static final MAX_UNSIGNED24 = Math.pow(2, 24) - 1;
private static final MIN_UNSIGNED24 = 0;
private final int value;
public Unsigned24(int value) {
if (value > MAX_UNSIGNED24 || value < MIN_UNSIGNED24)
throw new IllegalArgumentException("value out of bounds: " + value);
this.value = value;
}
public int getValue() {
return value;
}
// ... other methods, such as equals(), comparison, addition, subtraction, etc.
}
這會工作,但可能不值得麻煩。而且,它並不僅僅需要24位內存,而是32加上對象的開銷。
這真的取決於你的目標。爲什麼你想要一個24位整數。
僅僅是因爲你對值有限制嗎?如果是這樣,你可能想要做類似上面的事情。
是因爲你有很多它們,並且想要節省內存嗎?如果是這樣,您可能需要構建一些抽象24位整數數組的類,並在內部將它們連續保存在一個字節數組中。
是因爲您正在接口的硬件或網絡接口,正好有24位?在這種情況下,您可能需要查看java.nio類。
艾維的權利。除非你絕對需要邊界檢查,否則只需使用int即可。 – LandonSchropp 2010-08-16 05:21:40
Math.pow(2,24) - 1 == 0xffffff – aioobe 2010-08-16 05:22:25
謝謝Avi。我正在爲簡單的桌面搜索引擎編寫索引器。所以使用24位無符號整數而不是32位整數我希望我能夠節省一些空間。因此,我認爲你的第二個選項(字節數組)可能更適合我的場景。 – 2010-08-16 05:35:35
這些會在你的應用程序在任何一個時間有多少活躍?除非你正在談論數百萬的數量,否則最好使用一個整數並且每個數據「浪費」8位,而不是試圖優化你不需要的地方。 – 2010-08-16 05:17:49
@Anon,+1。如果這是一個答案,我肯定會贊成。 – aioobe 2010-08-16 05:19:59
非常感謝。我正在爲簡單的桌面搜索引擎編寫索引器。所以使用24位無符號整數而不是32位整數我希望我能夠節省一些空間。 – 2010-08-16 05:32:11