fed*_*nov 2 java arrays hashtable
我正在考虑以下情况:我想计算字符串中字符的出现次数(例如,用于排列检查).
一种方法是分配一个256个整数的数组(我假设字符是UTF-8),用零填充它然后通过字符串并增加对应于int的数组位置的整数字符的价值.
但是,对于这种方法,每次都必须分配256个数组,即使分析的字符串非常短(因此只使用数组的一小部分).
另一种方法是使用Character to Integer HashTable并为每个遇到的char存储一个数字.这样,您只能拥有字符串中实际存在的字符键.
由于我对HashTable的理解是相当理论的,我真的不知道它是如何在Java中实现的,我的问题是:这两种方法中哪一种更有效?
编辑:
在讨论这个问题时(谢谢大家的答案)我确实意识到我对UTF-8的本质有一个非常模糊的理解.经过一番搜索后,我发现了这个我要分享的精彩视频,万一有人遇到同样的问题.
我想知道为什么当你假设你的String是UTF-8时你选择256作为数组的长度.在UTF-8中,一个字符最多可由4个字节组成,这意味着比256个字符多得多.
无论如何:使用HashTable/HashMap需要巨大的内存开销.首先,所有字符和整数都需要包装在一个对象中(整数/字符).整数占用的内存大约是int的3倍.对于数组,由于java对数组执行的优化(例如,java堆栈仅在4字节的倍数下工作,而在数组java中允许较小的类型,例如char只消耗2个字节),因此差异可能更大.
然后HashTable本身会产生内存开销,因为它需要维护一个数组(通常没有完全使用)和链接列表来维护生成相同哈希的所有对象.
此外,阵列的访问时间将大大加快.您保存了多个方法调用(add,hashCode,iterator,...),并且在java字节代码中存在许多操作码,以便更有效地处理数组.
无论如何.你的问题是:
这两种方法中哪一种更有效?
可以肯定地说,数组的内存效率会更高.
但是你应该完全确定你的要求是什么.你需要更高的内存效率吗?(如果您处理大量数据或者您使用的是慢速设备(移动设备?),可能会出现这种情况吗?)代码的可读性有多重要?代码大小怎么样?可重用?
ist 256真的是正确的尺寸吗?