首页 / JAVA / java – 设置只需要等于
java – 设置只需要等于
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 设置只需要等于,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2056字,纯文字阅读大概需要3分钟。
内容图文
![java – 设置只需要等于](/upload/InfoBanner/zyjiaocheng/753/ea1ccdc808f34130ab1ee87e28ddc3b4.jpg)
我很好奇,是否有任何Set只需要.equals()来确定唯一性?
从java.util查看Set类时,我只能找到需要Comparator的需要.hashCode()和TreeSet(或者一般是SortedSet)的HashSet.我找不到任何只使用.equals()的类.
如果我有.equals()方法,用它来确定对象的唯一性就足够了吗?因此有一个只需要使用.equals()的Set实现?或者我在这里错过了.equals()不足以确定Set实现中的对象唯一性?
请注意,我知道Java实践,如果我们覆盖.equals(),我们应该覆盖.hashCode()以维护在Object中定义的契约.
解决方法:
.equals方法本身就足以正确实现一个集合,但不能有效地实现它.
哈希码或比较器的要点在于它们提供了在一些有序结构(哈希表或二叉树)中排列对象的方法,该结构允许快速确定对象是否存在于集合中.如果只有.equals方法来比较对象对,则不能以任何有意义的顺序排列集的内容;你只有一堆松散的对象,因此,例如,确认对象是唯一的,需要将每个添加的对象与混杂中的每个其他对象进行比较.
当然你可以写一个只使用.equals方法的正确集合,但它会很慢而且不切实际.所以标准库中没有这样的实现.
此外,如果有这样的实现,它将鼓励破坏.hashCode和.equals必须相互一致的Object类合约.因此,它在标准库中的存在将是一个矛盾.它可能反过来伤害其他包含数据的类,这些类会担心使用不正确的.hashCode方法处理对象,并且会觉得有必要使用.equals-only数据结构作为最低公分母,这可能会影响到各处的性能.实际上,类通常完全正确地假设其他类遵守Object类契约,并且可以在HashSet或HashMap中使用它们.
对于它的价值,仅使用添加对象的.equals方法的最小的工作Set实现将是:
public class ArraySet<E> extends AbstractSet<E> {
private final ArrayList<E> list = new ArrayList<>();
@Override
public boolean add(E e) {
if (!list.contains(e)) {
list.add(e);
return true;
}
return false;
}
@Override
public Iterator<E> iterator() {
return list.iterator();
}
@Override
public int size() {
return list.size();
}
}
该集由ArrayList支持,并使用list.contains在对象上调用.equals. AbstractSet和AbstractCollection的继承方法提供了Set接口的大部分功能;例如,它的.remove方法通过列表迭代器的.remove方法实现.添加或删除对象或测试其在集合中的成员资格的每个操作都具有O(n)复杂度,其中n是当前集合中的对象数,因此它不是快速或可伸缩的,但它在技术上正常工作.
从好奇心的角度来看这很有趣,但我不建议你使用它.相反,学习如何编写哈希码方法和比较器,并享受高效集和映射的好处.
内容总结
以上是互联网集市为您收集整理的java – 设置只需要等于全部内容,希望文章能够帮你解决java – 设置只需要等于所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。