[语法] 相同的物件们放到 HashSet 取出的顺序

楼主: obelisk0114 (追风筝的孩子)   2019-12-26 19:43:06
之前一直认为相同的物件们放到 HashSet, 由于内部顺序是 hash 决定
取出的顺序会是一样
ex:
n 个 HashSet, n 个内容相同的字串群组 (每组都有 m 个字串, 可能排列顺序不同)
将这 n 个字串群组分别塞进 n 个 HashSet
取出的顺序会是相同的
也就是 for (String s : 任一个 HashSet) 得到的字串顺序会一样
直到最近在 Spring Boot 写测试
直接用 assertIterableEquals(两个 HashSet) 有时会错误
将两个 HashSet 内容印出来才发现有时候顺序会不一样
更神奇的是相同一段程式码, 执行 2 次还会有不一样的结果
所以 HashSet 内部顺序不只和 hash 有关吗 ?
环境 :
jdk 1.8.221
Spring Boot 2.2.1.RELEASE
org.junit.vintage (应该是 JUnit 5)
作者: handsomeLin (DoGLin)   2019-12-28 14:57:00
hashset几乎所有语言都无序吧 包括hashmap
作者: OriginStar   2019-12-27 17:09:00
官方文件说It makes no guarantees as to the iteration orderof the set; in particular, it does not guaranteethat the order will remain constant over time.没有保证每次call都会传回一致顺序的内容
作者: vavamos (vavamos)   2019-12-26 20:18:00
无序
作者: ssccg (23)   2019-12-26 21:17:00
以API来说你不该期待Set内容是有顺序的,即使实作可能变成有顺序,HashSet的iterator就写没固定顺序了有实作SortedSet的Set才会是有序的
作者: jej (晃奶大馬桶)   2019-12-26 21:29:00
你原本的概念是对的hashset在add的原始码有呼叫hashcode在你的案例应该是string是final物件所以你不能自己刻hashcode试着用刻过hashcode的物件放进去hashset他应该会根据你的hashcode排序
作者: ssccg (23)   2019-12-26 21:39:00
以理论上来说,hash table是依自己的hash function来放而且这个hash function的值域可能依当前bucket数量而变动不一定是直接用java的hashCode()的值,当然顺序不一定即使自订了hashCode也一样

Links booklink

Contact Us: admin [ a t ] ucptt.com