爲何要將BitSet和Byte數組進行互轉呢,場景,假設咱們爲每一個用戶對象設了一個開關字段對應的mysql表是blob類型,裏面存儲了用戶不少的開關,若是在64個開關之內徹底能夠用long來存儲,可是考慮到擴展性,本身來維護N個long仍是有難度的,因此利用BitSet對象來存儲。BitSet已經實現了java的Serializable接口,能夠直接序列化,可是考慮到跨語言,因此不能直接用java序列化,須要將BitSet轉成Byte數組,讀取時在將Byte數組轉爲BitSet對象。 java
import java.util.Arrays; import java.util.BitSet; public class BitSetConvert { public static byte[] bitSet2ByteArray(BitSet bitSet) { byte[] bytes = new byte[bitSet.size() / 8]; for (int i = 0; i < bitSet.size(); i++) { int index = i / 8; int offset = 7 - i % 8; bytes[index] |= (bitSet.get(i) ? 1 : 0) << offset; } return bytes; } public static BitSet byteArray2BitSet(byte[] bytes) { BitSet bitSet = new BitSet(bytes.length * 8); int index = 0; for (int i = 0; i < bytes.length; i++) { for (int j = 7; j >= 0; j--) { bitSet.set(index++, (bytes[i] & (1 << j)) >> j == 1 ? true : false); } } return bitSet; } public static void main(String[] args) { BitSet bitSet = new BitSet(); bitSet.set(0, true); bitSet.set(10, true); //將BitSet對象轉成byte數組 byte[] bytes = bitSet2ByteArray(bitSet); System.out.println(Arrays.toString(bytes)); //在將byte數組轉回來 bitSet = byteArray2BitSet(bytes); System.out.println(bitSet.get(0)); System.out.println(bitSet.get(10)); } }