java - HashSet vs ArrayList contains() 几个小字符串集合的性能
问题描述
这个问题本质上是对这个问题的补充,它已经询问了 Java 的contains()
性能,但我的用例针对具有少量 String 元素的集合。
为了使问题更精确,将有:
- 只有
java.lang.String
集合中的元素(因此String.equals(...)
在contains(...)
调用中使用)。 - 字符串的平均长度为 16。
- 单个集合中的平均元素数为 7。
- 该系列将面临频繁的
contains(...)
检查,偶尔的添加,并且不会被删除。 - 字符串的顺序根本不重要。
- 此代码将在 Web 服务器上运行,并且会有大量此类集合对象(每个用户请求约 1000 个)。
哪个集合更适合这个用例,无论是在内存方面还是时间方面?
解决方案
在内存方面,哪个集合更适合这个用例?
一个String[]
。不能比这更紧凑了。
当然,这不是真正的 a Collection
,但我以最宽松的含义理解了它。
为获得最佳查找 ( contains
) 性能,对其进行排序并使用二分查找。
...和时间方面?
可能是 a HashSet
,但是你需要测试这样小的集合的性能,因为例如二进制搜索的O(log n)性能实际上可能比哈希表查找的O(1)n
性能更快,当时只有 7。
对于这么小的 a 值n
,性能差异可能可以忽略不计,并且内存占用可能更重要。
在内存占用和运行时性能之间做出决定,只有您可以决定哪个“更合适”。我们不能为你决定。
推荐阅读
- arduino - 使用带有 DTH11 的 Arduino ATmega328P ADC 读取温度
- django - POST 和 GET 请求的不同序列化程序,这是正确的方法吗?动态嵌套序列化器
- python - 改进代码:在中间件中单击时显示 url 的日期时间
- selenium-ide - 如何读取输出字符串的一部分并将其与 seleniumIDE 中的存储变量进行比较
- c# - 由于包 ZedGraph 不兼容,无法运行包 EmguCV
- kofax - 为自定义模块创建设置表单
- javascript - 无法使用反应原生蓝牙
- r - 如何基于另一个 .csv 文件删除 .csv 文件的元素?
- firebase-realtime-database - Mat-table 按列过滤来自 Firebase 的数据
- c++ - 如何从 DirectX 11 中的着色器汇编代码编译?