哈希集与树集

2024-01-22

我一直很喜欢树,真好O(n*log(n))以及它们的整洁。然而,我认识的每一位软件工程师都尖锐地问我为什么要使用TreeSet。从 CS 背景来看,我认为你使用什么并不重要,而且我不喜欢乱搞哈希函数和存储桶(在这种情况下)Java).

在什么情况下我应该使用HashSet over a TreeSet?


HashSet 比 TreeSet 快得多(大多数操作(如添加、删除和包含)是恒定时间与日志时间),但不提供像 TreeSet 那样的排序保证。

HashSet http://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html

  • 该类为基本操作(添加、删除、包含和大小)提供恒定的时间性能。
  • 它不保证元素的顺序随着时间的推移保持不变
  • iteration performance depends on the initial capacity and the load factor of the HashSet.
    • 接受默认负载因子是相当安全的,但您可能需要指定一个初始容量,该容量大约是您期望集合增长到的大小的两倍。

TreeSet http://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html

  • 保证基本操作(添加、删除和包含)的 log(n) 时间成本
  • 保证 set 的元素将被排序(升序、自然或您通过其构造函数指定的排序)(实现SortedSet http://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html)
  • 不提供任何迭代性能调整参数
  • 提供了一些方便的方法来处理有序集,例如first() http://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html#first--, last(), headSet() http://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html#headSet-E-, and tailSet() http://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html#tailSet-E- etc

要点:

  • 两者都保证元素的无重复集合
  • 通常,将元素添加到 HashSet 然后将集合转换为 TreeSet 以进行无重复排序遍历会更快。
  • 这些实现都不是同步的。也就是说,如果多个线程同时访问一个集合,并且至少有一个线程修改了该集合,则必须进行外部同步。
  • 链接哈希集在某种意义上介于两者之间HashSet and TreeSet。然而,作为一个带有链表的哈希表来实现,它提供插入顺序迭代,这与 TreeSet 保证的排序遍历不同.

因此,使用方式的选择完全取决于您的需求,但我认为即使您需要有序集合,您仍然应该更喜欢使用 HashSet 创建 Set,然后将其转换为 TreeSet。

  • e.g. SortedSet<String> s = new TreeSet<String>(hashSet);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈希集与树集 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项

随机推荐

  • 如何检测与 puppeteer 一起使用的 chrome 版本?

    我读到 puppeteer 使用最新版本的 chrome 我在哪里可以找到它正在使用的版本 我不想访问窗口上的导航器对象来获取它 基本上没有什么运行时 只是想知道 puppeteer 作为一个包是否在某处列出了它的依赖项 基本上 我想从其他
  • 通过javascript动态添加css到页面

    我正在制作一个将添加到外部网站的小部件 并且我制作了一个页面 可以生成 css 供他们设置样式 文本颜色 背景颜色 字体大小等 我最终得到了一个充满 CSS 的文本区域 供他们复制 粘贴到他们的网站 有没有办法将此 css 添加到当前页面以
  • 一起使用 makeLenses、类约束和类型同义词

    我对 Haskell 很陌生并且想使用makeLenses from Control Lens类约束与类型同义词一起使我的函数类型更加紧凑 可读 我试图提出一个最小的虚拟示例来演示我想要实现的目标 并且该示例除此之外没有其他目的 如果您对上
  • Google 日历 (API) 问题

    我想用谷歌日历 http en wikipedia org wiki Google Calendar为了添加派对活动 所以我添加了一个新的日历 活动 有没有删除该日历中所有事件的功能 或者只能通过删除整个日历并重新创建它来实现 我有每天更新
  • 如何使用Weka预测结果

    我是 Weka 新手 对该工具感到困惑 我有一个关于水果价格和相关属性的数据集 我正在尝试使用数据集预测具体的水果价格 由于我是 Weka 新手 我不知道如何完成这项任务 请帮助我或指导我了解有关如何进行预测以及此任务的最佳方法或算法是什么
  • rCharts-如何向 NVD3 图表添加轴标签和标题

    我正在探索 reCharts 我在向 Y 轴和标题添加标签时陷入困境 我是 rCharts 新手 这是我的示例代码 require rCharts n2 lt nPlot Hours Month group Task data cars t
  • jquery 的 $.ajax 中从 url 参数中删除附加 url 的方法

    我正在使用 cakephp 并想使用jQuery ajax发布到我的服务器 问题是 jQuery 的 ajax附加协议和主机名 但还包括当前控制器 因此我无法更改我粘贴的控制器 有没有办法改变 url 参数 ajax 这是我的示例邮政编码
  • 这个程序如何运作?

    include
  • Silverlight 3 和 Silverlight 4 条件 xaml

    我现在正在开发一个必须分离项目文件的项目 一个符合 Silverlight 3 另一个符合 Silverlight 4 该项目创建了一个在其他几个项目中使用的用户控件 不幸的是 其中一个处于 SL3 状态 现在无法升级 这就是为什么需要 S
  • 将目录迁移到不同的 svn 存储库

    我在 svn 存储库中有代码 将其称为存储库 A 现在假设我需要将内容移动到存储库 B 但存储库 B 已经对其他项目处于活动状态一段时间了 是否可以将特定目录从存储库 A 移动到存储库 B 同时保留文件历史记录 通常 要将整个存储库迁移到新
  • MapView 显示在灰色瓷砖地图中未显示在 android google api 2.3.3 中

    您好 我正在开发一个地图视图 我尝试遵循以下方式 我通过单击按钮创建了一个 意图 添加权限和库 我创建了一个覆盖项目 我的模拟器的目标是GoogleApi 2 3 3 我的MapView密钥已获取并分配到mapview xml中 我看到底部
  • Eclipse:快速搜索文件名

    在 Eclipse 中工作时 我经常意识到我记得类名 但忘记了该类在哪个包中 使用搜索不是很方便 点击和按键次数过多 我想知道 有没有一个插件可以简化这个过程 例如 如果包资源管理器顶部有一个文本编辑框 可以根据输入的文本过滤显示包和 ja
  • 确定 1 到 0 转换之间的时间

    我的表格显示泵的开 关状态如下 Value timestamp 1 2013 09 01 00 05 41 987 0 2013 09 01 00 05 48 987 1 2013 09 01 00 05 59 987 0 2013 09
  • 使用reduce进行分组和求和

    我想返回一个按团队分组的数组 其中包含 gp 胜利 失败的总和 我试图通过减少来实现这一点 但是总数并没有相加 这是我的代码 const myArr team Red gp 3 win 2 loss 1 team Black gp 3 wi
  • Cordova/Phonegap 社交共享

    我正在寻找一种简单的解决方案 用于在 cordova phonegap 应用程序内部共享 我希望添加 Facebook Twitter 和电子邮件共享 就像这个应用程序一样 http itunes apple com us app mars
  • 在 Yii 中设置默认时区

    我正在使用以下时区配置配置文件 timeZone gt UTC 它工作正常 所有日期都根据以下内容存储在数据库中UTC 现在每个用户在他 她的个人资料中都有自己的时区 例如UTC 5 UTC 5 UTC 0 etc 现在我如何根据用户时区在
  • 我如何知道使用 Azure 存储的代码是否会受到 2015 年 12 月即将删除的 API 版本的影响? [复制]

    这个问题在这里已经有答案了 我有一个来自微软的电子邮件 http aka ms Qga48e据说较低版本的存储服务将于 2015 年 12 月被删除 我们的应用程序使用 Azure SDK 1 8 和 2 0 我们如何确定我们是否受到此更改
  • 如何创建一个android自动启动应用程序?

    如何创建一个安卓自动启动应用程序 我的应用程序显示特殊日期通知 并且它必须自动启动 tnx 您可以使用报警管理器 http developer android com reference android app AlarmManager h
  • 如何使屏幕上的按钮水平和垂直居中且等距?

    我已经绞尽脑汁 这里是android新手 所以不难做到 有一段时间试图找出如何实现这一点 使用RelativeLayout或AbsoluteLayout以外的东西来创建它 我有 Windows 编程背景 其中设备会为您调整 绝对 定位 并且
  • 哈希集与树集

    我一直很喜欢树 真好O n log n 以及它们的整洁 然而 我认识的每一位软件工程师都尖锐地问我为什么要使用TreeSet 从 CS 背景来看 我认为你使用什么并不重要 而且我不喜欢乱搞哈希函数和存储桶 在这种情况下 Java 在什么情况