第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么 HashSet 沒(méi)有穩(wěn)定的序列化?

為什么 HashSet 沒(méi)有穩(wěn)定的序列化?

繁花不似錦 2023-12-13 15:11:00
以HashSetJava 為例。把一根繩子放進(jìn)去。將其序列化。你最終會(huì)得到一些字節(jié) - bytesA。將bytesA其反序列化為Object- fromBytes?,F(xiàn)在重新序列化fromBytes,你就得到了另一個(gè)字節(jié)數(shù)組 - bytesB。奇怪的是,這兩個(gè)字節(jié)數(shù)組不相等。一個(gè)字節(jié)不一樣!為什么?有趣的是,這并不影響TreeSet或HashMap。但它確實(shí)會(huì)影響LinkedHashSet.Set<String> stringSet = new HashSet<>();stringSet.add("aaaaaaaaaa");//Serialize itbyte[] bytesA;try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {  ObjectOutputStream out = new ObjectOutputStream(bos);  out.writeObject(stringSet);  out.flush();  bytesA = bos.toByteArray();}// Deserialize itObject fromBytes;try (ByteArrayInputStream is = new ByteArrayInputStream(bytesA)) {  try(ObjectInputStream ois = new ObjectInputStream(is)) {    fromBytes = ois.readObject();  }}//Serialize it.byte[] bytesB;try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {  ObjectOutputStream out = new ObjectOutputStream(bos);  out.writeObject(fromBytes);  out.flush();  bytesB = bos.toByteArray();}assert Arrays.equals(bytesA, bytesB); //array contents differ at index [43], expected: <16> but was: <2>如果這些有幫助: xxd十六進(jìn)制轉(zhuǎn)儲(chǔ)bytesA00000000: aced 0005 7372 0011 6a61 7661 2e75 7469  ....sr..java.uti00000010: 6c2e 4861 7368 5365 74ba 4485 9596 b8b7  l.HashSet.D.....00000020: 3403 0000 7870 770c 0000 0010 3f40 0000  4...xpw.....?@..00000030: 0000 0001 7400 0a61 6161 6161 6161 6161  ....t..aaaaaaaaa00000040: 6178                                     axxxd十六進(jìn)制轉(zhuǎn)儲(chǔ)bytesB00000000: aced 0005 7372 0011 6a61 7661 2e75 7469  ....sr..java.uti00000010: 6c2e 4861 7368 5365 74ba 4485 9596 b8b7  l.HashSet.D.....00000020: 3403 0000 7870 770c 0000 0002 3f40 0000  4...xpw.....?@..00000030: 0000 0001 7400 0a61 6161 6161 6161 6161  ....t..aaaaaaaaa00000040: 6178                                     ax第三行第六列是差異。我使用的是 Java 11.0.3。(解決)根據(jù) Alex R 的回應(yīng) - HashSet 的 writeObject 存儲(chǔ)了backing 的capacity、loadFactor和,但它重新計(jì)算了容量:sizeHashMapreadObjectcapacity = (int)Math.min((float)size * Math.min(1.0F / loadFactor, 4.0F), 1.07374182E9F);除了健全性檢查之外,它實(shí)際上忽略了capacity最初存儲(chǔ)的值!
查看完整描述

1 回答

?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊

HashSet如果使用構(gòu)造函數(shù)創(chuàng)建 a,它會(huì)創(chuàng)建HashMap默認(rèn)大小為 16 的 a。

如果您反序列化它,并且您的集合包含的條目較少,則大小可能會(huì)初始化為小于 16。這就是本例中發(fā)生的情況。

看一下readObject的實(shí)現(xiàn),HashSet看看大小是如何計(jì)算的。

打印兩個(gè)字節(jié)數(shù)組會(huì)提示您這確實(shí)發(fā)生了:

[..., 16, ...]
[..., 2,...]


查看完整回答
反對(duì) 回復(fù) 2023-12-13
  • 1 回答
  • 0 關(guān)注
  • 178 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)