> 文档中心 > 《Java 核心技术 卷1》 笔记 第13章 集合(7)哈希映射表其他类型介绍集合类总结

《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》查找相关笔记

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

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