我知道随机UUID在理论上具有非常非常非常低的碰撞概率,但我想知道,在实践中,Java 5 randomUUID()在没有碰撞方面有多好?有没有人有经验可以分享?
假设我正在构建一个TreeSet对象,其顺序仅取决于一个值。
我不能做
TreeSet<Foo> tree = new TreeSet<>(Comparator.comparingInt(Foo::getX));
Run Code Online (Sandbox Code Playgroud)
因为如果我添加两个Foo具有相同对象的不同对象x,那么一个将替换另一个(即,如果我这样做,tree.add(foo1)并且,将代替)。tree.add(foo2)tree.size()12
我可以比较 的每个字段Foo,但我希望 的两个实例Foo被视为不同,即使每个字段都相同。
一种“几乎有效”的解决方案是
TreeSet<Foo> tree = new TreeSet<>(Comparator.comparingInt(Foo::getX).thenComparing(Foo::hashCode));
Run Code Online (Sandbox Code Playgroud)
但当存在哈希冲突时,这会失败。
总之,我正在寻找类似的东西
TreeSet<Foo> tree = new TreeSet<>(Comparator.comparingInt(Foo::getX).thenComparing(Foo::getInternalAddress));
Run Code Online (Sandbox Code Playgroud)
但我们当然无法使用这样的方法。
我知道有解决方法:
TreeMap<Foo, Integer>(并比较所有字段)来给出Foo特定对象的数量xTreeMap<Foo, List<Foo>>(或TreeMap<Integer, List<Foo>>键为x)。但如果“重复”的 foo 很少,那么所有单例列表都会浪费空间。因此,虽然我知道 a 有解决方法TreeMap,但我仍然想知道是否有一种方法可以仅使用 a 来做到这一点TreeSet。