Java设计模式(二)——迭代模式
2016-02-29 13:39
381 查看
迭代模式的基本定义:对于一组对象集合(数组、堆栈、列表或散列),用户无需关心它的底层实现而能够通过调用统一接口遍历当中的所有元素。由于jdk已经对常见的迭代模式实现了封装,本文直接提供Collection和Iterator两个接口的模拟。
定义Iterator接口
SimpleHashMap.java
定义Iterator接口
package containers; import java.util.*; /* * HashMap的底层是一种链表数组的结构,依靠hashCode值取余确定数组下标,相同下标的对象依靠链表维护 * 由此可见HashMap本质上无法保证元素加载顺序 */ public class SimpleHashMap<K, V> extends AbstractMap<K, V> { // 设定数组长度 private static final int SIZE = 999; // 初始化一个链表数组 private LinkedList<MapEntry<K, V>>[] slots = new LinkedList[SIZE]; public V put(K key, V value) { // 返回值 V oldValue = null; int index = Math.abs(key.hashCode()) % SIZE; // 如果数组槽位为空则在当前槽位新建一个空列表 if (slots[index] == null) { slots[index] = new LinkedList<MapEntry<K, V>>(); } // 返回当前槽位链表 LinkedList<MapEntry<K, V>> slot = slots[index]; MapEntry<K, V> mapEntry = new MapEntry<K, V>(key, value); // 遍历整条链表,如果找到key值则覆盖,否则新增 ListIterator<MapEntry<K, V>> it = slot.listIterator(); while (it.hasNext()) { MapEntry<K, V> me = it.next(); if (me.getKey().equals(key)) { oldValue = me.getValue(); // 覆盖 it.set(mapEntry); return oldValue; } } slots[index].add(mapEntry); return oldValue; } // 获取value的步骤是先命中槽位再遍历链表 public V get(Object key) { int index = Math.abs(key.hashCode()) % SIZE; if (slots[index] != null) { for (MapEntry<K, V> me : slots[index]) { if (me.getKey().equals(key)) { return me.getValue(); } } } return null; } // 返回Set的步骤是先过滤空槽位再分别加载链表 @Override public Set<java.util.Map.Entry<K, V>> entrySet() { Set<Map.Entry<K, V>> set = new HashSet<Map.Entry<K, V>>(); for (LinkedList<MapEntry<K, V>> slot : slots) { if (slot != null) { set.addAll(slot); } } return set; } }
SimpleHashMap.java
相关文章推荐
- myEclipse在线生成注册码
- JDK5新特性之可变参数
- RxJava 过滤操作符 ofType
- Java Enum类型
- JAVA理解逻辑程序的书上全部重要的习题
- No result defined for action
- eclipse中缺少插件的问题
- JDK5新特性之静态导入
- JDK5新特性之增强for
- java中的常用包
- [JAVA · 初级]:4.深入理解自增&自减运算
- JAVA学习【8】集合框架HashMap、TreeMap的基本用法
- Eclipse快捷键大全
- AS 项目转 Eclipse 收集
- 20个非常有用的Java程序片段
- JDK5新特性之泛型
- 基于Spring的QQ第三方登录实现
- java学习日记——final关键字
- 基于Spring的新浪微博第三方登录实现
- java获取服务器所有信息