- 浏览: 187795 次
- 性别:
- 来自: 自己输入城市...
文章分类
- 全部博客 (128)
- Java (13)
- Util (21)
- IO (1)
- Thread (4)
- Net (0)
- Design Patterns (0)
- Training (4)
- ----------------- (0)
- JS-1 (15)
- JS-3 (7)
- AJAX (3)
- AS (2)
- ------------------- (0)
- HTML (3)
- CSS (3)
- Art (15)
- -------------------- (0)
- RegExp (4)
- --------------------- (0)
- SQL (6)
- Servlet $ JSP (2)
- JDBC (2)
- ---------------------- (0)
- Bird (3)
- Setting (7)
- DL (4)
- PHP (4)
最新评论
-
durong11:
或者直接在函数的中加入:if(head.data.equals ...
我的Java单链表练习 -
durong11:
一种解释是:如果是从头结点insert 直接使用addFrom ...
我的Java单链表练习 -
老肥猴_vi:
谢谢。但是貌似insert函数( public boolean ...
我的Java单链表练习 -
niepeng880208:
支持
List转换成String数组 -
haohao-xuexi02:
EventHelp
幻灯片效果
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 } }
发表评论
-
优先队列的实现
2008-05-11 05:00 973package Heap; import MyInter ... -
堆操作
2008-05-11 02:06 987Comparator接口 package MyInterfac ... -
HashSet 类的实现
2008-04-28 16:03 1195package Hash; import MyInter ... -
Hash类的实现
2008-04-27 15:10 839package Hash; import java.util ... -
散列表的设计-->线性探查法
2008-04-24 09:07 1929性能分析: 散列表中条目数的比例较小时,使用线性探查法的效率较 ... -
二叉排序树的TreeMap类设计
2008-04-23 23:29 1954Iterable接口 package MyInterface; ... -
java集合操作
2008-04-23 23:26 3026package Sets; import java.util ... -
二叉排序树的实现
2008-04-20 01:46 1671最适合用STree排序的是不可变类,不可变类的主要特征是它的对 ... -
InorderIterator类的实现
2008-04-07 08:41 956接口的定义: public interface MyItera ... -
BinaryTree遍历练习::表达式树
2008-04-05 14:35 1787package ExpressionTree; import ... -
二叉树遍历
2008-03-31 01:48 1097二叉树的高度 图(1) /**用后根遍历求二叉树的高度*/ ... -
有界队列
2008-03-26 00:14 1007package Queue; import java.uti ... -
Stack练习:: 中缀-后缀表达式
2008-03-21 17:18 1782package Stack.Calculate; imp ... -
链式队列的实现
2008-03-21 17:05 1355package Queue; import java.u ... -
Stack练习:: 十进制正整数转化成二进制
2008-03-17 16:09 1304include "stdio.h" in ... -
顺序栈的实现
2008-03-14 00:16 1089package Stack; /** * 顺序栈的实现 ... -
数据结构 Java循环双向链表
2008-03-08 17:33 3149■ 构造函数 每个构造函数都通过 this 来初始化链接域 p ... -
我的Java单链表练习
2008-03-06 19:14 3034package LinkedList; /** * ... -
我的ArrayList实现
2008-03-04 21:26 1379package ArrayList; /** * < ... -
[转]数据结构 用Java实现单链表
2007-11-28 12:56 17522007-08-24 页面自动刷 ...
相关推荐
本资源详细介绍了 Java 中的 HashMap 类,包括其实现机制、Hash 存储机制、集合存储机制等方面的知识点。 1. HashMap 和 HashSet 的关系 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,虽然...
HashMap类在Java编程语言中是集合框架的一部分,它是一个基于哈希表的Map接口实现。HashMap提供了快速的插入、删除和查找操作,平均时间复杂度为O(1)。在这个压缩包“HashMap类.rar”中,包含的是易语言版本的...
这个简单的HashMap类实现了基本的添加、获取、删除和遍历功能。然而,实际应用中可能还需要考虑冲突解决策略(例如开放寻址法或链地址法)、性能优化以及支持其他操作,如计算大小、检查是否存在某个键等。此外,...
在Java编程语言中,集合框架是开发者日常工作中不可或缺的一部分,HashMap作为其中的重要成员,它的实现原理对于理解Java性能优化和数据结构有深远的意义。HashMap是一个基于哈希表的数据结构,它实现了Map接口,...
易语言HashMap类是一种在易语言编程环境中实现的高效数据结构,它主要用于存储键值对(key-value pairs),提供快速的数据存取。HashMap类基于哈希表(Hash Table)原理,通过计算键的散列值来确定数据在内存中的...
在给定的压缩包“易语言源码易语言HashMap类源码.rar”中,包含了易语言实现的HashMap类的源代码。HashMap是一种常见的数据结构,在许多编程语言中都有实现,它提供了快速的键值对存储和查找功能。 HashMap类是基于...
HashMap类在Java编程语言中是集合框架的重要组成部分,它是一个基于哈希表的Map接口实现。HashMap提供了存储和检索键值对(key-value pairs)的高效机制,允许使用null键和值。这篇博客将深入探讨HashMap的内部工作...
### hashMap工具类详解 在本篇文章中,我们将详细介绍一个名为`hashMap`的工具类,该类被设计用于Adobe Flex应用程序中,旨在提供一种简单且高效的方法来处理键值对数据结构。通过深入分析该类的实现细节,我们能够...
因此,我们需要构建一个更完善的HashMap类,支持任意类型的键,并提供更丰富的功能,如容量控制、负载因子、扩容策略等。 HashMap的主要功能包括: 1. **初始化**:构造函数可以接收初始容量和负载因子作为参数,...
HashMap类实现了Map接口,是一个基于散列表的Map实现类。HashMap类使用散列表来存储键值对,查找和操作的效率非常高。HashMap类是线程非同步的(asynchronized),因此在多线程环境下需要小心使用。 SortedMap接口 ...
HashMap 是 Java 集合框架中一个非常重要的类,它实现了 Map 接口,并提供了基于哈希表的存储方式。与其它 Map 实现不同的是,HashMap 允许使用 `null` 键和 `null` 值。这种灵活性使得 HashMap 成为许多应用程序中...
Entry类实现了键值对的存储,并包含了next指针,用于连接哈希冲突的键值对形成链表。在Java 8及以上版本中,如果链表长度超过一定阈值(8),链表会转换为红黑树以保持查询效率。 插入过程: 当向HashMap中插入...
与HashSet的区别在于,HashSet是基于HashMap实现的集合类,用于存储唯一对象。HashSet中的元素没有顺序,添加元素时,HashSet会将元素转化为键放入HashMap中。因此,HashSet的插入和查找速度与HashMap相当,但由于...
HashMap 源码实现红黑树添加元素和删除元素 HashMap 中使用红黑树来存储元素,是为了提高查找、插入和删除操作的性能。红黑树是一种自平衡二叉树,可以保持二叉树的平衡,从而获得较高的查找性能。 红黑树的创建...
HashMap重写实现 轻量级实现 使用自定义的轻量对象HashObjectMap替代jdk的HahMap HashMap里的Entry占用较大内存,可以用自己实现的轻量级容器替换,步骤如下: 1、 缓存的对象需要继承BaseHashObject /** * 这个类...
标题中的“asp hashmap,arraylist实现”指的是在ASP(Active Server Pages)编程中使用HashMap和ArrayList这两种数据结构的具体应用。HashMap和ArrayList是.NET框架中常用的数据集合类,它们在处理和组织数据方面各...
当需要顺序输出时,可以使用 TreeMap 类实现 Map 集合。 六、实例应用 例如,在一个学生管理系统中,可以使用 HashMap 来存储学生的学号和姓名的映射关系。然后,使用 get 方法通过学号来获取学生的姓名。使用 ...
在Java编程语言中,HashMap是一种常用的集合类,用于存储键值对数据。它提供O(1)的平均时间复杂度来插入、删除和查找元素,这得益于其内部的数据结构设计。"学习笔记:三数组实现的HashMap"这篇博客文章可能讨论了一...
HashMap是Java集合框架中的一个核心类,它实现了Map接口。Map接口存储键值对(key-value pairs),而HashMap则使用哈希表数据结构来实现,提供平均时间复杂度为O(1)的插入、删除和查找操作。哈希表通过计算对象的...