第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:
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》查找相关笔记
评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步
如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!