我正在学习核心 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/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht