A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2012-3-27 22:16  /  2048 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴振良 于 2012-3-27 22:18 编辑
  1. import java.util.Hashtable;
  2. import java.util.Enumeration;
  3. class TestHashtable {
  4.        
  5.         public static void main(String[] args) {
  6.                 Hashtable ht = new Hashtable();
  7.                 ht.put(new Keys("张三",25),new Integer(1));               
  8.                 ht.put(new Keys("李四",20),new Integer(2));
  9.                 ht.put(new Keys("王五",89),new Integer(3));                               
  10.                
  11.                 Enumeration e = ht.keys();
  12.                 while(e.hasMoreElements()) {
  13.                         Keys keys = (Keys)e.nextElement();
  14.                         System.out.print(keys + ": ");
  15.                         System.out.println(ht.get(keys)); //取出键(keys)对应的值,并打印到屏幕
  16.                 }
  17.         }       
  18. }

  19. class Keys {
  20.        
  21.         private String name = null;
  22.         private int age = 0;       
  23.                
  24.         public Keys(String name,int age) {
  25.                 this.name = name;
  26.                 this.age = age;
  27.         }

  28.         public boolean equals(Object obj) {    //覆盖equals方法
  29.                 if(!(obj instanceof Keys))
  30.                         return false;
  31.                 return age == ((Keys)obj).age && name.equals(((Keys)obj).name);
  32.         }

  33.         public int hashCode() {                //覆盖hashCode方法
  34.                 return name.hashCode() + age;
  35.         }
  36.                
  37.         public String toString() {             //覆盖toString方法
  38.                 return name + "," + age;
  39.         }
  40. }
复制代码
输出结果为:
                王五,89: 3
                李四,20: 2
                张三,25: 1
为什么这个输出的顺序不是:张三,李四,王五呢?我放的时候是按这个顺序放的呀!

9 个回复

正序浏览
补充一个问题:Properties是它的子类,那用来作这个Properties的关键字要不要也得覆盖equals、与hashCode方法呢?
回复 使用道具 举报
抓哇 初级黑马 2012-3-28 09:02:03
9#
hashtable是hashmap的同类前辈 都是无序的  要想有序就自定义treemap 再自定义比较器给他做构造函数参数扔进去
回复 使用道具 举报
戴振良 黑马帝 2012-3-28 08:20:19
8#
贠(yun)靖 发表于 2012-3-28 00:31
因为你复写了hashCode方法和equals方法
   当你在集合中put元素的时候  先会判断hashCode的值是否相同  如 ...

想不明白,为什么要比较hashCode,如果equals相等的话不就已经可以明确取哪个值了吗?

反过来说,如果hashCode相等的话,不就已经证明了要取哪个对象了吗?

为什么要是要两个方法一起用?比如我上面的,hashCode:return name.hashCode() + age;  ,如果这个相等,不就证明了两个对象相等了吗?难道我的hashCode都相等了然后equals比较还会有不相等的情况,能否举个这样的情况的例子,谢谢!!
回复 使用道具 举报
袁野 黑马帝 2012-3-28 07:02:21
7#
是哈希结构 ,取出是无序的
回复 使用道具 举报
因为你复写了hashCode方法和equals方法
   当你在集合中put元素的时候  先会判断hashCode的值是否相同  如果相同  就会在调用equals方法 继续判断
   如果hashCode的值不同 就会直接添加元素    而你的hashCode方法中 的判断方法 是根据  
   元素的名字的hashCode值+age  来判断的      你可以试一试return 10; 表示所有元素的hashCode值都相同
      这时候就会调用equals方法再排序元素   
   记住一点就是  集合底层是hash表结构的集合 当添加元素的时候会先调用元素自身的hashCode方法 来判断元素
    如果不同则添加成功  如果不同则会再调用equals方法继续判断  最终会按照这两个方法的排序方式来给元素
        进行排序  所以说set的集合中的元素是无序的
回复 使用道具 举报
本帖最后由 王亚男 于 2012-3-27 23:42 编辑

接楼上郑洋洋的话~~
而且你也覆写了hashCode的方法,在添加元素时会按照你的hashCode()方法来计算hash值,然后存入hash表中~
然后如果hash值是相同的话,会调用equals方法判断是不是同一个对象~
回复 使用道具 举报
复制你代码运行,怎么都没法运行
回复 使用道具 举报
有没有可能是和treeset一样,hashtabel会自动按照一种排序方法进行排序,可以查查
回复 使用道具 举报
Hashtable集合的内部数据存储是按哈希值存储的,内部元素无序。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马