> 文档中心 > 第13章 集合(11)Hashtable/Enumeration

第13章 集合(11)Hashtable/Enumeration

目录

写在前面

​ 13.5 遗留的集合

​ 13.5.1 Hashtable

​ 13.5.2 枚举


写在前面

到这里,集合的内容已经接近尾声了,前面介绍的是常用的集合,还有一些不太常用(相对而言),但是在需要了解的集合。为啥要了解这些集合呢?

🌺 公司旧代码可能会用到这些集合,我们要做到看得懂

🌺 特定场景这些集合也会变得很好用:

        ⏰Hashtable:严格哈希表,线程安全,键值对都不能为空

        ⏰Enumeration:早期迭代器,不用迭代器删除功能时,可考虑使用

        ⏰Properties: 文件配置项(下一节介绍)

        ⏰Stack:栈(下一节介绍)

        ⏰BitSet:位图枚举,适合多状态的交并补(下一节介绍)

🌺 面试,能够讲解这些集合能体现技术能力和专业素养,属于加分项


 13.5 遗留的集合

 13.5.1 Hashtable

它和 HashMap 一样,都是哈希表,两者在大吗上区别不大,内部却相去甚远。如下:

我们可以看到,HashMap 继承了 AbstractMap,而 Hashtable 继承的是 Dictionary.

Dictionary 已经明确规定了KV值不能为空

为啥说不能为空呢?我们看代码进一步验证。Hashtable put 实现方式:

另外,Hashtable 是线程安全的,常用的方法大多实现了 synchronized:

Hashtable 底层数组+链表,如下:

HashMap 底层是数组+链表、红黑树(JDK 1.7+,如下:

小总结:

🌺 Hashtable 继承了 Dictionary, HashMap 继承了 AbstractMap

🌺 Hashtable 存储的键值对不能为空,HashMap 存储的键值对可以为空

🌺 Hashtable 自带线程安全的方法,HashMap 自身线程不安全

🌺 Hashtable 底层结构是数组+链表,HashMap JDK 1.7+ 底层是数组+链表/红黑树

当然还有一些其他的细节方面的不同,需要读者去源码中探索。不要盲目的去相信,用自己的大脑去思考,去论证,你一定可以的,我看好你哦!


 13.5.2 枚举

Enumeration 确切的说不是具体的集合类,而是集合接口,它长这样:

这个怎么看呢?

首先,我们看看写在上方的注释:

🥝🥥🍇🍈🍉🍊🍋🍌🍍🥭🍎🍏🍐🍑🍒🍆🌽🌶🍄🥑🥒🥔🧄🧅🥕🌰🥜

实现了Enumeration 接口的对象生成了序列中的元素。连续调用 nextElement 方法 返回序列种的连续元素。

例如打印 Vector 的元素:

  for (Enumeration e = v.elements(); e.hasMoreElements();)System.out.println(e.nextElement());

提供了遍历 Vector 元素(键集合、值结合)的方法,也用指定 SequenceInputStream 的输入流。

提示:这些方法也声明在 Iterator 中。此外,Iterable 也可以进行删除操作,方法名也更短。新的方法请考虑使用 Iterator 替代 Enumeration.

🥝🥥🍇🍈🍉🍊🍋🍌🍍🥭🍎🍏🍐🍑🍒🍆🌽🌶🍄🥑🥒🥔🧄🧅🥕🌰🥜

小总结:

🌺 Enumeration 是一个迭代器

🌺 Enumeration 用法

🌺 Enumeration  可用于遍历集合以及序列输入流

运用方式,可以参考 Hashtable:

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

public class Main {    public static void main(String[] args) { Hashtable table = new Hashtable(); table.put(2,3); table.put(7,5); System.out.println("keys:"); for (Enumeration e = table.keys(); e.hasMoreElements();)     System.out.print(e.nextElement()+" "); System.out.println();  System.out.println("values:"); for (Enumeration e = table.elements(); e.hasMoreElements();)     System.out.print(e.nextElement()+" "); System.out.println();     } }

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

运行结果:

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

总结:

🌺 大部分的用法都写在源码和源码注释上,源码包含着所有问题的答案

🌺 Hashtable 的键值対存储都不能为空,获取时提供的键不能为空

🌺 Hashtable 是线程安全的

🌺 Hashtable 继承了 Dictionary, 底层是数组+链表

🌺 Enumeration 是一种早期迭代器,新集合可用 Iterator 替代

🌺 Enumeration 可用于集合遍历以及 SequenceInputStream 输入流


相关内容:选择 《Java核心技术 卷1》查找相关笔记

评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步

如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!