打字猴:1.700445441e+09
1700445441 //生成新的键值对,并进行替换,建立链表
1700445442
1700445443 table[bucketIndex]=new Entry<K, V>(hash, key, value, e);
1700445444
1700445445 //判断是否需要扩容
1700445446
1700445447 if(size++>=threshold)
1700445448
1700445449 resize(2*table.length);
1700445450
1700445451 }
1700445452
1700445453 这段程序涵盖了两个业务逻辑:如果新加入的键值对的hashCode是唯一的,那直接插入的数组中,它Entry的next值则为null;如果新加入的键值对的hashCode与其他元素冲突,则替换掉数组中的当前值,并把新加入的Entry的next变量指向被替换掉的元素—于是,一个链表就生成了,可以用图5-1来表示。
1700445454
1700445455
1700445456
1700445457
1700445458 图5-1 HashMap存储结构图
1700445459
1700445460 HashMap的存储主线还是数组,遇到哈希冲突的时候则使用链表解决。了解了HashMap是如何存储的,查找也就一目了然了:使用hashCode定位元素,若有哈希冲突,则遍历对比,换句话说在没有哈希冲突的情况下,HashMap的查找则是依赖hashCode定位的,因为是直接定位,那效率当然就高了!
1700445461
1700445462 知道HashMap的查找原理,我们就应该很清楚:如果哈希码相同,它的查找效率就与ArrayList没什么两样了,遍历对比,性能会大打折扣。特别是在那些进度紧张的项目中,虽重写了hashCode方法但返回值却是固定的,此时如果把这些对象插入到HashMap中,查找就相当耗时了。
1700445463
1700445464 注意 HashMap中的hashCode应避免冲突。
1700445465
1700445466
1700445467
1700445468
1700445469 编写高质量代码:改善Java程序的151个建议 [:1700438151]
1700445470 编写高质量代码:改善Java程序的151个建议 建议80:多线程使用Vector或HashTable
1700445471
1700445472 Vector是ArrayList的多线程版本,HashTable是HashMap的多线程版本,这些概念我们都很清楚,也被前辈嘱咐过很多次,但我们经常会逃避使用Vector和HashTable,因为用得少,不熟嘛!只有在真正需要的时候才会想要使用它们,但问题是什么时候算真正需要呢?我们来看一个例子,看看使用线程安全的Vector是否可以解决问题,代码如下:
1700445473
1700445474 public static void main(String[]args){
1700445475
1700445476 //火车票列表
1700445477
1700445478 final List<String>tickets=new ArrayList<String>();
1700445479
1700445480 //初始化票据池
1700445481
1700445482 for(int i=0;i<100000;i++){
1700445483
1700445484 tickets.add(“火车票”+i);
1700445485
1700445486 }
1700445487
1700445488 //退票
1700445489
1700445490 Thread returnThread=new Thread(){
[ 上一页 ]  [ :1.700445441e+09 ]  [ 下一页 ]