Java HashMap使用方法的设计与实现

Java HashMap使用方法的设计与实现,java,hashmap,concurrenthashmap,Java,Hashmap,Concurrenthashmap,在GUI中显示帐户时,我需要显示辅助帐户的主帐户 每个主帐户可以有多个辅助帐户 1) Secondary Account 2) Secondary Instruction. 我正在尝试在HashMap中保存主帐户到辅助帐户的信息。因为,这需要以后检索 在保存时,我还需要保存辅助帐户指令。所以,我需要保存两个对象,其中key作为主帐户 1) Secondary Account 2) Secondary Instruction. 我为account和instruction对象重写了equals和

在GUI中显示帐户时,我需要显示辅助帐户的主帐户 每个主帐户可以有多个辅助帐户

1) Secondary Account
2) Secondary Instruction.
我正在尝试在HashMap中保存主帐户到辅助帐户的信息。因为,这需要以后检索

在保存时,我还需要保存辅助帐户指令。所以,我需要保存两个对象,其中key作为主帐户

1) Secondary Account
2) Secondary Instruction.
我为account和instruction对象重写了equals和hashcode

我试图使用主帐户哈希代码作为键,使用值作为对象列表[2]

-初始化

private static final Map<Integer, ArrayList<Object[]>> primaryToSecondaryAcct = new ConcurrentHashMap<Integer, ArrayList<Object[]>>();
-价值观

final Object[] acctInstr = new Object[2];
acctInstr[0] = acct;
acctInstr[1] = instr;
if(primaryToSecondaryAcct.get(getExistingAccount().hashCode()) != null) {
    primaryToSecondaryAcct.get(getExistingAccount().hashCode()).add(acctInstr);
} else {
    final ArrayList<Object[]> acctInstrList = new ArrayList<Object[]>();
    acctInstrList.add(acctInstr);
    primaryToSecondaryAcct.put(getExistingAccount().hashCode(), acctInstrList);
}
我想知道这是否正确,是否有更好的方法。你能建议吗?

而不是:

Map<Integer, ArrayList<Object[]>>
为什么不呢

Map<Account, SecondaryInfo>
目前,您正在根据密钥存储一个集合,当您从映射中提取它时,您必须管理它、迭代它等等。我认为最好创建一个合适的抽象并委托给它。这种抽象将在一个位置处理验证、迭代等,而不是每次访问地图时都要担心它

记住-OO是告诉对象为您做事情,而不是询问他们信息并自己做


我将用特定的account对象替换帐户的整数表示形式。否则,您将不得不管理许多表示不同类型的整数,并且很容易将它们混合在一起。尽管使用的是普通类,但键入它们意味着您可以使用自动化工具进行简单的重构,并轻松确定类型,而无需使用命名约定。

您首先需要的是一个,您可以在Google的库中找到。这类似于映射,并为您将一个键映射到多个值,这样您就不必重新创建它

接下来,用您自己的自定义类替换对象[]:

public class SecondaryInformation {
    private SecondaryAccount secondaryAccount;
    private SecondaryInstruction secondaryInstruction;

    // Constructors, getters, setters, etc.
}
所以你会有一个多重地图。这是多重映射。

我建议使用Account作为键,因为两个不同对象的哈希代码可能相同。

如果主帐户和辅助帐户都有如下类:

public class PrimaryAccount 
{
    int id;
    private List<SecondaryAccount> secondaryAccounts;   
}

public class SecondaryAccount
{
    int id;
    private List<String> instructions;
    PrimaryAccount primaryAccount;
}
然后,也许您甚至不需要HashMap。但是,您可能仍然希望维护一个Hashmap,以便快速查找帐户: HashMap,您将在其中存储帐户id和主帐户


这使得实现更简洁。如何为主帐户和辅助帐户编写类。

实际上,Integer.hashCode返回整数的int值,因此不可能为两个整数对象使用相同的哈希值。仍然存在冲突的可能性,当然表大小不等于键空间,但不是因为整数对象的哈希相等。@Brian他不使用Integer.hashCode,而是Account.hashCode,这是另一回事。在他的问题中,他使用的是Map,所以不,他没有。在所选答案中,他将是@Brian primaryToSecondaryAcct.putgetExistingAccount.hashCode,acctInstrList;因此,用作键的整数是帐户的哈希代码。因此,有可能有两个不同的帐户与相同的哈希码和地图会认为它们相等。而且,我同意,这是一个问题,因为他们确实会被认为是平等的地图在这种情况下+1I没有意识到这一事实,这两个对象可以有相同的哈希代码。谢谢你的推荐,记住东西!这很有帮助。