《Java 核心技术 卷1》 笔记 第13章 集合(7)哈希映射表其他类型介绍集合类总结
13.2.9 专用集与映射表类
1 弱引用哈希映射表
哈希表存在的问题:不使用的键不能回收
解决方式:使用弱引用哈希表 WeakHashMap
扩展:强引用,软引用,弱引用与虚引用
强引用:必须对象,未置空,未超出作用域时不会回收
软引用:非必须但是重要,保存在文件、指定位置的对象,内存不足时发生回收
弱引用:每次进行垃圾回收时都会直接回收,也就是创建后,下次进行垃圾回收时就会回收
虚引用:垃圾回收器用于标识的标记,用于跟踪回收情况,任何情况下可能进行回收
2 链接散列及和链接哈希映射表
LinkedHashSet 和 LinkedHashMap 依旧以散列格式排列,不同的是它的迭代器会记录插入顺序,遍历时会按照插入顺序逐一取出
3 枚举集与枚举哈希映射表
非常适合完成指定范围的交集、并集、差集等计算,是 BitSet/BitMap 的扩展,如果需要做标签之间的交并差,可考虑直接用 BitSet/BitMap
4 标识哈希映射表
如果使用 IdentityHashMap, 则只比较对象地址是否相等来判别对象是否相等,而非通过equals
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
import java.util.*; public class Main { public static void main(String[] args) { //弱引用哈希表 System.out.println("弱引用哈希表:");WeakHashMap map = new WeakHashMap(); for(int i = 0; i < 200; i++){ //整数类型,因为 Integer 存在-128到127缓存,所以这段不会回收,// map.put(i,i); map.put(String.valueOf(i),String.valueOf(i)); System.gc(); System.out.println(map.size());} //链接哈希表System.out.println("链接哈希表:");LinkedHashMap linkedHashMap = new LinkedHashMap();int[] arr = new int[]{3,5,4,1,2};for(int num:arr){ linkedHashMap.put(num,num);} for(Map.Entry entry:linkedHashMap.entrySet()){ System.out.println(entry.getKey()+","+entry.getValue());} //枚举集 System.out.println("枚举集:"); EnumSet a = EnumSet.of(SEASON.SPRING,SEASON.SUMMER,SEASON.AUTUMN); System.out.println("原集合a:"+a); EnumSet b = EnumSet.of(SEASON.SUMMER,SEASON.AUTUMN,SEASON.WINTER); System.out.println("原集合b:"+b); //1. 交集 EnumSet copyA = EnumSet.noneOf(SEASON.class); copyA.addAll(a); copyA.retainAll(b); System.out.println("交集:"+copyA); //2. 并集 copyA = EnumSet.noneOf(SEASON.class); copyA.addAll(a); copyA.addAll(b); System.out.println("并集:"+copyA); //3. 差集 copyA = EnumSet.noneOf(SEASON.class); copyA.addAll(a); copyA.removeAll(b); System.out.println("差集:"+copyA); //标识哈希表映射 System.out.println("标识哈希表映射:"); IdentityTestItem item1 = new IdentityTestItem(1); IdentityTestItem item2 = new IdentityTestItem(1); System.out.println("元素1地址:"+item1); System.out.println("元素2地址:"+item2); IdentityHashMap identityHashMap = new IdentityHashMap(); identityHashMap.put(item1,1); identityHashMap.put(item2,1); System.out.println("添加equals相同地址不同的两个元素后,大小:"+identityHashMap.size()); map.put(item1,1); System.out.println("添加地址相同元素后,大小:"+identityHashMap.size()); } } class IdentityTestItem{ int a; public IdentityTestItem(int a){ this.a = a; } @Override public int hashCode() { return a; } @Override public boolean equals(Object obj) { if(obj == null) return false; if(!(obj instanceof IdentityTestItem)) return false; IdentityTestItem cmp = (IdentityTestItem) obj; return a == cmp.a; }} enum SEASON{ SPRING,SUMMER,AUTUMN,WINTER}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
运行结果:
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
13.3 集合框架
集合基础类:Collection和Map
Collection 重点方法标注:
Map 重点方法标注:
集合类的基本父子关系:
🎨Collection 是 Itreable 的子类
🎨List/Set/Queue 是 Collection 的子类
🎨Abstract[] 是 [] 的子类,比如 AbstractList 是 List 的子类
其他 XX[] 大多是 [] 的子类,比如 ArrayList 是 List 的子类,当然,也有特例:
WeakHashMap 不是 HashMap 的子类
前面提到的类,大致结构图:
总结:
- 弱引用哈希可解决哈希表引用长期不被回收问题
- 链式哈希可以按照插入顺序取出
- 标识哈希按照地址比较而非 equals
- 枚举类可以很方便的完成枚举类型集合的交并差炒作
- 集合类主要根类型为 Collection 和 Map
相关内容:选择 《Java核心技术 卷1》查找相关笔记
评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步
如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!