`
water84222
  • 浏览: 373118 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

java---hashtable

阅读更多

Hashtable检索数据时,必须比较所用关键字是否与存储在hashtable中的某个关键字相等,如果两个关键字对象不能正确判断是否相等,检索时不可能正确的。Object.hashCode方法返回一个叫做散列码的值,这个值是由对象的地址以某种方式转换来的。内容相同的两个对象,既然是两个对象,地址就不可能一样,所以Object.hashCode返回的值也不一样。要想两个内容相同的Object子类对象的hashCode方法返回一样的散列码,子类必须覆盖Object.hashCode方法,用于关键字的类,如果他的两个对象用equals方法比较是相等的,那么这两个对象的hashCode方法返回值也要一样,所以我们也要覆盖hashCode方法。因为String类已按关键字类的要求覆盖了这两个方法,如果两个String对象的内容相等,他们的hashCode的返回值也想等,所以,我们在实现自己编写的关键字累得hashCode方法时,可以调用这个关键子类的String类型的成员变量的hashCode方法来计算关键字类的hashCode返回值,也可以自己重写一个新的实现。注意:stringBuffer类没有按照关键字累得要求覆盖hashCode方法,即使两个StringBuffer类对象的内容相等,但这两个对象的hashCode方法的返回值却不相等。 而且要特别注意的equals()与hashCode()方法都要重写,至于原因看一下,hashtable. put()与get()方法,简单来说就是这样在put(key,value)放入hashtable时要执行key.hashCode(),get(key)时要将hashCode()进行比较。

一个简单的例子:

import java.util.Enumeration;
import java.util.Hashtable;

public class TestHashTable {
    public static void main(String[] args)
    {
        Hashtable<MyKey, Integer> ht = new Hashtable<MyKey, Integer>();
        //ht.put(new MyKey("tom",52), new Integer(11));
        System.out.println(ht.put(new MyKey("tom",52), new Integer(1)));
        ht.put(new MyKey("jak",20), new Integer(2));
        ht.put(new MyKey("dd",20), new Integer(4));
        ht.put(new MyKey("aa",20), new Integer(6));
        //Enumeration num =  ht.keys();
        System.out.println(ht.get(new MyKey("jak",20)));
        /*while(num.hasMoreElements())
        {
            MyKey key = (MyKey) num.nextElement();
            System.out.println(key.toString());
            System.out.println(ht.get(key).toString());
        }*/
    }
}

 

 

public class MyKey {
    private String name;
    private int age;
   
    public MyKey(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
   
    public String toString()
    {
        return new String(name+","+age);
    }
   
    public boolean equals(Object obj){
        MyKey mk = null;
        if(obj instanceof MyKey)
            mk=(MyKey) obj;
        if(name.equals(mk.name)&&age==(mk.age))
            return true;
        else
            return false;
    }
     public int hashCode()
     {
         return name.hashCode()+age;
     }
}

 

把hashCode方法注释掉就可以看到效果拉。

 

分享到:
评论

相关推荐

    java集合-Hashtable的使用

    Hashtable是Java中的一种散列表实现,它可以存储键值对,并根据键的哈希值来快速查找和访问值。

    java-聊天窗口java-聊天窗口.doc

    - `java.util.Hashtable`:存储键值对的数据结构。 2. **ChatArea类定义**: - 继承自`Panel`,实现了`ActionListener`和`Runnable`接口。`Panel`是GUI中的一个组件容器,`ActionListener`用于监听按钮等组件的...

    HashTable的java实现

    在Java编程语言中,哈希表(HashTable)是一种常见的数据结构,它提供了高效的数据存储和检索功能。哈希表基于哈希函数将键(Key)映射到数组的索引位置,通过键值对(Key-Value Pair)来存储数据。这种数据结构允许...

    java-code Java语言程序.zip

    - **HashMap, HashTable**: 键值对存储,快速查找。 - **Set, TreeSet, HashSet**: 不允许重复元素的集合。 - **Queue, PriorityQueue**: 队列数据结构,先进先出(FIFO)。 6. **多线程(Multithreading)** -...

    哈希表-使用Java开发的哈希表-HashTable.zip

    在Java中,`HashTable`是早期版本(Java 1.0)提供的一种线程安全的哈希表实现。尽管现在已经被`HashMap`所替代,但理解`HashTable`的工作原理和特性仍然对深入理解Java集合框架以及数据结构有重要意义。 哈希表的...

    Hashtable的用法---马克-to-win Java视频

    Hashtable的用法---马克-to-win Java视频哈希表的详细介绍

    java Hashtable的泛型化

    在Java编程语言中,`Hashtable`是`Collections`框架的一部分,它是一个同步的键值对存储容器。在早期的Java版本中,`Hashtable`并没有直接支持泛型,这意味着你可以在其中存储任何类型的键(`Object`)和值(`Object...

    Java 实例 - 遍历 HashTable 的键值源代码+详细教程.zip

    在Java编程语言中,`HashTable`是一个非常重要的数据结构,它提供了一种存储键值对的方式,其中每个键都是唯一的。这个压缩包“Java 实例 - 遍历 HashTable 的键值源代码+详细教程.zip”包含了关于如何遍历`...

    java--九阴真经

    【Java 面试知识点详解】 在Java编程中,了解并掌握一些核心概念和技术是非常重要的,特别是对于面试来说。以下是一些关键知识点的详细解析: 1. **final、finally、finalize的区别** - `final`:这是一个修饰符...

    Google-Java-Programming-style.rar_java programming

    6. **集合与泛型**:推荐使用`List`而非`Vector`,使用`Map`而非`Hashtable`。使用泛型来提高类型安全性,避免强制类型转换。 7. **并发编程**:遵循Java并发库的最佳实践,如使用`ExecutorService`管理线程池,...

    java-se-summary-JavaSE相关的总结文章

    4. **集合框架**:Java集合框架是存储和管理对象的工具,包括List(ArrayList、LinkedList)、Set(HashSet、LinkedHashSet、TreeSet)和Map(HashMap、TreeMap、Hashtable)。泛型的引入增强了类型安全,避免了强制...

    java-util包资料

    Java Util包,全称为`java.util`,是Java标准库中的核心包之一,包含了大量用于通用编程任务的类和接口。这个包自Java 1.0版本以来就存在,随着时间的发展,不断添加了新的功能和类,使得Java程序员在处理各种常见...

    java-Exe5_1.rar_Exe5_3_exe5_exe5_1_exe5_2_java-Exe5_1

    1. 分别使用Vector、Hashtable、Stack,ArrayList、LinkedList和HashSet作为容器类,实现以下要求: (1) 向容器中添加1,000,000个随机整数。 (2) 遍历容器中的所有元素。 (3) 随机产生100,000个整数,在容器中查找...

    java-all.pdf

    - **Hashtable**:线程安全的映射。 - **IdentityHashMap**:基于对象身份而非哈希码的映射。 - **WeakHashMap**:允许键被垃圾回收的映射。 - **Collections**:提供了许多静态方法来操作集合。 #### 五、输入/...

    整理的Java-EE面试总结.pdf

    而Hashtable是继承自Dictionary类,它也是线程安全的。TreeMap则是基于红黑树的,可以实现元素的排序。 对于集合框架的线程安全问题,文档中提到,可以保证线程安全的方式是使用同步代码块或同步方法,或者在JDK1.5...

    计算机后端-Java-Java高并发从入门到面试教程-存思路.zip

    - **ConcurrentHashMap**:分析其线程安全的实现机制,对比`Hashtable`和`synchronized Map`。 - **BlockingQueue**:学习`ArrayBlockingQueue`、`LinkedBlockingQueue`等队列的用法,理解生产者-消费者模式。 3....

    java-programming-chapter-interview.zip_java programming

    2. HashMap与Hashtable:详解这两种映射结构,包括它们的工作原理和使用注意事项。 3. Map接口:理解键值对的概念,熟悉put、get、remove等操作。 4. 集合遍历:掌握迭代器和增强for循环的遍历方式。 五、多线程 1....

    java-专业】最全-JAVA面试题

    9. **Hashtable与HashMap**:Hashtable是古老的键值存储,不支持null键值,方法是同步的;HashMap是现代的Map实现,允许null键值,方法非同步,更高效,提供了containsValue和containsKey方法。 10. **Overload与...

    Java-J2SE学习笔记

    Properties类在Java中用于处理配置文件,它继承自Hashtable。Properties类主要用于存储和加载键值对,常用于程序的配置信息。它可以读取.properties格式的文件,进行国际化处理。通过`load()`方法加载文件,`...

Global site tag (gtag.js) - Google Analytics