标题:
Java 容器源码分析之Map-Set-List(5)
[打印本页]
作者:
look_w
时间:
2018-12-24 17:03
标题:
Java 容器源码分析之Map-Set-List(5)
解决方案在上文中也提到,fail-fast 机制,是一种错误检测机制。它只能被用来检测错误,因为 JDK 并不保证 fail-fast 机制一定会发生。若在多线程环境下使用 fail-fast 机制的集合,建议使用“java.util.concurrent 包下的类”去取代“java.util 包下的类”。
HashMap 的两种遍历方式第一种 [url=]
[/url]
Map map =
new
HashMap(); Iterator iter
=
map.entrySet().iterator();
while
(iter.hasNext()) { Map.Entry entry
=
(Map.Entry) iter.next(); Object key
=
entry.getKey(); Object val
=
entry.getValue(); }
[url=]
[/url]
效率高,以后一定要使用此种方式!
第二种[url=]
[/url]
Map map =
new
HashMap(); Iterator iter
=
map.keySet().iterator();
while
(iter.hasNext()) { Object key
=
iter.next(); Object val
=
map.get(key); }
[url=]
[/url]
效率低,以后尽量少使用!
HashSet 的实现原理HashSet 概述对于 HashSet 而言,它是基于 HashMap 实现的,底层采用 HashMap 来保存元素,所以如果对 HashMap 比较熟悉了,那么学习 HashSet 也是很轻松的。
我们先通过 HashSet 最简单的构造函数和几个成员变量来看一下,证明咱们上边说的,其底层是 HashMap:
[url=]
[/url]
private
transient
HashMap<E,Object>
map;
//
Dummy value to associate with an Object in the backing Map
private
static
final
Object PRESENT =
new
Object();
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has * default initial capacity (16) and load factor (0.75).
*/
public
HashSet() { map
=
new
HashMap<>
(); }
[url=]
[/url]
其实在英文注释中已经说的比较明确了。首先有一个HashMap的成员变量,我们在 HashSet 的构造函数中将其初始化,默认情况下采用的是 initial capacity为16,load factor 为 0.75。
HashSet 的实现对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,我们应该为保存到 HashSet 中的对象覆盖 hashCode() 和 equals()
构造方法[url=]
[/url]
/**
* 默认的无参构造器,构造一个空的HashSet。 * * 实际底层会初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。
*/
public
HashSet() { map
=
new
HashMap<E,Object>
();}
/**
* 构造一个包含指定collection中的元素的新set。 * * 实际底层使用默认的加载因子0.75和足以包含指定collection中所有元素的初始容量来创建一个HashMap。 *
@param
c 其中的元素将存放在此set中的collection。
*/
public
HashSet(Collection<?
extends
E>
c) { map
=
new
HashMap<E,Object>(Math.max((
int
) (c.size()/.75f) + 1, 16
)); addAll(c);}
/**
* 以指定的initialCapacity和loadFactor构造一个空的HashSet。 * * 实际底层以相应的参数构造一个空的HashMap。 *
@param
initialCapacity 初始容量。 *
@param
loadFactor 加载因子。
*/
public
HashSet(
int
initialCapacity,
float
loadFactor) { map
=
new
HashMap<E,Object>
(initialCapacity, loadFactor);}
/**
* 以指定的initialCapacity构造一个空的HashSet。 * * 实际底层以相应的参数及加载因子loadFactor为0.75构造一个空的HashMap。 *
@param
initialCapacity 初始容量。
*/
public
HashSet(
int
initialCapacity) { map
=
new
HashMap<E,Object>
(initialCapacity);}
/**
* 以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。此构造函数为包访问权限,不对外公开, * 实际只是是对LinkedHashSet的支持。 * * 实际底层会以指定的参数构造一个空LinkedHashMap实例来实现。 *
@param
initialCapacity 初始容量。 *
@param
loadFactor 加载因子。 *
@param
dummy 标记。
*/
HashSet(
int
initialCapacity,
float
loadFactor,
boolean
dummy) { map
=
new
LinkedHashMap<E,Object>
(initialCapacity, loadFactor);}
[url=]
[/url]
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0