深爱那片海 发表于 2015-1-18 11:27:27

发布一篇经由过程剖析JDK源代码研讨Hash存储机制

还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是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; 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网页编程程序员是操作员,呵呵。

灵魂腐蚀 发表于 2015-1-21 07:04:43

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

飘灵儿 发表于 2015-1-30 22:47:11

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

金色的骷髅 发表于 2015-2-2 21:59:00

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

莫相离 发表于 2015-2-8 08:28:16

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

透明 发表于 2015-2-9 21:57:24

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

小魔女 发表于 2015-2-17 04:43:34

一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从

飘飘悠悠 发表于 2015-3-1 19:29:29

科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

小女巫 发表于 2015-3-10 22:30:46

一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。

仓酷云 发表于 2015-3-17 11:10:47

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

乐观 发表于 2015-3-17 11:10:48

Java 编程语言的风格十分接近C、C++语言。

admin 发表于 2015-3-17 11:10:53

是一种为 Internet发展的计算机语言

爱飞 发表于 2015-3-17 11:10:55

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。

不帅 发表于 2015-3-24 08:48:33

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
页: [1]
查看完整版本: 发布一篇经由过程剖析JDK源代码研讨Hash存储机制