无法在HashMap中存储对象

时间:2018-11-09 00:39:59

标签: java hashmap

我正在尝试使用如此定义的HashMap创建一个SecureDataContainer: HashMap:()>
其中KeyCouple是我定义的一个类,其中包含该对夫妇以访问与该对夫妇关联的Vector。 现在,当我用这种方法创建几个HashMap时

private static void testContainer(SecureDataContainer<String> container){
    try {
            container.createUser("Name","pwd");
    } catch (UserAlreadyPresent e) {
            System.out.println("User already present");
    }
...

现在,在主类中,我运行以下代码:

public boolean put(String Owner, String passw, E data) throws NoUserException {
    if(Owner == null || passw == null || data == null) throw new NullPointerException();
    if(Owner.isEmpty() || passw.isEmpty()) throw new IllegalArgumentException();

    KeyCouple user = new KeyCouple(Owner,passw);
    if(DBUsers.containsKey(user)){
        Vector<E> aux = DBUsers.get(user);
        return aux.add(data);
    }else{
        throw new NoUserException("No user");
    }
}

使用密码“ pwd”创建用户“名称”。 但是,当我在与使用我的“ put”方法创建的夫妇关联的向量中放置一些东西时:

    try {
        container.put("Name", "pwd", someData of type E);
    } catch (NoUserException e){
        abort("no user");
    }

在主类中,我调用方法:

    LoggerContext context = (LoggerContext) (LoggerFactory.getILoggerFactory());
    Logger log = context.getLogger("org.springframework.beans.factory.support.DefaultListableBeanFactory");
    log.setLevel(Level.DEBUG);
    MyAppender appender = new MyAppender();
    appender.setContext( context);
    log.addAppender( appender  );
    SpringApplication newApplication = new SpringApplication( Application.class);
    newApplication.run( new String [] {});

并且在任何情况下都将中止,甚至在catch分支中也将显示“ no user”。

这是什么意思?

4 个答案:

答案 0 :(得分:1)

您可以使用等号和哈希码检查示例KeyCouple类。

public class KeyCouple {   

    private String name;    

    private String pwd;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        KeyCouple keyCouple = (KeyCouple) o;
        return Objects.equals(name, keyCouple.name) &&
                Objects.equals(pwd, keyCouple.pwd);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, pwd);
    }
}

答案 1 :(得分:0)

您的密码是不同的。您是使用Pwd创建的,并在主类中使用pwd

答案 2 :(得分:0)

每次使用 new 都会在堆中创建一个新对象。 当您将一个KeyCouple实例作为键存储在哈希图中时,您正在尝试将其与另一个KeyCouple实例进行匹配。为每个用户实例生成的哈希码将有所不同。因此,java无法匹配它们。一种解决方案是重写KeyCouple类中的hashCode方法。

@Override
public int hashCode() {
    return Objects.hash(......);
}

答案 3 :(得分:0)

您需要覆盖KeyCouple的equals和hashcode方法。

我建议您使用任何IDE为您自动生成它们。

KeyCouple用户=新的KeyCouple(Owner,passw);

这将创建一个新的用户对象,并将其插入到地图中。下次创建另一个新对象时(除非您明确覆盖equals / hashcode,否则它永远不会等于已创建的对象)。

请参阅此以获得进一步的说明。

Why do I need to override the equals and hashCode methods in Java?