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;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=newEntry(hash,key,value,table);
由于hash的算法有大概令分歧的键值有不异的hash码并有不异的table索引,如:key=“33”和key=Objectg的hash都是-8901334,那它经由indexfor以后的索引必定都为i,如许在new的时分这个Entry的next就会指向这个底本的table,再有下一个也云云,构成一个链表,和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本书足以,这就是区别。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) Java 编程语言的风格十分接近C、C++语言。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
页:
[1]