【发布时间】:2014-02-20 13:11:19
【问题描述】:
我在考虑以下情况:我想计算字符串中字符的出现次数(例如用于排列检查)。
一种方法是分配一个包含 256 个整数的数组(我假设字符是 UTF-8),用零填充它,然后遍历字符串并在对应的数组位置上递增整数到字符的 int 值。
但是,对于这种方法,您每次都必须分配一个 256 个数组,即使分析的字符串非常短(因此只使用数组的一小部分)。
另一种方法是使用 Character 到 Integer HashTable 并为每个遇到的 char 存储一个数字。这样,您将只有实际在字符串中的字符的键。
由于我对 HashTable 的理解是理论上的,而且我真的不知道它是如何在 Java 中实现的,所以我的问题是:这两种方法中哪一种更节省内存?
编辑:
在讨论这个问题的过程中(谢谢大家的回答),我确实意识到我对 UTF-8 的性质有一个非常模糊的理解。经过一番搜索,我找到了我想分享的this great video,以防有人遇到同样的问题。
【问题讨论】:
-
我曾经拥有一台内存高达 56K 的 Apple II。我也曾经每天步行 5 英里上学,双向上山…… :) 也许那时我会担心 256 个整数的数组。
-
如果最小的 HashMap 占用的存储空间少于 256 个整数的数组,我会感到相当惊讶
-
问题的约束是如何准确定义的? UTF-8 目前支持表示大约 250,000 个不同的字符。
-
可能有超过一百万,实际上分配给当前规范中的真实角色是不同的:)
-
有些字符集(例如 latin-9)可编码为 8 位并涵盖(西方)“欧洲语言”。在实践中,对于大多数现实世界的数据,即使只是 € 也将具有 8364 的十进制编码。您愿意分配多大的数组?地图突然变得更好了!