hashmap的正确使用方法

近期发生太多关于集合类使用不当导致的bug, 在此记录下关于hashmap的信息。

 

https://gist.github.com/1081908

http://www.iteye.com/topic/962172

http://blog.sina.com.cn/s/blog_5465f7f20100tugf.html

http://blog.youkuaiyun.com/cleverpig2003/article/details/249844

 

问题列表:

1. hashmap.get() 导致cpu100%

2. hashmap.get()值不正确

……

 

剖析:

1. hashmap是非线程安全,所以也无须谈其数据是否正确。

2. 高并发下,hashmap的设计,可能会导致链表闭环。(可看hashmap的源码,hash冲突和动态扩容)

3. hashmap动态扩容的成本。大数据量的put,在没有设定容量的情况下,会有些问题.

 

建议:

1. 多看集合类的源码实现

2. 多看java.util.concurrent.*

 

 

好的,如果不使用 HashMap,我们可以采用两个数组来完成,一个数组用于存放单词,另一个数组用于存放单词出现的次数。这样做的缺点是需要事先确定单词数组的长度,如果句子中的单词数目超过了数组长度,就无法正确统计出现次数。 以下是一个基于 Arrays 的 Java 代码示例: ```java import java.util.Arrays; public class Main { public static void main(String[] args) { String sentence = "Java is a popular programming language used to develop applications."; String[] words = sentence.split(" "); int[] counts = new int[words.length]; for (int i = 0; i < words.length; i++) { counts[i] = 1; for (int j = i + 1; j < words.length; j++) { if (words[i].equals(words[j])) { counts[i]++; } } } int maxCount = counts[0]; int maxIndex = 0; for (int i = 1; i < counts.length; i++) { if (counts[i] > maxCount) { maxCount = counts[i]; maxIndex = i; } } System.out.println("The most frequent word is \"" + words[maxIndex] + "\", which appears " + maxCount + " times."); } } ``` 在这个示例中,我们首先定义了一个字符串变量 `sentence`,它包含要统计的英文句子。然后,我们使用 `split()` 方法将句子按照空格分割成单词,并将它们保存在一个字符串数组 `words` 中。 接下来,我们定义了一个整型数组 `counts`,用于记录每个单词出现的次数。我们遍历 `words` 数组,对于每个单词,我们将它的出现次数初始化为 1,然后再遍历 `words` 数组中该单词后面的所有单词,如果有和它相同的单词,我们就将它的出现次数加 1。 最后,我们遍历 `counts` 数组,找到出现次数最多的那个单词,并将它的下标保存在变量 `maxIndex` 中。我们还记录了这个单词出现的次数,并将它保存在变量 `maxCount` 中。最后,我们打印出这个单词和它的出现次数。 需要注意的是,这种方法只适用于单词数组长度足够的情况,否则可能会出现数组越界的错误。如果要处理长度不确定的单词数组,还是建议使用 HashMap 来完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值