仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3477|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页编程之Java中对HashMap的深度剖析与对照

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:30:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 16:35

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表