注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

IOS & JAVA KEY

(iMilo)

 
 
 

日志

 
 
关于我

All the splendor in the world is not worth a good friend!! Hello my friend!!

网易考拉推荐

对集合类Hashtable的认识  

2011-01-26 20:11:29|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

2011-01-26

 

l  Hashtable实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。

l  Hashtable不仅可以像Vector一样动态存储一系列的对象,而且对存储的每一个对象(称为值)都要安排另一个对象(称为关键字)与之相关联。

l  要想成功检索数据,用作Hashtable表里面的关键字(KEY)的类必须覆盖ObjecthashCode()方法和equals()方法。

CODE:

     KEY关键字类Person.java,代码如下:

/**

 * @author TEANA E-mail: mmz06@163.com

 * @version 创建时间:2011-1-25 上午11:56:41

 * @DO  HashTablekey--关键字类

 * @Discribe    作为HashTable中的关键字类

 *              必须重写Object类的equals()方法

 *              hashCode()方法        

 */

 

public class Person

{

    private String name;

    private int age;

 

    public Person()

    {

        super();

    }

 

    public Person(String name, int age)

    {

        super();

        this.name = name;

        this.age = age;

    }

 

    public boolean equals(Object obj)

    {

        if(obj instanceof Person)

        {

            Person p = (Person) obj;

            if((this.name).equals(p.name)

                    && (this.age == p.age))

            {

                return true;

            }

            return false;

        }

        return false;

    }

   

    public int hashCode()

    {

        //因为String类已经重写了ObjecthashCode所以可以直接使用

        //注意StringBuffer类没有重写ObjecthashCode方法,所以即使

        //StringBuffer的内容一样,也不一定它们的hashCode一样,

        //StringBuffer类不能作为HashTable关键字key

        return name.hashCode() + age;

    }

   

    public String toString()

    {

        return "PERSON:[name = " + name +

            ", age = " + age + "]";

    }

}

     测试类TestHashTable.java,代码如下:

import java.util.Enumeration;

import java.util.Hashtable;

/**

 * @author TEANA E-mail: mmz06@163.com

 * @version 创建时间:2011-1-25 下午12:16:37

 * @DO  测试HashTable           

 */

public class TestHashTable

{

    public static void main(String[] args)

    {

        Hashtable map = new Hashtable();

        map.put(new Person("张三", 18), new Integer(1));

        map.put(new Person("李四", 19), new Integer(2));

        map.put(new Person("王五", 20), new Integer(3));

        Enumeration e = map.keys();

        while(e.hasMoreElements())

        {

            Person key = (Person) e.nextElement();

            System.out.println("{key = " + key +

                ", value = " + map.get(key) + "}");

        }

        System.out.println(map.get(new Person("张三", 18)));

    }

}

说明:map.get(key)都能取到值,但是如果将关键字类Person中重写的hashCode()equals()方法注释。重新执行该程序,最后一个map.get(new Person("张三", 18))不能取到值,但前面的迭代能取到值,原因是迭代中的关键字key是在Hashtable取得的,无需进行哈希比较,但最后一个new的关键字key,必须进行哈希比较,才能确定Hashtable中是否存在该key

查看Hashtable源代码中的get(key)方法,代码如下:

    public synchronized V get(Object key) {

    Entry tab[] = table;

    int hash = key.hashCode();

    int index = (hash & 0x7FFFFFFF) % tab.length;

    for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {

        if ((e.hash == hash) && e.key.equals(key)) {

        return e.value;

        }

    }

    return null;

}

说明:int hash = key.hashCode();此代码就是调用关键字类的hashCode()方法,因此如果关键字类中没有hashCode()方法,则自动调用父类ObjecthashCode()方法,因此不能找到子类(关键字类)

  评论这张
 
阅读(407)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017