gpt4 book ai didi

java - StringBuilder 实现 Comparable 但不覆盖 equals

转载 作者:行者123 更新时间:2023-12-04 00:13:31 25 4
gpt4 key购买 nike

我不明白 line from javadoc (在“API 说明”小标题下):

StringBuilder implements Comparable but does not override equals. Thus, the natural ordering of StringBuilder is inconsistent with equals.

我是Java初学者,你能用简单的方式解释一下吗?

最佳答案

这意味着 StringBuilder.compareTo()StringBuilder.equals() 并不总是一致的。

var sb1 = new StringBuilder("foo");
var sb2 = new StringBuilder("foo");
assert sb1.compareTo(sb2) == 0; // as you would expect.
assert sb1.equals(sb2) == true; // surprise - it fails

现在有点困惑了:

var map = new HashMap<StringBuilder, String>();
map.put(sb1, "lorem ipsum");
assert map.size() == 1;
map.put(sb2, "dolor sit amet");
assert map.size() == 1; // fails - it's 2

var set = new TreeSet<StringBuilder>();
set.add(sb1);
assert set.size() == 1;
set.add(sb2);
assert set.size() == 2; // you'd think this should be 2 but it fails!

这是因为 HashMap 与 equals() 一起使用,而 SortedSetcompareTo() 一起使用。


注意 1:关于 equals()

StringBuilder 扩展了 Object,也就是说它继承了 Object.equals();但它并没有覆盖equals(),这意味着StringBuilder.equals()实际上是Object.equals()

Object.equals() 基本上是==,即当且仅当两个对象的内存地址相同时才返回true。

Object.equals() java doc


注意 2:为什么?

从JDK11开始,StringBuilder实现Comparableequals() 中的任何伴随更改都可能导致一些较旧的客户端代码中断;所以,我认为,遵循 Java 保持向后兼容的传统,他们放弃了这个想法。

关于java - StringBuilder 实现 Comparable 但不覆盖 equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66114916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com