从TreeMap的JavaDoc中:
请注意,如果排序后的映射要正确实现Map接口,则排序后的映射(无论是否提供显式比较器)所维护的顺序必须与equals一致。(有关与equals一致的精确定义,请参见Comparable或Comparator。)之所以这样,是因为Map接口是根据equals操作定义的,但是map使用其compareTo(或compare)方法执行所有键比较,因此有两个键从已排序映射的角度来看,此方法认为相等的值相等。已排序映射的行为是明确定义的,即使其顺序与equals不一致也是如此;它只是不遵守Map接口的一般约定。
有人可以举一个具体的例子来说明如果排序不等于equals可能发生的问题吗?以具有自然顺序的用户定义类为例,即它实现Comparable。JDK中的所有内部类也都保持不变吗?
Comparable接口的协定允许不一致的行为:
强烈建议(尽管不是必需的)自然顺序应与等号保持一致。
因此,从理论上讲,JDK中的类可能compareTo
与不一致equals
。一个很好的例子是BigDecimal。
下面是一个与equals不一致的比较器的人为示例(它基本上说所有字符串都是相等的)。
输出:
大小:1
内容:{a = b}
public static void main(String[] args) {
Map<String, String> brokenMap = new TreeMap<String, String> (new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return 0;
}
});
brokenMap.put("a", "a");
brokenMap.put("b", "b");
System.out.println("size: " + brokenMap.size());
System.out.println("content: " + brokenMap);
}
问题内容: 操作数是什么意思,更具体地说是Python? 有人可以解释如何阅读此代码段吗? 问题答案: 更新的答案 在问题的上下文中,我们正在处理伪代码,但是从Python 3.8开始 ,它实际上是一个有效的运算符,它允许在表达式中分配变量: 有关更多详细信息,请参见PEP 572。 原始答案 您发现的是 伪代码 伪代码 是计算机程序或其他算法的工作原理的非正式高级描述。 实际上是赋值运算符。在P
tl;医生:这是什么意思= 我刚刚解决了一个关于代码战的问题,在看了其他人对这个问题的共同反应后,我一直看到:
问题内容: SSCCE: 以上输出: 问题答案: 异常类继承自其方法,并且不会覆盖它。每次都创建新的Exception实例,它们是内存中的不同对象。即使它们的堆栈跟踪相同,但它们在内存中的对象分配仍然不同,并且使用默认的equals()方法,它们并不相同。 但是,您可以定义自定义异常类并重写。
问题内容: 我是Go的新手,在浏览其他一些线程时遇到了以下代码行: 含义是什么?它是否指定将在if条件中分配某些内容(因为err似乎正在发生这种情况)?我在Wiki上找不到这种语法的示例,并且我很好奇它的用途。 问题答案: 因为返回两个值,所以如果需要它们中的任何一个,都必须在某个地方接收这些值。该是一个占位符,基本的意思是“我不关心这个特殊的返回值。” 在这里,我们只关心检查错误,而无需对实际的
问题内容: 我读到: 每当需要对集合进行排序时,元素必须相互可比。 我写了下面的代码,它可以正常工作。您能告诉我们b类和c类如何相互可比,“相互可比”是什么意思? 问题答案: 为了类和以可相互比较的,这些需求需要满足: 的通话上的一个实例,通过实例必须允许 的通话上的一个实例,通过实例必须允许 如果返回,则 必须 返回具有相反符号或零的值(当为零时)。 在你的代码中的类不可相互比较,因为试图通过一
问题内容: 我玩了一段时间我的代码,这不是关于错误或任何东西,但我只是不明白为什么main()类不需要初始化就可以运行… 但是,是的,非常感谢您的阅读。 问题答案: 与许多其他语言不同,类主体是Python中的可执行语句,并在解释器到达该行后立即执行。当您运行此“程序”时: 它只是打印“嘿”而没有创建任何对象。 这同样适用于函数定义语句(但不适用于函数体)。运行此命令时: 它显示“ hi”,但不显