- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在学习核心 java 的核心,即 Collections
。我想知道当我们在 HashSet
、TreeSet
、LinkedHashSet
中添加重复元素时内部会发生什么。
条目是否被替换、忽略或抛出异常并终止程序。一个子问题是,哪个操作的所有操作具有相同或平均的时间复杂度
我们将不胜感激。
最佳答案
Java 中的 TreeSet、LinkedHashSet 和 HashSet 是集合框架中的三个 Set 实现,与许多其他方法一样,它们也用于存储对象。 TreeSet 的主要特点是排序,LinkedHashSet 是插入顺序,HashSet 只是用于存储对象的通用集合。 HashSet 是使用 Java 中的 HashMap 实现的,而 TreeSet 是使用 TreeMap 实现的。 TreeSet 是一个 SortedSet 实现,它允许它按照 Comparable 或 Comparator 接口(interface)定义的排序顺序保持元素。 Comparable 用于自然顺序排序, Comparator 用于对象的自定义顺序排序,可以在创建 TreeSet 实例时提供。无论如何,在看到 TreeSet、LinkedHashSet 和 HashSet 之间的区别之前,让我们看看它们之间的一些相似之处:
1) Duplicates : 所有三个实现 Set 接口(interface)意味着它们不允许存储重复。
2) 线程安全:HashSet、TreeSet 和 LinkedHashSet 不是线程安全的,如果你在至少有一个线程修改 Set 的多线程环境中使用它们,你需要在外部同步它们。
3) Fail-Fast Iterator:TreeSet、LinkedHashSet和HashSet返回的Iterator都是fail-fast Iterator。即,如果 Iterator 在创建后通过 Iterators remove() 方法以外的任何方式被修改,它将尽最大努力抛出 ConcurrentModificationException。在此处阅读有关快速故障与故障安全迭代器的更多信息
现在让我们看看 Java 中 HashSet、LinkedHashSet 和 TreeSet 的区别:
性能和速度:它们之间的第一个区别在于速度。 HashSet 最快,LinkedHashSet 在性能上排名第二或几乎与 HashSet 相似,但 TreeSet 稍慢,因为它需要在每次插入时执行排序操作。 TreeSet 为添加、删除和包含等常见操作提供有保证的 O(log(n)) 时间,而 HashSet 和 LinkedHashSet 提供恒定时间性能,例如给定哈希函数的添加、包含和删除 O(1) 将元素均匀分布在桶中。
Ordering : HashSet 不维护任何顺序,而 LinkedHashSet 维护元素的插入顺序,类似于 List 接口(interface),TreeSet 维护排序或元素的顺序。
内部实现:HashSet 由 HashMap 实例支持,LinkedHashSet 使用 HashSet 和 LinkedList 实现,而 TreeSet 由 Java 中的 NavigableMap 支持,默认使用 TreeMap。
null : HashSet 和 LinkedHashSet 都允许 null 但 TreeSet 不允许 null 并在将 null 插入 TreeSet 时抛出 java.lang.NullPointerException。由于 TreeSet 使用各个元素的 compareTo() 方法来比较它们,在与 null 比较时抛出 NullPointerException,这里是一个例子:
TreeSet cities
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.compareTo(String.java:1167)
at java.lang.String.compareTo(String.java:92)
at java.util.TreeMap.put(TreeMap.java:545)
at java.util.TreeSet.add(TreeSet.java:238)
Comparison : HashSet 和 LinkedHashSet 在 Java 中使用 equals() 方法进行比较,但 TreeSet 使用 compareTo() 方法来维护排序。这就是为什么 compareTo() 应该与 Java 中的 equals 一致。否则会破坏 Set 接口(interface)的一般联系,即它可以允许重复。
使用可以使用下面的链接查看内部实现 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashSet.java#HashSet.add%28java.lang.Object%29
From the source code
Hashset hases Hashmap to store the data and LinkedHashSet extends Hashset and hence uses same add method of Hashset But TreeSet uses NavigableMap to store the data
关于java - 基于添加重复值的HashSet vs TreeSet vs LinkedHashSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20116660/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: List versus ArrayList variable type? 我正在初始化一个 HashSet就
使用初始化有什么区别 HashSet s = new HashSet(2) 和 HashSet s = new HashSet(2) ? 最佳答案 唯一的区别是第一个会向您提供有关原始类型“HashS
这个问题已经有答案了: What does it mean to "program to an interface"? (33 个回答) 已关闭 9 年前。 这两个调用有什么区别: Set insta
我知道,如果您有两个 HashSet ,您可以创建第三个将这两个 HashSet 添加。但是,出于我的目的,我需要更改之前的 456 ,查找某些条件,然后如果不满足,则再次更改设置。我的目的是,我将给
我正在尝试使用 HashSet作为其他人的 key HashSet .我找到了 this question and answer指出要实现 Hash HashSet 的特征,但我无法让我的具体案例发挥
我有两个 HashSet s,我想实现 a = a U b .如果可能的话,我想使用 HashSet::union而不是循环或其他调整。 我尝试了以下方法: use std::collections:
我有一个HashSet包含一件元素。尝试添加到集合中的新项目与现有项目相同,.equals() 。确认newElement事实上是一样的,我有一些调试打印循环通过我的 HashSet并打印每个项目:
我创建了一个 HashSet 的 HashSet。我想访问子集中的整数值。我的 HashSet 的 HashSet 是包含 Set 的所有子集的集合,如下所示:- [[], [1], [2], [1,
我必须操作存在于大 HashSet 对象下的字符串 我想知道是否有可能操纵现有的 不创建新 HashSet 对象的 HashSet 对象 以下是我当前的逻辑,其中,我想避免创建第二个 HashSet(
好奇心和效率是这个问题的原因。在某些循环运行后,我正在创建许多新的哈希集: HashSet 当前在类的顶部这样声明: private Set failedTests; 然后在代码的后面,只要我重新运行
这个问题在这里已经有了答案: How can I insert all values of one HashSet into another HashSet? (2 个回答) 9 个月前关闭。 当我尝
我有两个 Action 哈希集,如果它们出现在第二个哈希集中,我该如何删除所有相同的操作? 最佳答案 您正在寻找 ExceptWith 方法。 关于c# - 从 hashset of actions
我有代码 List> list = new ArrayList>(50); pos = 17; // just some index less than 50 list.add(pos, new Ha
我想在 HashSet 中处理一些新数据,而不需要任何旧数据或旧 HashSet 对象。旧的 HashSet 对象不在其他地方引用。 简单地做hashset = new HashSet()更好吗?让
我正在尝试学习 Rust 的诀窍,我正在玩这个小函数: fn anagrams_for(word: &str, possible_anagrams: &[&'a str]) -> HashSet {
这个问题已经有答案了: HashSet look-up complexity? (4 个回答) 已关闭 6 年前。 访问数组中特定对象/数据的平均复杂度是 O(n) ,这里 n 是数组长度。Java
我今天接受了采访,接受我采访的人对他的陈述感到困惑,询问是否有可能 TreeSet等于 HashSet但不是 HashSet等于 TreeSet .我说“不”,但据他说,答案是"is"。 怎么可能?
HashSet 没有AddRange 方法,所以我想为它写一个扩展方法。这是我的: public static void AddRange(this ICollection collection, I
我编写了一个接受 HashSet 的函数范围。我想通过 HashSet其中 SomeEnumeration具有基础类型 byte .有没有简单的方法可以做到这一点? public enum SomeE
我想存储一些不允许重复的像素位置,所以首先想到的是 HashSet或类似的类(class)。然而,与 HashSet 之类的东西相比,这似乎非常慢. 例如,这段代码: HashSet points =
我是一名优秀的程序员,十分优秀!