仓酷云

标题: JAVA网页编程之Java中对HashMap的深度剖析与对照 [打印本页]

作者: 山那边是海    时间: 2015-1-18 11:30
标题: JAVA网页编程之Java中对HashMap的深度剖析与对照
C#跟java类似,但是在跨平台方面理论上可以跨平台,实际上应用不大,执行性能优于java,跟C++基本一致,但是启动速度还是慢.代码安全,但容易性能陷阱.对照在Java的天下里,不管类仍是各类数据,其布局的处置是全部程序的逻辑和功能的关头。因为自己打仗了一个有关功能与逻辑同时并存的成绩,因而就入手下手研讨这方面的成绩。找遍了年夜巨细小的论坛,也把《Java假造机标准》,《apress,.java.collections.(2001),.bm.ocr.6.0.shareconnector》,和《ThinkinginJava》翻了也找不到很好的谜底,因而一气之下把JDK的src解压出来研讨,扩然开畅,遂写此文,跟人人分享感觉温柔便考证我了解另有没有毛病。这里就拿HashMap来研讨吧。

  HashMap可谓JDK的一年夜有用工具,把各个Object映照起来,完成了“键--值”对应的疾速存取。但实践内里做了些甚么呢?

  在这之前,先先容一下负载因子和容量的属性。人人都晓得实在一个HashMap的实践容量就因子*容量,其默许值是16×0.75=12;这个很主要,对效力很必定影响!当存进HashMap的对象凌驾这个容量时,HashMap就会从头机关存取表。这就是一个年夜成绩,我前面渐渐先容,归正,假如你已晓得你也许要寄存几个对象,最好设为该实践容量的能承受的数字。

  两个关头的办法,put和get:

  先有如许一个观点,HashMap是声了然Map,Cloneable,Serializable接口,和承继了AbstractMap类,内里的Iterator实在次要都是其外部类HashIterator和其他几个iterator类完成,固然另有一个很主要的承继了Map.Entry的Entry外部类,因为人人都有源代码,人人有乐趣能够看看这部分,我次要想申明的是Entry外部类。它包括了hash,value,key和next这四个属性,很主要。put的源码以下

publicObjectput(Objectkey,Objectvalue){
Objectk=maskNull(key);

  这个就是判别键值是不是为空,其实不很深邃,实在假如为空,它会前往一个staticObject作为键值,这就是为何HashMap同意空键值的缘故原由。

inthash=hash(k);
inti=indexFor(hash,table.length);

  这一连的两步就是HashMap最牛的中央!研讨完我都汗颜了,个中hash就是经由过程key这个Object的hashcode举行hash,然后经由过程indexFor取得在Objecttable的索引值。

  table???不要惊奇,实在HashMap也神不到那里往,它就是用table来放的。最牛的就是用hash能准确的前往索引。个中的hash算法,我跟JDK的作者Doug接洽过,他倡议我看看《Theartofprogramingvol3》可爱的是,我之前就一向在找,我都找不到,他如许一提,我就加倍急了,惋惜口袋空空啊!!!

  不晓得人人有无寄望put实际上是一个有前往的办法,它会把不异键值的put掩盖失落并前往旧的值!以下办法完全申明了HashMap的布局,实在就是一个表加上在响应地位的Entry的链表:

for(Entrye=table[i];e!=null;e=e.next){
 if(e.hash==hash&&eq(k,e.key)){
  Objectoldvalue=e.value;
  e.value=value;//把新的值付与给对应键值。
  e.recordAccess(this);//空办法,留待完成
  returnoldvalue;//前往不异键值的对应的旧的值。
 }
}
modCount++;//布局性变动的次数
addEntry(hash,k,value,i);//增加新元素,关头地点!
returnnull;//没有不异的键值前往
}

  我们把关头的办法拿出来剖析:

voidaddEntry(inthash,Objectkey,Objectvalue,intbucketIndex){
table[bucketIndex]=newEntry(hash,key,value,table[bucketIndex]);

  由于hash的算法有大概令分歧的键值有不异的hash码并有不异的table索引,如:key=“33”和key=Objectg的hash都是-8901334,那它经由indexfor以后的索引必定都为i,如许在new的时分这个Entry的next就会指向这个底本的table[i],再有下一个也云云,构成一个链表,和put的轮回对定e.next取得旧的值。到这里,HashMap的布局,人人也非常分明了吧?

if(size++>=threshold)//这个threshold就是能实践包容的量
resize(2*table.length);//超越这个容量就会将Objecttable重构

  所谓的重构也不神,就是建一个两倍年夜的table(我在其余论坛上看到有人说是两倍加1,把我骗了),然后再一个个indexfor出来!注重!!这就是效力!!假如你能让你的HashMap不必要重构那末屡次,效力会年夜年夜进步!

  说到这里也差未几了,get比put复杂很多,人人,懂得put,get也差不了几了。关于collections我是以为,它是合适普遍的,当不完整合适独有的,假如人人的程序必要特别的用处,本人写吧,实在很复杂。(作者是如许跟我说的,他还倡议我用LinkedHashMap,我看了源码今后发明,LinkHashMap实在就是承继HashMap的,然后override响应的办法,有乐趣的同人,本人looklook)建个Objecttable,写响应的算法,就ok啦。

  举个例子吧,像Vector,list啊甚么的实在都很复杂,最多就多了的同步的声明,实在假如要完成像Vector那种,拔出,删除未几的,能够用一个Objecttable来完成,按索引存取,增加等。

  假如拔出,删除对照多的,能够建两个Objecttable,然后每一个元素用含有next布局的,一个table存,假如要拔出到i,可是i已有元素,用next连起来,然后size++,并在另外一个table纪录其地位。




对于一个大型项目,如果用java来作,可能需要9个月,并且可能需要翻阅10本以上的书,但如果用ruby来作,3个月,3本书就足够了,而.net也不过3,4本书足以,这就是区别。
作者: 仓酷云    时间: 2015-1-21 08:56
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者: 海妖    时间: 2015-1-26 09:01
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者: 爱飞    时间: 2015-2-4 13:29
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者: 若天明    时间: 2015-2-4 20:53
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者: 分手快乐    时间: 2015-2-8 03:50
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者: 透明    时间: 2015-2-19 04:51
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
作者: 只想知道    时间: 2015-3-2 21:50
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
作者: 兰色精灵    时间: 2015-3-7 06:09
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者: 再现理想    时间: 2015-3-13 01:05
Java 编程语言的风格十分接近C、C++语言。
作者: 简单生活    时间: 2015-3-23 11:07
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
作者: 小魔女    时间: 2015-3-25 20:18
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 精灵巫婆    时间: 2015-4-6 01:16
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 柔情似水    时间: 2015-4-6 21:57
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 若相依    时间: 2015-4-15 06:36
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者: 愤怒的大鸟    时间: 2015-4-30 00:42
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者: 深爱那片海    时间: 2015-5-7 19:31
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 谁可相欹    时间: 2015-7-11 05:29
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 第二个灵魂    时间: 2015-7-15 15:36
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者: 不帅    时间: 2015-7-26 19:19
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。




欢迎光临 仓酷云 (http://www.ckuyun.com/) Powered by Discuz! X3.2