仓酷云

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

[学习教程] 了解下JAVA的Java汇合源码分析:Hashtable源码分析

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 10:59:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。
Hashtable简介
Hashtable一样是基于哈希表完成的,一样每一个元素是一个key-value对,其外部也是经由过程单链表办理抵触成绩,容量不敷(凌驾了阀值)时,一样会主动增加。
Hashtable也是JDK1.0引进的类,是线程平安的,能用于多线程情况中。
Hashtable一样完成了Serializable接口,它撑持序列化,完成了Cloneable接口,能被克隆。
HashTable源码分析
Hashtable的源码的良多完成都与HashMap差未几,源码以下(到场了对照具体的正文):
  1. packagejava.util;
  2. importjava.io.*;
  3. publicclassHashtable<K,V>
  4. extendsDictionary<K,V>
  5. implementsMap<K,V>,Cloneable,java.io.Serializable{
  6. //保留key-value的数组。
  7. //Hashtable一样接纳单链表办理抵触,每个Entry实质上是一个单向链表
  8. privatetransientEntry[]table;
  9. //Hashtable中键值对的数目
  10. privatetransientintcount;
  11. //阈值,用于判别是不是必要调剂Hashtable的容量(threshold=容量*加载因子)
  12. privateintthreshold;
  13. //加载因子
  14. privatefloatloadFactor;
  15. //Hashtable被改动的次数,用于fail-fast机制的完成
  16. privatetransientintmodCount=0;
  17. //序列版本号
  18. privatestaticfinallongserialVersionUID=1421746759512286392L;
  19. //指定“容量巨细”和“加载因子”的机关函数
  20. publicHashtable(intinitialCapacity,floatloadFactor){
  21. if(initialCapacity<0)
  22. thrownewIllegalArgumentException("IllegalCapacity:"+
  23. initialCapacity);
  24. if(loadFactor<=0||Float.isNaN(loadFactor))
  25. thrownewIllegalArgumentException("IllegalLoad:"+loadFactor);
  26. if(initialCapacity==0)
  27. initialCapacity=1;
  28. this.loadFactor=loadFactor;
  29. table=newEntry[initialCapacity];
  30. threshold=(int)(initialCapacity*loadFactor);
  31. }
  32. //指定“容量巨细”的机关函数
  33. publicHashtable(intinitialCapacity){
  34. this(initialCapacity,0.75f);
  35. }
  36. //默许机关函数。
  37. publicHashtable(){
  38. //默许机关函数,指定的容量巨细是11;加载因子是0.75
  39. this(11,0.75f);
  40. }
  41. //包括“子Map”的机关函数
  42. publicHashtable(Map<?extendsK,?extendsV>t){
  43. this(Math.max(2*t.size(),11),0.75f);
  44. //将“子Map”的全体元素都增加到Hashtable中
  45. putAll(t);
  46. }
  47. publicsynchronizedintsize(){
  48. returncount;
  49. }
  50. publicsynchronizedbooleanisEmpty(){
  51. returncount==0;
  52. }
  53. //前往“一切key”的列举对象
  54. publicsynchronizedEnumeration<K>keys(){
  55. returnthis.<K>getEnumeration(KEYS);
  56. }
  57. //前往“一切value”的列举对象
  58. publicsynchronizedEnumeration<V>elements(){
  59. returnthis.<V>getEnumeration(VALUES);
  60. }
  61. //判别Hashtable是不是包括“值(value)”
  62. publicsynchronizedbooleancontains(Objectvalue){
  63. //注重,Hashtable中的value不克不及是null,
  64. //如果null的话,抛出非常!
  65. if(value==null){
  66. thrownewNullPointerException();
  67. }
  68. //从后向前遍历table数组中的元素(Entry)
  69. //关于每一个Entry(单向链表),逐一遍历,判别节点的值是不是即是value
  70. Entrytab[]=table;
  71. for(inti=tab.length;i-->0;){
  72. for(Entry<K,V>e=tab[i];e!=null;e=e.next){
  73. if(e.value.equals(value)){
  74. returntrue;
  75. }
  76. }
  77. }
  78. returnfalse;
  79. }
  80. publicbooleancontainsValue(Objectvalue){
  81. returncontains(value);
  82. }
  83. //判别Hashtable是不是包括key
  84. publicsynchronizedbooleancontainsKey(Objectkey){
  85. Entrytab[]=table;
  86. //盘算hash值,间接用key的hashCode取代
  87. inthash=key.hashCode();
  88. //盘算在数组中的索引值
  89. intindex=(hash&0x7FFFFFFF)%tab.length;
  90. //找到“key对应的Entry(链表)”,然后在链表中找出“哈希值”和“键值”与key都相称的元素
  91. for(Entry<K,V>e=tab[index];e!=null;e=e.next){
  92. if((e.hash==hash)&&e.key.equals(key)){
  93. returntrue;
  94. }
  95. }
  96. returnfalse;
  97. }
  98. //前往key对应的value,没有的话前往null
  99. publicsynchronizedVget(Objectkey){
  100. Entrytab[]=table;
  101. inthash=key.hashCode();
  102. //盘算索引值,
  103. intindex=(hash&0x7FFFFFFF)%tab.length;
  104. //找到“key对应的Entry(链表)”,然后在链表中找出“哈希值”和“键值”与key都相称的元素
  105. for(Entry<K,V>e=tab[index];e!=null;e=e.next){
  106. if((e.hash==hash)&&e.key.equals(key)){
  107. returne.value;
  108. }
  109. }
  110. returnnull;
  111. }
  112. //调剂Hashtable的长度,将长度酿成本来的2倍+1
  113. protectedvoidrehash(){
  114. intoldCapacity=table.length;
  115. Entry[]oldMap=table;
  116. //创立新容量巨细的Entry数组
  117. intnewCapacity=oldCapacity*2+1;
  118. Entry[]newMap=newEntry[newCapacity];
  119. modCount++;
  120. threshold=(int)(newCapacity*loadFactor);
  121. table=newMap;
  122. //将“旧的Hashtable”中的元素复制到“新的Hashtable”中
  123. for(inti=oldCapacity;i-->0;){
  124. for(Entry<K,V>old=oldMap[i];old!=null;){
  125. Entry<K,V>e=old;
  126. old=old.next;
  127. //从头盘算index
  128. intindex=(e.hash&0x7FFFFFFF)%newCapacity;
  129. e.next=newMap[index];
  130. newMap[index]=e;
  131. }
  132. }
  133. }
  134. //将“key-value”增加到Hashtable中
  135. publicsynchronizedVput(Kkey,Vvalue){
  136. //Hashtable中不克不及拔出value为null的元素!!!
  137. if(value==null){
  138. thrownewNullPointerException();
  139. }
  140. //若“Hashtable中已存在键为key的键值对”,
  141. //则用“新的value”交换“旧的value”
  142. Entrytab[]=table;
  143. inthash=key.hashCode();
  144. intindex=(hash&0x7FFFFFFF)%tab.length;
  145. for(Entry<K,V>e=tab[index];e!=null;e=e.next){
  146. if((e.hash==hash)&&e.key.equals(key)){
  147. Vold=e.value;
  148. e.value=value;
  149. returnold;
  150. }
  151. }
  152. //若“Hashtable中不存在键为key的键值对”,
  153. //将“修正统计数”+1
  154. modCount++;
  155. //若“Hashtable实践容量”>“阈值”(阈值=总的容量*加载因子)
  156. //则调剂Hashtable的巨细
  157. if(count>=threshold){
  158. rehash();
  159. tab=table;
  160. index=(hash&0x7FFFFFFF)%tab.length;
  161. }
  162. //将新的key-value对拔出到tab[index]处(即链表的头结点)
  163. Entry<K,V>e=tab[index];
  164. tab[index]=newEntry<K,V>(hash,key,value,e);
  165. count++;
  166. returnnull;
  167. }
  168. //删除Hashtable中键为key的元素
  169. publicsynchronizedVremove(Objectkey){
  170. Entrytab[]=table;
  171. inthash=key.hashCode();
  172. intindex=(hash&0x7FFFFFFF)%tab.length;
  173. //从table[index]链表中找出要删除的节点,并删除该节点。
  174. //由于是单链表,因而要保存带删省点的前一个节点,才干无效地删除节点
  175. for(Entry<K,V>e=tab[index],prev=null;e!=null;prev=e,e=e.next){
  176. if((e.hash==hash)&&e.key.equals(key)){
  177. modCount++;
  178. if(prev!=null){
  179. prev.next=e.next;
  180. }else{
  181. tab[index]=e.next;
  182. }
  183. count--;
  184. VoldValue=e.value;
  185. e.value=null;
  186. returnoldValue;
  187. }
  188. }
  189. returnnull;
  190. }
  191. //将“Map(t)”的中全体元素一一增加到Hashtable中
  192. publicsynchronizedvoidputAll(Map<?extendsK,?extendsV>t){
  193. for(Map.Entry<?extendsK,?extendsV>e:t.entrySet())
  194. put(e.getKey(),e.getValue());
  195. }
  196. //清空Hashtable
  197. //将Hashtable的table数组的值全体设为null
  198. //本栏目更多出色内容:http://www.bianceng.cn/Programming/Java/
  199. publicsynchronizedvoidclear(){
  200. Entrytab[]=table;
  201. modCount++;
  202. for(intindex=tab.length;--index>=0;)
  203. tab[index]=null;
  204. count=0;
  205. }
  206. //克隆一个Hashtable,并以Object的情势前往。
  207. publicsynchronizedObjectclone(){
  208. try{
  209. Hashtable<K,V>t=(Hashtable<K,V>)super.clone();
  210. t.table=newEntry[table.length];
  211. for(inti=table.length;i-->0;){
  212. t.table[i]=(table[i]!=null)
  213. ?(Entry<K,V>)table[i].clone():null;
  214. }
  215. t.keySet=null;
  216. t.entrySet=null;
  217. t.values=null;
  218. t.modCount=0;
  219. returnt;
  220. }catch(CloneNotSupportedExceptione){
  221. thrownewInternalError();
  222. }
  223. }
  224. publicsynchronizedStringtoString(){
  225. intmax=size()-1;
  226. if(max==-1)
  227. return"{}";
  228. StringBuildersb=newStringBuilder();
  229. Iterator<Map.Entry<K,V>>it=entrySet().iterator();
  230. sb.append({);
  231. for(inti=0;;i++){
  232. Map.Entry<K,V>e=it.next();
  233. Kkey=e.getKey();
  234. Vvalue=e.getValue();
  235. sb.append(key==this?"(thisMap)":key.toString());
  236. sb.append(=);
  237. sb.append(value==this?"(thisMap)":value.toString());
  238. if(i==max)
  239. returnsb.append(}).toString();
  240. sb.append(",");
  241. }
  242. }
  243. //猎取Hashtable的列举类对象
  244. //若Hashtable的实践巨细为0,则前往“空列举类”对象;
  245. //不然,前往一般的Enumerator的对象。
  246. private<T>Enumeration<T>getEnumeration(inttype){
  247. if(count==0){
  248. return(Enumeration<T>)emptyEnumerator;
  249. }else{
  250. returnnewEnumerator<T>(type,false);
  251. }
  252. }
  253. //猎取Hashtable的迭代器
  254. //若Hashtable的实践巨细为0,则前往“空迭代器”对象;
  255. //不然,前往一般的Enumerator的对象。(Enumerator完成了迭代器和列举两个接口)
  256. private<T>Iterator<T>getIterator(inttype){
  257. if(count==0){
  258. return(Iterator<T>)emptyIterator;
  259. }else{
  260. returnnewEnumerator<T>(type,true);
  261. }
  262. }
  263. //Hashtable的“key的汇合”。它是一个Set,没有反复元素
  264. privatetransientvolatileSet<K>keySet=null;
  265. //Hashtable的“key-value的汇合”。它是一个Set,没有反复元素
  266. privatetransientvolatileSet<Map.Entry<K,V>>entrySet=null;
  267. //Hashtable的“key-value的汇合”。它是一个Collection,能够有反复元素
  268. privatetransientvolatileCollection<V>values=null;
  269. //前往一个被synchronizedSet封装后的KeySet对象
  270. //synchronizedSet封装的目标是对KeySet的一切办法都增加synchronized,完成多线程同步
  271. publicSet<K>keySet(){
  272. if(keySet==null)
  273. keySet=Collections.synchronizedSet(newKeySet(),this);
  274. returnkeySet;
  275. }
  276. //Hashtable的Key的Set汇合。
  277. //KeySet承继于AbstractSet,以是,KeySet中的元素没有反复的。
  278. privateclassKeySetextendsAbstractSet<K>{
  279. publicIterator<K>iterator(){
  280. returngetIterator(KEYS);
  281. }
  282. publicintsize(){
  283. returncount;
  284. }
  285. publicbooleancontains(Objecto){
  286. returncontainsKey(o);
  287. }
  288. publicbooleanremove(Objecto){
  289. returnHashtable.this.remove(o)!=null;
  290. }
  291. publicvoidclear(){
  292. Hashtable.this.clear();
  293. }
  294. }
  295. //前往一个被synchronizedSet封装后的EntrySet对象
  296. //synchronizedSet封装的目标是对EntrySet的一切办法都增加synchronized,完成多线程同步
  297. publicSet<Map.Entry<K,V>>entrySet(){
  298. if(entrySet==null)
  299. entrySet=Collections.synchronizedSet(newEntrySet(),this);
  300. returnentrySet;
  301. }
  302. //Hashtable的Entry的Set汇合。
  303. //EntrySet承继于AbstractSet,以是,EntrySet中的元素没有反复的。
  304. privateclassEntrySetextendsAbstractSet<Map.Entry<K,V>>{
  305. publicIterator<Map.Entry<K,V>>iterator(){
  306. returngetIterator(ENTRIES);
  307. }
  308. publicbooleanadd(Map.Entry<K,V>o){
  309. returnsuper.add(o);
  310. }
  311. //查找EntrySet中是不是包括Object(0)
  312. //起首,在table中找到o对应的Entry链表
  313. //然后,查找Entry链表中是不是存在Object
  314. publicbooleancontains(Objecto){
  315. if(!(oinstanceofMap.Entry))
  316. returnfalse;
  317. Map.Entryentry=(Map.Entry)o;
  318. Objectkey=entry.getKey();
  319. Entry[]tab=table;
  320. inthash=key.hashCode();
  321. intindex=(hash&0x7FFFFFFF)%tab.length;
  322. for(Entrye=tab[index];e!=null;e=e.next)
  323. if(e.hash==hash&&e.equals(entry))
  324. returntrue;
  325. returnfalse;
  326. }
  327. //删除元素Object(0)
  328. //起首,在table中找到o对应的Entry链表
  329. //然后,删除链表中的元素Object
  330. publicbooleanremove(Objecto){
  331. if(!(oinstanceofMap.Entry))
  332. returnfalse;
  333. Map.Entry<K,V>entry=(Map.Entry<K,V>)o;
  334. Kkey=entry.getKey();
  335. Entry[]tab=table;
  336. inthash=key.hashCode();
  337. intindex=(hash&0x7FFFFFFF)%tab.length;
  338. for(Entry<K,V>e=tab[index],prev=null;e!=null;
  339. prev=e,e=e.next){
  340. if(e.hash==hash&&e.equals(entry)){
  341. modCount++;
  342. if(prev!=null)
  343. prev.next=e.next;
  344. else
  345. tab[index]=e.next;
  346. count--;
  347. e.value=null;
  348. returntrue;
  349. }
  350. }
  351. returnfalse;
  352. }
  353. publicintsize(){
  354. returncount;
  355. }
  356. publicvoidclear(){
  357. Hashtable.this.clear();
  358. }
  359. }
  360. //前往一个被synchronizedCollection封装后的ValueCollection对象
  361. //synchronizedCollection封装的目标是对ValueCollection的一切办法都增加synchronized,完成多线程同步
  362. publicCollection<V>values(){
  363. if(values==null)
  364. values=Collections.synchronizedCollection(newValueCollection(),
  365. this);
  366. returnvalues;
  367. }
  368. //Hashtable的value的Collection汇合。
  369. //ValueCollection承继于AbstractCollection,以是,ValueCollection中的元素能够反复的。
  370. privateclassValueCollectionextendsAbstractCollection<V>{
  371. publicIterator<V>iterator(){
  372. returngetIterator(VALUES);
  373. }
  374. publicintsize(){
  375. returncount;
  376. }
  377. publicbooleancontains(Objecto){
  378. returncontainsValue(o);
  379. }
  380. publicvoidclear(){
  381. Hashtable.this.clear();
  382. }
  383. }
  384. //从头equals()函数
  385. //若两个Hashtable的一切key-value键值对都相称,则判别它们两个相称
  386. publicsynchronizedbooleanequals(Objecto){
  387. if(o==this)
  388. returntrue;
  389. if(!(oinstanceofMap))
  390. returnfalse;
  391. Map<K,V>t=(Map<K,V>)o;
  392. if(t.size()!=size())
  393. returnfalse;
  394. try{
  395. //经由过程迭代器顺次掏出以后Hashtable的key-value键值对
  396. //并判别该键值对,存在于Hashtable中。
  397. //若不存在,则当即前往false;不然,遍历完“以后Hashtable”并前往true。
  398. Iterator<Map.Entry<K,V>>i=entrySet().iterator();
  399. while(i.hasNext()){
  400. Map.Entry<K,V>e=i.next();
  401. Kkey=e.getKey();
  402. Vvalue=e.getValue();
  403. if(value==null){
  404. if(!(t.get(key)==null&&t.containsKey(key)))
  405. returnfalse;
  406. }else{
  407. if(!value.equals(t.get(key)))
  408. returnfalse;
  409. }
  410. }
  411. }catch(ClassCastExceptionunused){
  412. returnfalse;
  413. }catch(NullPointerExceptionunused){
  414. returnfalse;
  415. }
  416. returntrue;
  417. }
  418. //盘算Entry的hashCode
  419. //若Hashtable的实践巨细为0大概加载因子<0,则前往0。
  420. //不然,前往“Hashtable中的每一个Entry的key和value的异或值的总和”。
  421. publicsynchronizedinthashCode(){
  422. inth=0;
  423. if(count==0||loadFactor<0)
  424. returnh;//Returnszero
  425. loadFactor=-loadFactor;//MarkhashCodecomputationinprogress
  426. Entry[]tab=table;
  427. for(inti=0;i<tab.length;i++)
  428. for(Entrye=tab[i];e!=null;e=e.next)
  429. h+=e.key.hashCode()^e.value.hashCode();
  430. loadFactor=-loadFactor;//MarkhashCodecomputationcomplete
  431. returnh;
  432. }
  433. //java.io.Serializable的写进函数
  434. //将Hashtable的“总的容量,实践容量,一切的Entry”都写进到输入流中
  435. privatesynchronizedvoidwriteObject(java.io.ObjectOutputStreams)
  436. throwsIOException
  437. {
  438. //Writeoutthelength,threshold,loadfactor
  439. s.defaultWriteObject();
  440. //Writeoutlength,countofelementsandthenthekey/valueobjects
  441. s.writeInt(table.length);
  442. s.writeInt(count);
  443. for(intindex=table.length-1;index>=0;index--){
  444. Entryentry=table[index];
  445. while(entry!=null){
  446. s.writeObject(entry.key);
  447. s.writeObject(entry.value);
  448. entry=entry.next;
  449. }
  450. }
  451. }
  452. //java.io.Serializable的读取函数:依据写进体例读出
  453. //将Hashtable的“总的容量,实践容量,一切的Entry”顺次读出
  454. privatevoidreadObject(java.io.ObjectInputStreams)
  455. throwsIOException,ClassNotFoundException
  456. {
  457. //Readinthelength,threshold,andloadfactor
  458. s.defaultReadObject();
  459. //Readtheoriginallengthofthearrayandnumberofelements
  460. intoriglength=s.readInt();
  461. intelements=s.readInt();
  462. //Computenewsizewithabitofroom5%togrowbut
  463. //nolargerthantheoriginalsize.Makethelength
  464. //oddifitslargeenough,thishelpsdistributetheentries.
  465. //Guardagainstthelengthendingupzero,thatsnotvalid.
  466. intlength=(int)(elements*loadFactor)+(elements/20)+3;
  467. if(length>elements&&(length&1)==0)
  468. length--;
  469. if(origlength>0&&length>origlength)
  470. length=origlength;
  471. Entry[]table=newEntry[length];
  472. count=0;
  473. //Readthenumberofelementsandthenallthekey/valueobjects
  474. for(;elements>0;elements--){
  475. Kkey=(K)s.readObject();
  476. Vvalue=(V)s.readObject();
  477. //synchcouldbeeliminatedforperformance
  478. reconstitutionPut(table,key,value);
  479. }
  480. this.table=table;
  481. }
  482. privatevoidreconstitutionPut(Entry[]tab,Kkey,Vvalue)
  483. throwsStreamCorruptedException
  484. {
  485. if(value==null){
  486. thrownewjava.io.StreamCorruptedException();
  487. }
  488. //Makessurethekeyisnotalreadyinthehashtable.
  489. //Thisshouldnothappenindeserializedversion.
  490. inthash=key.hashCode();
  491. intindex=(hash&0x7FFFFFFF)%tab.length;
  492. for(Entry<K,V>e=tab[index];e!=null;e=e.next){
  493. if((e.hash==hash)&&e.key.equals(key)){
  494. thrownewjava.io.StreamCorruptedException();
  495. }
  496. }
  497. //Createsthenewentry.
  498. Entry<K,V>e=tab[index];
  499. tab[index]=newEntry<K,V>(hash,key,value,e);
  500. count++;
  501. }
  502. //Hashtable的Entry节点,它实质上是一个单向链表。
  503. //也因而,我们才干揣度出Hashtable是由拉链法完成的散列表
  504. privatestaticclassEntry<K,V>implementsMap.Entry<K,V>{
  505. //哈希值
  506. inthash;
  507. Kkey;
  508. Vvalue;
  509. //指向的下一个Entry,即链表的下一个节点
  510. Entry<K,V>next;
  511. //机关函数
  512. protectedEntry(inthash,Kkey,Vvalue,Entry<K,V>next){
  513. this.hash=hash;
  514. this.key=key;
  515. this.value=value;
  516. this.next=next;
  517. }
  518. protectedObjectclone(){
  519. returnnewEntry<K,V>(hash,key,value,
  520. (next==null?null:(Entry<K,V>)next.clone()));
  521. }
  522. publicKgetKey(){
  523. returnkey;
  524. }
  525. publicVgetValue(){
  526. returnvalue;
  527. }
  528. //设置value。若value是null,则抛出非常。
  529. publicVsetValue(Vvalue){
  530. if(value==null)
  531. thrownewNullPointerException();
  532. VoldValue=this.value;
  533. this.value=value;
  534. returnoldValue;
  535. }
  536. //掩盖equals()办法,判别两个Entry是不是相称。
  537. //若两个Entry的key和value都相称,则以为它们相称。
  538. publicbooleanequals(Objecto){
  539. if(!(oinstanceofMap.Entry))
  540. returnfalse;
  541. Map.Entrye=(Map.Entry)o;
  542. return(key==null?e.getKey()==null:key.equals(e.getKey()))&&
  543. (value==null?e.getValue()==null:value.equals(e.getValue()));
  544. }
  545. publicinthashCode(){
  546. returnhash^(value==null?0:value.hashCode());
  547. }
  548. publicStringtoString(){
  549. returnkey.toString()+"="+value.toString();
  550. }
  551. }
  552. privatestaticfinalintKEYS=0;
  553. privatestaticfinalintVALUES=1;
  554. privatestaticfinalintENTRIES=2;
  555. //Enumerator的感化是供应了“经由过程elements()遍历Hashtable的接口”和“经由过程entrySet()遍历Hashtable的接口”。
  556. privateclassEnumerator<T>implementsEnumeration<T>,Iterator<T>{
  557. //指向Hashtable的table
  558. Entry[]table=Hashtable.this.table;
  559. //Hashtable的总的巨细
  560. intindex=table.length;
  561. Entry<K,V>entry=null;
  562. Entry<K,V>lastReturned=null;
  563. inttype;
  564. //Enumerator是“迭代器(Iterator)”仍是“列举类(Enumeration)”的标记
  565. //iterator为true,暗示它是迭代器;不然,是列举类。
  566. booleaniterator;
  567. //在将Enumerator看成迭代器利用时会用到,用来完成fail-fast机制。
  568. protectedintexpectedModCount=modCount;
  569. Enumerator(inttype,booleaniterator){
  570. this.type=type;
  571. this.iterator=iterator;
  572. }
  573. //从遍历table的数组的开端向前查找,直到找到不为null的Entry。
  574. publicbooleanhasMoreElements(){
  575. Entry<K,V>e=entry;
  576. inti=index;
  577. Entry[]t=table;
  578. /*Uselocalsforfasterloopiteration*/
  579. while(e==null&&i>0){
  580. e=t[--i];
  581. }
  582. entry=e;
  583. index=i;
  584. returne!=null;
  585. }
  586. //猎取下一个元素
  587. //注重:从hasMoreElements()和nextElement()能够看出“Hashtable的elements()遍历体例”
  588. //起首,从后向前的遍历table数组。table数组的每一个节点都是一个单向链表(Entry)。
  589. //然后,顺次向后遍历单向链表Entry。
  590. publicTnextElement(){
  591. Entry<K,V>et=entry;
  592. inti=index;
  593. Entry[]t=table;
  594. /*Uselocalsforfasterloopiteration*/
  595. while(et==null&&i>0){
  596. et=t[--i];
  597. }
  598. entry=et;
  599. index=i;
  600. if(et!=null){
  601. Entry<K,V>e=lastReturned=entry;
  602. entry=e.next;
  603. returntype==KEYS?(T)e.key:(type==VALUES?(T)e.value:(T)e);
  604. }
  605. thrownewNoSuchElementException("HashtableEnumerator");
  606. }
  607. //迭代器Iterator的判别是不是存鄙人一个元素
  608. //实践上,它是挪用的hasMoreElements()
  609. publicbooleanhasNext(){
  610. returnhasMoreElements();
  611. }
  612. //迭代器猎取下一个元素
  613. //实践上,它是挪用的nextElement()
  614. publicTnext(){
  615. if(modCount!=expectedModCount)
  616. thrownewConcurrentModificationException();
  617. returnnextElement();
  618. }
  619. //迭代器的remove()接口。
  620. //起首,它在table数组中找出要删除元素地点的Entry,
  621. //然后,删除单向链表Entry中的元素。
  622. publicvoidremove(){
  623. if(!iterator)
  624. thrownewUnsupportedOperationException();
  625. if(lastReturned==null)
  626. thrownewIllegalStateException("HashtableEnumerator");
  627. if(modCount!=expectedModCount)
  628. thrownewConcurrentModificationException();
  629. synchronized(Hashtable.this){
  630. Entry[]tab=Hashtable.this.table;
  631. intindex=(lastReturned.hash&0x7FFFFFFF)%tab.length;
  632. for(Entry<K,V>e=tab[index],prev=null;e!=null;
  633. prev=e,e=e.next){
  634. if(e==lastReturned){
  635. modCount++;
  636. expectedModCount++;
  637. if(prev==null)
  638. tab[index]=e.next;
  639. else
  640. prev.next=e.next;
  641. count--;
  642. lastReturned=null;
  643. return;
  644. }
  645. }
  646. thrownewConcurrentModificationException();
  647. }
  648. }
  649. }
  650. privatestaticEnumerationemptyEnumerator=newEmptyEnumerator();
  651. privatestaticIteratoremptyIterator=newEmptyIterator();
  652. //空列举类
  653. //当Hashtable的实践巨细为0;此时,又要经由过程Enumeration遍历Hashtable时,前往的是“空列举类”的对象。
  654. privatestaticclassEmptyEnumeratorimplementsEnumeration<Object>{
  655. EmptyEnumerator(){
  656. }
  657. //空列举类的hasMoreElements()一直前往false
  658. publicbooleanhasMoreElements(){
  659. returnfalse;
  660. }
  661. //空列举类的nextElement()抛出非常
  662. publicObjectnextElement(){
  663. thrownewNoSuchElementException("HashtableEnumerator");
  664. }
  665. }
  666. //空迭代器
  667. //当Hashtable的实践巨细为0;此时,又要经由过程迭代器遍历Hashtable时,前往的是“空迭代器”的对象。
  668. privatestaticclassEmptyIteratorimplementsIterator<Object>{
  669. EmptyIterator(){
  670. }
  671. publicbooleanhasNext(){
  672. returnfalse;
  673. }
  674. publicObjectnext(){
  675. thrownewNoSuchElementException("HashtableIterator");
  676. }
  677. publicvoidremove(){
  678. thrownewIllegalStateException("HashtableIterator");
  679. }
  680. }
  681. }
复制代码
几点总结

针对Hashtable,我们一样给出几点对照主要的总结,但要分离与HashMap的对照来总结。
<p>
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。
老尸 该用户已被删除
沙发
发表于 2015-1-20 12:30:20 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
板凳
发表于 2015-1-29 07:08:12 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
柔情似水 该用户已被删除
地板
发表于 2015-2-5 23:56:18 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
若天明 该用户已被删除
5#
发表于 2015-2-14 09:22:17 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
萌萌妈妈 该用户已被删除
6#
 楼主| 发表于 2015-3-11 17:29:18 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
再见西城 该用户已被删除
7#
发表于 2015-3-19 03:39:02 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
只想知道 该用户已被删除
8#
发表于 2015-3-27 07:08:13 | 只看该作者
是一种使用者不需花费很多时间学习的语言
只想知道 该用户已被删除
9#
发表于 2015-3-27 07:08:13 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-24 01:11

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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