|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net网页编程,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。
经由过程HashMap、HashSet的源代码剖析其Hash存储机制
汇合和援用
就像援用范例的数组一样,当我们把Java对象放进数组之时,并非真正的把Java对象放进数组中,只是把对象的援用放进数组中,每一个数组元素都是一个援用变量。
实践上,HashSet和HashMap之间有良多类似的地方,关于HashSet而言,体系接纳Hash算法决意汇合元素的存储地位,如许能够包管能疾速存、取汇合元素;关于HashMap而言,体系key-value当做一个全体举行处置,体系老是依据Hash算法来盘算key-value的存储地位,如许能够包管能疾速存、取Map的key-value对。
在先容汇合存储之前必要指出一点:固然汇合号称存储的是Java对象,但实践上其实不会真正将Java对象放进Set汇合中,只是在Set汇合中保存这些对象的援用而言。也就是说:Java汇合实践上是多个援用变量所构成的汇合,这些援用变量指向实践的Java对象。
HashMap的存储完成
当程序试图将多个key-value放进HashMap中时,以以下代码片断为例:
HashMap<String , Double> map = new HashMap<String , Double>();
map.put("语文" , 80.0);
map.put("数学" , 89.0);
map.put("英语" , 78.2);
HashMap接纳一种所谓的“Hash算法”来决意每一个元素的存储地位。
当程序实行map.put("语文",80.0);时,体系将挪用"语文"的hashCode()办法失掉其hashCode值——每一个Java对象都有hashCode()办法,都可经由过程该办法取得它的hashCode值。失掉这个对象的hashCode值以后,体系会依据该hashCode值来决意该元素的存储地位。
我们能够看HashMap类的put(Kkey,Vvalue)办法的源代码:
public V put(K key, V value)
{
// 假如 key 为 null,挪用 putForNullKey 办法举行处置
if (key == null)
return putForNullKey(value);
// 依据 key 的 keyCode 盘算 Hash 值
int hash = hash(key.hashCode());
// 搜刮指定 hash 值在对应 table 中的索引
int i = indexFor(hash, table.length);
// 假如 i 索引处的 Entry 不为 null,经由过程轮回不休遍历 e 元素的下一个元素
for (Entry<K,V> e = table[i]; e != null; e = e.next)
{
Object k;
// 找到指定 key 与必要放进的 key 相称(hash 值不异
// 经由过程 equals 对照放回 true)
if (e.hash == hash && ((k = e.key) == key
|| key.equals(k)))
{
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
// 假如 i 索引处的 Entry 为 null,标明此处还没有 Entry
modCount++;
// 将 key、value 增加到 i 索引处
addEntry(hash, key, value, i);
return null;
}
<p>
net网页编程程序员的大部门代码都靠控件拖拽完成的,虽然java也有,但是无论从美观和速度上都没发和.net网页编程比。java程序员都是代码完成的,所以java程序员常戏称.net网页编程程序员是操作员,呵呵。 |
|