Map以及Hash相关区分

  1. HsahMap:底层数组+链表实现,初始size为16,扩容:newsize = oldsize*2,是最常用的Map,根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键位NULL,允许多条记录的值为NULL。HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的功能。便于在Map中插入、删除、定位元素。
  2. Hashtable:与HashMap类似,也是底层数组+链表实现,初始size为11,扩容:newsize = oldsize*2+1,不同在于:它不允许记录的键或值为空,支持线程的同步,即任一时刻只有一个线程能写Hashtable,采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作,因此也导致了Hashtable在写入的时候会比较慢。
  3. TreeMap:遍历较HashMap慢,但它能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。
  4. LinkedHashMap:保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录是先插入的,它还可以按读取顺序来排序。
  5. HashedMap:apache的commons项目出的工具类,以用于替代HashMap,增加了一些新的功能。
  6. ConcurrentHashMap:Java5提供的,它是HashTable的替代,比HashTable的扩展性更好。底层采用分段的数组+链表实现,线程安全。通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值)默认将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值