`
baby69yy2000
  • 浏览: 187876 次
  • 性别: Icon_minigender_1
  • 来自: 自己输入城市...
社区版块
存档分类
最新评论

HashMap类的实现

    博客分类:
  • Util
J# 
阅读更多
package Hash;

import java.util.ConcurrentModificationException;
import java.util.NoSuchElementException;

import MyInterface.Iterator;
import MyInterface.Map;
import MyInterface.Set;

/**
 * HashMap的实现
 */
public class HashMap<K, V> implements Map<K, V> {

	// ----------------------------------------------------------------
	// 结点类
	private static class Entry<K, V> implements Map.Entry<K, V> {
		K key;
		V value;
		int hashValue;
		Entry<K, V> next;

		public Entry(K key, V value, int hashValue, Entry<K, V> next) {
			this.key = key;
			this.value = value;
			this.hashValue = hashValue;
			this.next = next;
		}

		public K getKey() {
			return key;
		}

		public V getValue() {
			return value;
		}

		public Entry<K, V> getNext() {
			return next;
		}

		public V setValue(V value) {
			V oldValue = this.value;
			this.value = value;
			return oldValue;
		}

		public String toString() {
			return key + "=" + value;
		}

	}

	// ----------------------------------------------------------------

	private Entry[] table;
	private int hashMapSize;
	private final double MAX_LOAD_FACTOR = 0.75;
	private int tableThreshold;
	private int modCount = 0;

	// HashMap类构造函数
	public HashMap() {
		table = new Entry[17];
		hashMapSize = 0;
		tableThreshold = (int) (table.length * MAX_LOAD_FACTOR);
	}

	public V put(K key, V value) {
		int hashValue = key.hashCode() & Integer.MAX_VALUE, index = hashValue
				% table.length;
		Entry<K, V> entry;
		entry = table[index];
		while (entry != null) {
			if (entry.key.equals(key))
				return entry.setValue(value);
			entry = entry.next;
		}
		modCount++;
		entry = new Entry<K, V>(key, value, hashValue,
				(Entry<K, V>) table[index]);
		table[index] = entry;
		hashMapSize++;
		if (hashMapSize >= tableThreshold)
			rehash(2 * table.length + 1);
		return null;
	}

	private void rehash(int newTableSize) {
		Entry[] newTable = new Entry[newTableSize], oldTable = table;
		Entry<K, V> entry, nextEntry;
		int index, len = table.length;

		for (int i = 0; i < len; i++) {
			entry = table[i];
			if (entry != null) {
				table[i] = null;
				do {
					nextEntry = entry.next;
					index = entry.hashValue % newTableSize;
					entry.next = newTable[index];
					newTable[index] = entry;
					entry = nextEntry;
				} while (entry != null);
			}
		}
		table = newTable;
		tableThreshold = (int) (table.length * MAX_LOAD_FACTOR);
		oldTable = null;
	}

	public V get(Object key) {
		Entry<K, V> p = this.getEntry(key);
		if (p == null)
			return null;
		return p.value;
	}

	public Entry<K, V> getEntry(Object key) {
		int index = (key.hashCode() & Integer.MAX_VALUE) % table.length;
		Entry<K, V> entry;

		entry = table[index];

		while (entry != null) {
			if (entry.key.equals(key))
				return entry;
			entry = entry.next;
		}
		return null;
	}

	public void clear() {
		for (int i = 0; i < table.length; i++)
			table[i] = null;
		modCount++;
		hashMapSize = 0;
	}

	public boolean containsKey(Object key) {
		return getEntry(key) != null;
	}

	public boolean isEmpty() {
		return hashMapSize == 0;
	}

	public V remove(Object key) {
		int index = (key.hashCode() & Integer.MAX_VALUE) % table.length;
		Entry<K, V> curr, prev;

		curr = table[index];
		prev = null;
		while (curr != null) {
			if (curr.key.equals(key)) {
				modCount++;
				if (prev != null)
					prev.next = curr.next;
				else
					table[index] = curr.next;
				hashMapSize--;
				return curr.value;
			} else {
				prev = curr;
				curr = curr.next;
			}
		}
		return null;
	}

	public int size() {
		return hashMapSize;
	}

	public String toString() {
		int max = hashMapSize - 1;
	      StringBuffer buf = new StringBuffer();
	      Iterator<Map.Entry<K,V>> iter = entrySet().iterator();

	      buf.append("{");
	      for (int j = 0; j <= max; j++) {
	         Map.Entry<K,V> e = iter.next();
	         buf.append(e.getKey() + "=" + e.getValue());
	         if (j < max)
	            buf.append(", ");
	      }
	      buf.append("}");

	      return buf.toString();
	}
	
	// ----------------------------------------------------------------
	// 视图
	
	private Set<K> keySet = null;
	private Set<Map.Entry<K,V>> entrySet = null;
	
	public Set<K> keySet() {
		if(keySet == null) {
			keySet = new Set<K>() {

				public boolean add(K item) {
					throw new UnsupportedOperationException();
				}

				public void clear() {
					HashMap.this.clear();
				}

				public boolean contains(Object item) {
					return containsKey(item);
				}

				public boolean isEmpty() {
					return HashMap.this.size() == 0;
				}

				public Iterator<K> iterator() {
					return new KeyIterator();
				}

				public boolean remove(Object item) {
					int oldSize = size();
					HashMap.this.remove(item);
		            return size() != oldSize;
				}

				public int size() {
					return HashMap.this.size();
				}

				public Object[] toArray() {
					Object[] arr = new Object[size()];
					Iterator<K> iter = iterator();
					int len = arr.length;
					for (int i=0;i < len;i++)
						arr[i] = iter.next();
					return arr;
				}
				
				public String toString() {
					int max = size() - 1;
					StringBuffer buf = new StringBuffer();
					Iterator<K> iter = iterator();
					buf.append("[");
					while (iter.hasNext())
					{
						buf.append(iter.next());
						if (iter.hasNext())
							buf.append(", ");
					}
					buf.append("]");
					return buf.toString();
				}
				
			};
		}
		return keySet;
	}
	
	public Set<Map.Entry<K, V>> entrySet() {
		if(entrySet == null) {
			entrySet = new Set<Map.Entry<K, V>>() {

				public boolean add(Map.Entry<K, V> item) {
					throw new UnsupportedOperationException();
				}

				public void clear() {
					HashMap.this.clear();
				}

				public boolean contains(Object item) {
					if (!(item instanceof Map.Entry))
						return false;

					Entry<K,V> entry = (Entry<K,V>)item;
					V value = entry.value;
					Entry<K,V> p = getEntry(entry.key);

					return p != null && p.getValue().equals(value);
				}

				public boolean isEmpty() {
					return size() == 0;
				}

				public Iterator<Map.Entry<K, V>> iterator() {
					return new EntryIterator();
				}

				public boolean remove(Object item) {
					 Entry<K,V> entry = (Entry<K,V>)item;
		             K key = entry.key;
		             return HashMap.this.remove(key) != null;
				}

				public int size() {
					return HashMap.this.size();
				}

				public Object[] toArray() {
					Object[] arr = new Object[size()];
					Iterator<Map.Entry<K,V>> iter = iterator();
					int len = arr.length;
					for (int i=0;i < len;i++)
						arr[i] = iter.next();
					return arr;
				}
				
				public String toString() {
					return HashMap.this.toString();
				}
				
			};
		}
		return entrySet;
	}

	// ----------------------------------------------------------------
	// 跌代器
	private class IteratorImpl<T> implements Iterator<T> {
		Entry<K, V> next;
		int expectedModCount;
		int index;
		Entry<K, V> lastReturned;

		IteratorImpl() {
			int i = 0;
			Entry<K, V> n = null;
			expectedModCount = modCount;

			if (hashMapSize != 0)
				while (i < table.length && ((n = table[i]) == null))
					i++;
			next = n;
			index = i;
			lastReturned = null;
		}

		final Entry<K, V> nextEntry() {
			if (modCount != expectedModCount)
				throw new ConcurrentModificationException();

			Entry<K, V> entry = next;

			if (entry == null)
				throw new NoSuchElementException();
			lastReturned = entry;
			Entry<K, V> n = entry.next;
			int i = index;

			if (n == null) {
				// we are at the end of a bucket. search for the
				// next non-empty bucket
				i++;
				while (i < table.length && (n = table[i]) == null)
					i++;
			}

			index = i;
			next = n;

			return lastReturned;
		}

		public boolean hasNext() {
			return next != null;
		}

		public T next() {
			return null;
		}

		public void remove() {
			// check for a missing call to next() or previous()
			if (lastReturned == null)
				throw new IllegalStateException("Iterator call to next() "
						+ "required before calling remove()");
			if (modCount != expectedModCount)
				throw new ConcurrentModificationException();

			// remove lastReturned by calling remove() in Hash.
			// this call will increment modCount
			HashMap.this.remove(lastReturned.key);
			expectedModCount = modCount;
			lastReturned = null;
		}

	}

	private class KeyIterator extends IteratorImpl<K> {
		public K next() {
			return nextEntry().key;
		}
	}

	private class EntryIterator extends IteratorImpl<Map.Entry<K, V>> {
		public Map.Entry<K, V> next() {
			return nextEntry();
		}
	}

}


测试类
package Hash;

import MyInterface.Iterator;
import MyInterface.Set;
import MyInterface.Map;
import MyInterface.Map.Entry;

public class TestHashMap {

	public static void main(String[] args) {
		HashMap<String, Integer> hm = new HashMap<String, Integer>();
		hm.put("Agg", new Integer(50));
		hm.put("Bf", new Integer(60));
		hm.put("Cf", new Integer(10));
		System.out.println(hm); 	// {Cf=10, Agg=50, Bf=60}
		
		// test keySet
		Set<String> kS = hm.keySet();
		Iterator<String> iter = kS.iterator();
		while(iter.hasNext())
			System.out.println(iter.next());
		System.out.println(kS);
		
		// test entrySet
		Set<Map.Entry<String, Integer>> eS = hm.entrySet();
		Iterator<Entry<String, Integer>> it = eS.iterator();
		Entry<String, Integer> e = null;
		while(it.hasNext()) {
			e = it.next();
			System.out.println(e.getValue() + "=" + e.getKey());
		}
		System.out.println(eS);
		
		// test remove
		hm.remove("Bf");
		System.out.println(hm); // {Cf=10, Agg=50}
		
		System.out.println(hm.size()); // 2
		System.out.println(hm.containsKey("Bf")); // false
		hm.clear();
		System.out.println(hm.isEmpty()); // true
	}

}
分享到:
评论

相关推荐

    Java HashMap类详解

    本资源详细介绍了 Java 中的 HashMap 类,包括其实现机制、Hash 存储机制、集合存储机制等方面的知识点。 1. HashMap 和 HashSet 的关系 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,虽然...

    HashMap类.rar

    HashMap类在Java编程语言中是集合框架的一部分,它是一个基于哈希表的Map接口实现。HashMap提供了快速的插入、删除和查找操作,平均时间复杂度为O(1)。在这个压缩包“HashMap类.rar”中,包含的是易语言版本的...

    一个基于js的HashMap

    这个简单的HashMap类实现了基本的添加、获取、删除和遍历功能。然而,实际应用中可能还需要考虑冲突解决策略(例如开放寻址法或链地址法)、性能优化以及支持其他操作,如计算大小、检查是否存在某个键等。此外,...

    深入Java集合学习系列:HashMap的实现原理

    在Java编程语言中,集合框架是开发者日常工作中不可或缺的一部分,HashMap作为其中的重要成员,它的实现原理对于理解Java性能优化和数据结构有深远的意义。HashMap是一个基于哈希表的数据结构,它实现了Map接口,...

    易语言HashMap类

    易语言HashMap类是一种在易语言编程环境中实现的高效数据结构,它主要用于存储键值对(key-value pairs),提供快速的数据存取。HashMap类基于哈希表(Hash Table)原理,通过计算键的散列值来确定数据在内存中的...

    易语言源码易语言HashMap类源码.rar

    在给定的压缩包“易语言源码易语言HashMap类源码.rar”中,包含了易语言实现的HashMap类的源代码。HashMap是一种常见的数据结构,在许多编程语言中都有实现,它提供了快速的键值对存储和查找功能。 HashMap类是基于...

    HashMap类

    HashMap类在Java编程语言中是集合框架的重要组成部分,它是一个基于哈希表的Map接口实现。HashMap提供了存储和检索键值对(key-value pairs)的高效机制,允许使用null键和值。这篇博客将深入探讨HashMap的内部工作...

    hashMap工具类

    ### hashMap工具类详解 在本篇文章中,我们将详细介绍一个名为`hashMap`的工具类,该类被设计用于Adobe Flex应用程序中,旨在提供一种简单且高效的方法来处理键值对数据结构。通过深入分析该类的实现细节,我们能够...

    基于JavaScript的HashMap实现

    因此,我们需要构建一个更完善的HashMap类,支持任意类型的键,并提供更丰富的功能,如容量控制、负载因子、扩容策略等。 HashMap的主要功能包括: 1. **初始化**:构造函数可以接收初始容量和负载因子作为参数,...

    JAVA中常用的数据结构

    HashMap类实现了Map接口,是一个基于散列表的Map实现类。HashMap类使用散列表来存储键值对,查找和操作的效率非常高。HashMap类是线程非同步的(asynchronized),因此在多线程环境下需要小心使用。 SortedMap接口 ...

    HashMap的实现原理

    HashMap 是 Java 集合框架中一个非常重要的类,它实现了 Map 接口,并提供了基于哈希表的存储方式。与其它 Map 实现不同的是,HashMap 允许使用 `null` 键和 `null` 值。这种灵活性使得 HashMap 成为许多应用程序中...

    HashMap底层实现原理共6页.pdf.zip

    Entry类实现了键值对的存储,并包含了next指针,用于连接哈希冲突的键值对形成链表。在Java 8及以上版本中,如果链表长度超过一定阈值(8),链表会转换为红黑树以保持查询效率。 插入过程: 当向HashMap中插入...

    HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别.docx

    与HashSet的区别在于,HashSet是基于HashMap实现的集合类,用于存储唯一对象。HashSet中的元素没有顺序,添加元素时,HashSet会将元素转化为键放入HashMap中。因此,HashSet的插入和查找速度与HashMap相当,但由于...

    HashMap源码实现红黑树添加元素和删除元素

    HashMap 源码实现红黑树添加元素和删除元素 HashMap 中使用红黑树来存储元素,是为了提高查找、插入和删除操作的性能。红黑树是一种自平衡二叉树,可以保持二叉树的平衡,从而获得较高的查找性能。 红黑树的创建...

    HashMap重写实现

    HashMap重写实现 轻量级实现 使用自定义的轻量对象HashObjectMap替代jdk的HahMap HashMap里的Entry占用较大内存,可以用自己实现的轻量级容器替换,步骤如下: 1、 缓存的对象需要继承BaseHashObject /** * 这个类...

    asp hashmap,arraylist实现

    标题中的“asp hashmap,arraylist实现”指的是在ASP(Active Server Pages)编程中使用HashMap和ArrayList这两种数据结构的具体应用。HashMap和ArrayList是.NET框架中常用的数据集合类,它们在处理和组织数据方面各...

    浅谈Java中HashMap类的使用.pdf

    当需要顺序输出时,可以使用 TreeMap 类实现 Map 集合。 六、实例应用 例如,在一个学生管理系统中,可以使用 HashMap 来存储学生的学号和姓名的映射关系。然后,使用 get 方法通过学号来获取学生的姓名。使用 ...

    学习笔记:三数组实现的HashMap

    在Java编程语言中,HashMap是一种常用的集合类,用于存储键值对数据。它提供O(1)的平均时间复杂度来插入、删除和查找元素,这得益于其内部的数据结构设计。"学习笔记:三数组实现的HashMap"这篇博客文章可能讨论了一...

    电话本管理系统HashMap实现

    HashMap是Java集合框架中的一个核心类,它实现了Map接口。Map接口存储键值对(key-value pairs),而HashMap则使用哈希表数据结构来实现,提供平均时间复杂度为O(1)的插入、删除和查找操作。哈希表通过计算对象的...

Global site tag (gtag.js) - Google Analytics