尝试在没有比较器的情况下添加树集时,StringBuffer 不给出 ClassCastException
StringBuffer not giving ClassCastException when trying to add in a treeset without Comparator
我在尝试 运行 以下代码时期待 ClassCastException:
// TreeSet<StringBuffer> t = new TreeSet<StringBuffer>((a, b) -> -
// a.toString().compareTo(b.toString()));
TreeSet<StringBuffer> t = new TreeSet<StringBuffer>();
Function<String, StringBuffer> f = s -> new StringBuffer(s);
t.add(f.apply("A"));
t.add(f.apply("M"));
t.add(f.apply("B"));
t.add(f.apply("Z"));
t.add(f.apply("G"));
System.out.println(t);
我已经评论了比较器代码,并尝试在没有比较器的情况下使用。但我仍然得到正确的输出。这怎么可能,因为 StringBuffer 没有实现 Comparable 接口。我现在用的是Java11,后面的版本有没有和这个相关的改动。
您正在比较器中将 StringBuffer
转换为 String
,并且 String class implements Comparable
interface, And also as a note since from jdk-11 StringBuffer and StringBuilder 还实现了 Comparable
(a, b) -> -a.toString().compareTo(b.toString())
但是如果你的版本低于jdk-11你会得到编译时错误
The method compareTo(StringBuffer) is undefined for the type StringBuffer
这是可能的,因为 StringBuffer
does 实现了 Comparable
接口。
API 注意:
StringBuffer 实现 Comparable 但不覆盖 equals。因此,StringBuffer 的自然顺序与 equals 不一致。如果将 StringBuffer 对象用作 SortedMap 中的键或 SortedSet 中的元素,则应小心。有关更多信息,请参见 Comparable、SortedMap 或 SortedSet。
自从:
1.0
也可以看看:
StringBuilder、字符串、序列化形式
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/StringBuffer.html#:~:text=StringBuffer%20implements%20Comparable%20but%20does,or%20elements%20in%20a%20SortedSet%20.
我在尝试 运行 以下代码时期待 ClassCastException:
// TreeSet<StringBuffer> t = new TreeSet<StringBuffer>((a, b) -> -
// a.toString().compareTo(b.toString()));
TreeSet<StringBuffer> t = new TreeSet<StringBuffer>();
Function<String, StringBuffer> f = s -> new StringBuffer(s);
t.add(f.apply("A"));
t.add(f.apply("M"));
t.add(f.apply("B"));
t.add(f.apply("Z"));
t.add(f.apply("G"));
System.out.println(t);
我已经评论了比较器代码,并尝试在没有比较器的情况下使用。但我仍然得到正确的输出。这怎么可能,因为 StringBuffer 没有实现 Comparable 接口。我现在用的是Java11,后面的版本有没有和这个相关的改动。
您正在比较器中将 StringBuffer
转换为 String
,并且 String class implements Comparable
interface, And also as a note since from jdk-11 StringBuffer and StringBuilder 还实现了 Comparable
(a, b) -> -a.toString().compareTo(b.toString())
但是如果你的版本低于jdk-11你会得到编译时错误
The method compareTo(StringBuffer) is undefined for the type StringBuffer
这是可能的,因为 StringBuffer
does 实现了 Comparable
接口。
API 注意: StringBuffer 实现 Comparable 但不覆盖 equals。因此,StringBuffer 的自然顺序与 equals 不一致。如果将 StringBuffer 对象用作 SortedMap 中的键或 SortedSet 中的元素,则应小心。有关更多信息,请参见 Comparable、SortedMap 或 SortedSet。 自从: 1.0 也可以看看: StringBuilder、字符串、序列化形式 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/StringBuffer.html#:~:text=StringBuffer%20implements%20Comparable%20but%20does,or%20elements%20in%20a%20SortedSet%20.