首页 > 代码库 > 初识java集合——其他集合
初识java集合——其他集合
* 弱散列映射表(WeakHashMap)
* 如果有一个值,对应的键已经不再使用了,将会出现什么情况呢
* 假定对某个键的而最后一次引用已经消亡,不再有任何途径引用这个值对象了,但是由于程序中任何
* 部分没有再引用这个键,所以这个键/值无法从Map中删除。
* 遗憾的是,垃圾回收器跟踪活动的对象,只要Map对象时活动的,其中的所有桶也都是活动的,它们不能被回收。
* 当对键的唯一引用来自散列表条目时,这一数据结构将于垃圾回收器协同工作一起删除键/值对
*
* 下面是对于【弱散列映射表】的机制介绍
* WeakHashMap使用若引用(weak references) 保存键。弱引用对象将弱引用保存到另外一个对象中,在这里
* 就是<散列表键>。对该类型,垃圾回收器的方式是这样的:一般,如果垃圾回收器发现某个特定的对象已经没有人引用了
* 就将其回收。如果某个对象只能由弱引用来引用的话,垃圾回收仍然回收他,但会将引用这个对象的弱引用放入到队列中。
* WeakHashMap将周期性的检查队列,以便找到新添加的弱引用。一个弱引用进入队列意味着这个键不再被他人使用,
* 并且已经被收集了起来,于是WeakHashMap将删除对应的条目
*
* 【链接散列集和链接映射表】
* 在JDK1.4引入了2个类,LinkedHashSet 和 LinkedHashMap,用来记住插入元素的顺序
*
* 链接散列映射表将用访问顺序,而不是插入顺序,对映射表条目进行迭代。
* 每次调用get或者put,受影响的条目将从当前的位置删除,然后被放置到条目链表的尾部(散列表的桶是不会受到影响的)
* 受此启发,可以利用访问顺序来实现高速缓存的“最近 最少使用”原则
* 比如,希望将访问频率高的放在内存中,而低的放在数据库中。当在表中找不到元素项且表已经饱和
* 可以利用迭代器,将枚举出的前几个元素删除(因为这几个是最少使用的)
*
* 【枚举集和映射集】
* EnumSet是一个枚举类型元素集的高效实现。因为枚举类型是有限个实例,因此内部使用了【位序列】来实现。
* 如果对应的值在集中,则相应的位置被置为1.
* 该类没有公共的构造器,只能使用工厂方法来构造这个集
*
* EnumMap是一个键类型为枚举类的映射表,它可以直接且高效的用一个值数组来实现
* 在使用时,需要再构造器中制定键的类型
*
* 【标识散列映射表】IdentityHashMap
* 在java1.4中引入了一个特殊目的的类,在这个类中,键不在是用hashcode来计算的,而是使用System.identityHashCode
* 方法计算的。这是Object.hashcode方法根据对象的内存地址来计算散列码时采用的方式
* 而且在两个对象进行比较的时候,使用的是==,而不是equals
* 也就是说,不同键对象,即使内容相同,也被视为是不同的对象。
* 在实现对象遍历算法(如对象序列化)时,这个类非常有用,可以用来跟踪每个对象的遍历情况。
1 public class OtherCollection { 2 3 public static void main(String[] args) { 4 // Map<K, V> cache = new LinkedHashMap<>(128, 0.75f, true){ 5 // protected boolean remove EldestEntry(Map.Entry<K, V> eldest) 6 // { 7 // return size()>100; 8 // } 9 // }; 10 // 11 EnumSet<weekday> always = EnumSet.allOf(weekday.class); 12 EnumSet<weekday> never = EnumSet.noneOf(weekday.class); 13 EnumSet<weekday> workday = EnumSet.range(weekday.MON, weekday.FRI); 14 EnumSet<weekday> mwf = EnumSet.of(weekday.MON, weekday.WED, weekday.FRI); 15 //可以使用Set常用的接口来修改EnumSet 16 17 //EnumMap 18 EnumMap<weekday, Employee> personInChange = new EnumMap<>(weekday.class); 19 } 20 21 22 } 23 24 enum weekday {MON, TUE, WED, THUR, FRI, SAT, SUN};
初识java集合——其他集合