hashmap详解

1、继承关系:

java.lang.Object 2、HashTable基于Map接口的实现,这一实现提供了所有的Map接口的实现,并且允许null值和null键。(HashMap类和HashTable大致上是一样的,除了有2点不同之处,即为HashMap是非同步的[线程不安全的]和允许null值存在)。该类对Map中元素的顺序并未做出任何保证,尤其是,它不能保证随着时间的改变其顺序不发生变化。

3、该类中,put和get方法的执行时间为常数级的,因为我们假定了Map中的元素已经按照哈希功能分开存储。HashMap在扩展自身容量时,基于集合视图的迭代是要发费一定比例时间的。因此如果迭代功能很重要的话,不要把初始容量大小设置太高的做法是很重要的。

4、HashMap中有两个参数会影响其实例化:初始容量和载入属性。容量是哈希表中哈希元的数量,初始容量就是哈希表创建时的容量,载入属性是一种决定方式,该方式确定了在HashTable自动增长容量之前是如何判定HashTable中元素是否已满。当哈希表的入口数多于载入属性的实例和其当前容量时,HashTable会重新执行其哈希功能(也就是说,内部数据结构会被重新创建)以便哈希表的哈希元能够变为大约原来的两倍。

5、通常来讲,默认载入属性都会在时间和空间上有一个很好的权衡。较高的值会降低使用空间但也会增加查表成本(会影响HashMap大部分的操作,包括get和put方法)。在开始设置容量时,应充分考虑到Map的进入元素数和载入属性,以便将哈希功能重构次数最小化,如果初始化容量大于根据载入属性而进入Map中的元素数,那么重构哈希功能将不会出现。

6、HashMap中如果有很多映射,那么创建一个更加有效的大容量将使得映射存储更加有效,而不是让其根据需要自动增长大小。

注意,这一实现是不同步的,如果多个线程同时使用了HashMap,而且至少一个线程修改了HashMap的结构,它在外面看起来一定是要同步的(结构改变包括,添加或删除一个或者多个映射,仅仅改变某个键对应的值不算是结构改变),这通常由同步一些包含Map的对象来完成。如果这样的对象不存在,那么我们需要通过Collections.synchronizedMap 方法来将其包裹在内。这最好在创建时就执行,以阻止发生一些不必要的事情:

 Map m = Collections.synchronizedMap(new HashMap(...));
7、由类的迭代器返回的迭代次数是实效很迅速的:在迭代创建后的如果集合set发生修改,除了通过迭代器自身的remove方法外的其它任何方法,迭代会抛出异常ConcurrentModificationException。 因此,就同时修改元素而言,迭代会迅速且全部失效,而不是冒险去出现一些在未来某时不确定的行为。

注意迭代器的fail-fast特性不能保证,正如在非同步化修改中做保证也是不可能的。fail-fast迭代次数会在被动的尽力的基础上抛出 ConcurrentModificationException异常。因此,写一个依赖此异常来判定其正确性的程序的想法是错误的:迭代器里的fail-fast

行为仅应该被用作查找bug。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值