Java核心技术知识点笔记—集合(三)

前言:假设对某个键已经不会再被引用,不再有任何引用这个值的对象。由于垃圾回收器跟踪活动的对象,只要映射对象是活动的,其中的所有桶也是活动的,因此,这个键/值无法被垃圾回收器回收。使用弱散列映射可以解决这个问题。

1、弱散列映射(WeakHashMap):使用弱引用(weak referances)保存键。WeakReference对象将引用保存到另外一个对象中(这里是散列键)。当某个键不再被使用,引用它的弱引用被放入队列中,WeakHashMap周期性地检查弱引用队列,并删除其中对应的条目。

2、链接散列集与映射:LinkedHashSet、LinkedHashMap

(1)用来记住插入元素项的顺序,避免元素项(从表面上)看起来是随机排列的。

(2)条目插入到表中时,会并入到双向链表中。

(3)使用访问顺序对映射条目进行迭代。访问顺序对于实现高速缓存的“最近最少使用”原则十分重要。

3、枚举集与映射:EnumSet、EnumMap

3.1、EnumSet:

(1)一个枚举类型元素集的高效实现;

(2)内部用位序列实现。如果对应的值在集中,则相应的位被置为1;

(3)没有公共的构造器,可以使用静态工厂方法构造集:

        enum WeekDay {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY}
        EnumSet<WeekDay> allOf = EnumSet.allOf(WeekDay.class);
        EnumSet<WeekDay> noneOf = EnumSet.noneOf(WeekDay.class);
        EnumSet<WeekDay> days = EnumSet.of(WeekDay.MONDAY, WeekDay.FRIDAY);

(4)可以使用Set接口的常用方法修改EnumSet。

3.2、EnumMap:

(1)键类型为枚举类型的映射;

(2)可以直接且高效地用一个值数组实现;

(3)使用时需要在构造器中指定键类型。

4、标识散列映射:IdentityHashMap,

(1)键的散列值不是用hashCode函数计算,而是用System.identityHashCode方法计算;

(2)System.identityHashCode方法是Object.hashCode方法根据对象的内存地址来计算散列码时所使用的方式;

(3)使用==进行两个对象的比较,而不是使用equals;

(4)不同键的对象,即使内容相同,也被视为不同的对象;

(5)可以在实现对象遍历算法时,用来跟踪每个对象的遍历状况。

猜你喜欢

转载自blog.csdn.net/lyklykkk/article/details/130034922