仓酷云

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

作者: 海妖    时间: 2015-1-18 11:53
标题: JAVA网页编程之Java中对HashMap的深度剖析
C#是不行的,比如说美国的航天飞船里就有java开发的程序以上是我的愚见,其实不管那种语言,你学好了,都能找到好的工作,在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本质而言,是面相对象的,但是你有没有发现,java也不全是,比如说基本类型,int,那他就是整型而不是对象,转换类型是还得借助包装类。
作者: 飘灵儿    时间: 2015-1-21 16:45
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 若天明    时间: 2015-1-30 18:31
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 老尸    时间: 2015-2-2 22:08
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 不帅    时间: 2015-2-5 08:12
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
作者: 深爱那片海    时间: 2015-2-6 19:36
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: admin    时间: 2015-2-18 10:57
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 简单生活    时间: 2015-2-27 19:20
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
作者: 灵魂腐蚀    时间: 2015-3-4 02:11
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 蒙在股里    时间: 2015-3-10 20:45
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 冷月葬花魂    时间: 2015-3-11 18:19
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
作者: 金色的骷髅    时间: 2015-3-14 15:38
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者: 爱飞    时间: 2015-3-21 11:24
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者: 分手快乐    时间: 2015-4-6 06:17
是一种为 Internet发展的计算机语言
作者: 飘飘悠悠    时间: 2015-4-27 15:06
是一种语言,用以产生「小应用程序(Applet(s))
作者: 若相依    时间: 2015-6-11 18:06
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者: 小女巫    时间: 2015-6-22 22:06
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
作者: 再现理想    时间: 2015-6-23 17:59
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 谁可相欹    时间: 2015-6-28 22:49
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者: 活着的死人    时间: 2015-7-12 09:35
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。




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