/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
核心约定
重写 equals() 后,要相应地重写 hashCode(),保证两个逻辑上相等的对象具有相同的哈希值。反过来,哈希值相同不一定代表对象相等,因为哈希冲突是允许的。
为什么影响哈希集合?
HashMap 和 HashSet 使用哈希值帮助定位,再通过 equals() 判断是否为相同的键或元素。如果两个对象被 equals() 判为相等,却返回不同哈希值,集合可能将它们放在不同的位置,导致查找失败,或者让 HashSet 容纳逻辑上重复的元素。
实现示例
假设用户以 id 作为逻辑身份,应让两个方法都使用这一字段:
import java.util.Objects;
class User {
private final String id;
User(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof User)) return false;
User other = (User) obj;
return Objects.equals(id, other.id);
}
@Override
public int hashCode() {
return Objects.hashCode(id);
}
}
两个 id 相同的 User 相等,也返回相同的哈希值。用于计算相等性和哈希值的字段应保持一致;对象作为哈希集合的键或元素期间,也应避免修改影响这些结果的字段。





