java中哈希表的基本原理

时间:2014-04-22 16:48:23

标签: java hashtable

我正在编写一个用于处理银行账户的Java应用程序。请考虑以下类:

public class Account 
{
    private double balance;
    private Person owner;
    private String currency;
    private Date openingDate;

    //constructors, getters, setters, other methods
}

public class Bank
{
    //Hashtable accounts;
    //....

    //testing hashtable operations      
    public static void main(String []args)
    {

        Person per1 = new Person(1,"Andrei","Moldovan","str. Lunga nr.4");
        Account acc1 = new Account(per1);
        Account acc2 = new Account(per1, "USD");

        Person p3 = new Person(3,"Erich","Serfozo","str. Zorilor nr. 11");
        Account acc3 = new Account(p3,"EUR");
        acc3.deposit(110.50);

        Hashtable hash = new Hashtable();
        hash.put(acc1.hashCode(), acc1);
        hash.put(acc2.hashCode(), acc2);
        hash.put(acc3.hashCode(), acc3);

        Collection hashtableValues = hash.values();

        for(Object iter : hashtableValues)
        {
           Account acc = (Account)iter;
           System.out.println(acc.toString());
        }  

    }
}

Bank类使用Hashtable存储它包含的每个帐户。在哈希表中插入/访问帐户的正确方法是什么? (我知道我没有做对)如果发生碰撞,我想使用链接。

3 个答案:

答案 0 :(得分:0)

如果您为每个人分配了一个唯一ID,则可以执行以下操作:

//if you want to use a HashMap, then instantiate like below
HashMap<Integer, Account> hash = new HashMap<Integer, Account>();

hash.put(acc1.getId(), acc1);

//to get Account from Person from map
hash.get(per1.getAccountId());

//iterating
for (Map.Entry<Integer, Account> entry : hash.entrySet())
{
    System.out.println(entry.getKey() + "/" + entry.getValue().getPerson());
}

答案 1 :(得分:0)

每个帐户都可以与唯一编号相关联(可能是帐号或其他值),这可以是:

hash.put(acc1.getAcntNum(), acc1);

hash.(acc1.getIdentifier,acc1);

其他方式可以是,将person id作为键,值将包含一个人拥有的帐户列表:List list = new ArrayList(); list.add(acnt1); list.add(acnt2); hash.put(person.getId(),列表); 通过这种方式管理用户的所有帐户将更容易。

答案 2 :(得分:0)

你应该对标准的Java集合进行更多的研究,因为你似乎对你想要的东西感到有点困惑,而你似乎对新的Hashtable类及其内部实现感兴趣。

地图背后的理论,即旧的Hashtable和现代HashMap都是,它是从特定的键映射到一个。地图要么包含一个键,要么不包含。如果它确实包含密钥,则可以获取与密钥关联的值。

哈希表的运行方式对您来说应该是不透明的。可以搜索关键 - >值对的平面列表,并且您将获得相同的结果。哈希表通过使用哈希码来改进此操作的速度,哈希码可以是任意数字,只要它对于相同的密钥始终具有相同的数字。如果多个不同的密钥具有相同的哈希码,则无关紧要,因为该表在表中的潜在密钥上使用.equals以确保它具有完全正确的密钥。但是哈希码越具体,就越不可能检查多个密钥。

您应该更关心要存储的内容,要检索的内容。您想按帐号查找帐户吗?你想查看谁拥有它们的账户?您需要根据需要设计数据结构。

例如,要处理查找某个人拥有的帐户(并且某个人可以拥有多个帐户),您可以制作一个从Map(密钥)映射到的Person 集:

Account

此代码假设final Map<Person, Set<Account>> accountsByPerson = new HashMap<>(); // add account acc1 for a person per1 Set<Account> accountsForThisPerson = accountsByPerson.get(per1); if (accountsForThisPerson == null) { accountsForThisPerson = new HashSet<>(); accountsByPerson.put(per1, accountsForThisPerson); } accountsForThisPerson.add(acc1); // retrieve one person's accounts: final Set<Account> accountsOfPerson1 = accountsByPerson.get(per1); if (per1 == null) { System.out.println(per1 + " has no accounts"); } else { System.out.println(per1 + " has " + accountsOfPerson1.size() + " account(s)"); for (final Account a : accountsOfPerson1) { System.out.println(perl + " has account " + a); } } Account都实现了Personequals方法,它始终给出正确的答案:如果我有两个不同的对象代表相同的帐户,hashCode表示它们是相同的,equals为它们提供相同的结果,一旦我将它们放入像HashMap或HashSet这样的结构中,它们的hashCode就不会改变