这一块主要整理一下HashMap与HashTable之间个别重要的点和细节以及这两者之间的异同点!
首先简单介绍一下何谓线程安全?
如果我们的代码所在的进程中有多个线程在同时运行,而且这些线程可能同时运行这段代码。如果每次的运行结果和单线程的运行结果是一样的,而且其他的变量的值也和预期的是一样的,那就是线程安全的。
一、HashMap
1、HashMap线程不安全体现在哪里?
HashMap的默认容量是16,当在进行put的时候,插入的元素超过了容量(由加载因子决定)的范围就会触发扩容操作,也就是rehash过程,这个方法会重新将原数组的内容重新hash到新的扩容数组当中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现在同一数组下用链表表示,造成闭环,导致在获取数据也就是进行get操作的时候,产生死循环,所以HashMap是线程不安全的。(本来应该画图解释的,但是限于自身对这个多线程环境操作不太熟悉,也就直接给出文字总结版)。
2、HashMap的适用场景?
因为HashMap是非线程安全的,故其适用于单线程环境下。
底下的代码演示是上课没写出来,课下自己又练了练,贴在这里。
//10万个数据统计数据重复出现的次数并打印
//首先随机产生10万个原始数据
LinkedList list=new LinkedList();
Random random=new Random();
for(int i=0;i<100000;i++){
list.add(random.nextInt(100));
}
//统计出现的次数
HashMap<Integer,Integer> map=new HashMap<>();
Iterator<Integer> iterator=list.iterator();
while(iterator.hasNext()){
Integer value=iterator.next();
Integer num=map.get(value);
if(num==null){
map.put(value,1);
}else{
map.put(value,num+1);
}
}
//打印数据
System.out.println("统计10万个数据重复出现的次数:");
Iterator<Map.Entry<Integer,Integer>> iterator1=map.entrySet().iterator();
while(iterator1.hasNext()){
Map.Entry<Integer,Integer> entry=iterator1.next();
Integer value1=entry.getKey();
Integer number=entry.getValue();
System.out.print(number+" "+value1 +" ");
}