我正在尝试使用如此定义的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”。
这是什么意思?
答案 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?