黑马程序员技术交流社区
标题:
Hashtable元素的排列
[打印本页]
作者:
戴振良
时间:
2012-3-27 22:16
标题:
Hashtable元素的排列
本帖最后由 戴振良 于 2012-3-27 22:18 编辑
import java.util.Hashtable;
import java.util.Enumeration;
class TestHashtable {
public static void main(String[] args) {
Hashtable ht = new Hashtable();
ht.put(new Keys("张三",25),new Integer(1));
ht.put(new Keys("李四",20),new Integer(2));
ht.put(new Keys("王五",89),new Integer(3));
Enumeration e = ht.keys();
while(e.hasMoreElements()) {
Keys keys = (Keys)e.nextElement();
System.out.print(keys + ": ");
System.out.println(ht.get(keys)); //取出键(keys)对应的值,并打印到屏幕
}
}
}
class Keys {
private String name = null;
private int age = 0;
public Keys(String name,int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object obj) { //覆盖equals方法
if(!(obj instanceof Keys))
return false;
return age == ((Keys)obj).age && name.equals(((Keys)obj).name);
}
public int hashCode() { //覆盖hashCode方法
return name.hashCode() + age;
}
public String toString() { //覆盖toString方法
return name + "," + age;
}
}
复制代码
输出结果为:
王五,89: 3
李四,20: 2
张三,25: 1
为什么这个输出的顺序不是:张三,李四,王五呢?我放的时候是按这个顺序放的呀!
作者:
郑洋洋
时间:
2012-3-27 22:22
Hashtable集合的内部数据存储是按哈希值存储的,内部元素无序。
作者:
刘泰
时间:
2012-3-27 23:25
有没有可能是和treeset一样,hashtabel会自动按照一种排序方法进行排序,可以查查
作者:
刘泰
时间:
2012-3-27 23:28
复制你代码运行,怎么都没法运行
作者:
王亚男
时间:
2012-3-27 23:34
本帖最后由 王亚男 于 2012-3-27 23:42 编辑
接楼上郑洋洋的话~~
而且你也覆写了hashCode的方法,在添加元素时会按照你的hashCode()方法来计算hash值,然后存入hash表中~
然后如果hash值是相同的话,会调用equals方法判断是不是同一个对象~
作者:
贠(yun)靖
时间:
2012-3-28 00:31
因为你复写了hashCode方法和equals方法
当你在集合中put元素的时候 先会判断hashCode的值是否相同 如果相同 就会在调用equals方法 继续判断
如果hashCode的值不同 就会直接添加元素 而你的hashCode方法中 的判断方法 是根据
元素的名字的hashCode值+age 来判断的 你可以试一试return 10; 表示所有元素的hashCode值都相同
这时候就会调用equals方法再排序元素
记住一点就是 集合底层是hash表结构的集合 当添加元素的时候会先调用元素自身的hashCode方法 来判断元素
如果不同则添加成功 如果不同则会再调用equals方法继续判断 最终会按照这两个方法的排序方式来给元素
进行排序 所以说set的集合中的元素是无序的
作者:
袁野
时间:
2012-3-28 07:02
是哈希结构 ,取出是无序的
作者:
戴振良
时间:
2012-3-28 08:20
贠(yun)靖 发表于 2012-3-28 00:31
因为你复写了hashCode方法和equals方法
当你在集合中put元素的时候 先会判断hashCode的值是否相同 如 ...
想不明白,为什么要比较hashCode,如果equals相等的话不就已经可以明确取哪个值了吗?
反过来说,如果hashCode相等的话,不就已经证明了要取哪个对象了吗?
为什么要是要两个方法一起用?比如我上面的,hashCode:return name.hashCode() + age; ,如果这个相等,不就证明了两个对象相等了吗?难道我的hashCode都相等了然后equals比较还会有不相等的情况,能否举个这样的情况的例子,谢谢!!
作者:
抓哇
时间:
2012-3-28 09:02
hashtable是hashmap的同类前辈 都是无序的 要想有序就自定义treemap 再自定义比较器给他做构造函数参数扔进去
作者:
戴振良
时间:
2012-3-28 09:21
补充一个问题:Properties是它的子类,那用来作这个Properties的关键字要不要也得覆盖equals、与hashCode方法呢?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2