gpt4 book ai didi

java - HashTable getcontainsKey 不起作用

转载 作者:行者123 更新时间:2023-12-02 02:34:31 25 4
gpt4 key购买 nike

我不明白为什么这个简单的方法不起作用

我的类(class)AccessChecker具有属性 Hashtable<String, List<Permission>> permissions = new Hashtable<String, List<Permission>>();有两种方法:

第一种方法

如果我输入 this.permissions.containsKey(key)在这个方法结束时,只要有一个好的 key ,它就可以工作。

public void updatePermissions() {
List<Permission> permissionsTmp = permissionRepository.findAllWithEagerRelationships();

// clear permissions
this.permissions = new Hashtable<>();

// load all permissions
for (Permission permission : permissionsTmp) {
Profil profil = profilRepository.findOne(permission.getProfil().getId());
permission.setProfil(profil);
UserFonc user = userFoncRepository.findOne(permission.getUserFonc().getId());
permission.setUserFonc(user);

log.error("updatePermissions ** user login = " + user.getNom());

for (WebService webService: profil.getWebServices()) {
String key = createKeyPermissions(user.getNom().toLowerCase(), webService.getNom(), webService.getMethode());
log.error("updatePermissions ** key = " + key);
if (this.permissions.containsKey(key)){
this.permissions.get(key).add(permission);
}
else {
List<Permission> newPermissions = new ArrayList<>();
newPermissions.add(permission);
this.permissions.put(key, newPermissions);
}

}
}
}

第二种方法

但是,当我在方法 hasAccessToWebservice() 中执行此操作时,它不适用于相同的 key ...

public boolean hasAccessToWebservice(HttpServletRequest request) {
boolean hasAccess = false;

String webservice = getServiceFromRequest(request);
String methode = request.getMethod();
String login = SecurityUtils.getCurrentUserLogin();
String userAgent = request.getHeader(Constants.USER_AGENT);

final String userLogin = SecurityUtils.getCurrentUserLogin();
log.error("hasAccessToWebservice ** user login = " + userLogin);

String key = createKeyPermissions(login.toLowerCase(), webservice, methode);
log.error("hasAccessToWebservice ** key = " + key);

log.error("hasAccessToWebservice ** element = " + this.permissions.size());

Set t = this.permissions.keySet();
log.error(t.toString());

if (this.permissions.containsKey(key)) {
log.error("hasAccessToWebservice ** key found !!");
hasAccess = true;
}
return hasAccess;
}

你能解释一下为什么吗?

谢谢

最佳答案

问题摘要

总结一下这个主题,问题围绕着 key 一致性:

  1. Map.containsKey(Object key) 基本上会检查 key 是否在 Map.keySet() 中,主要依靠 Object.hashCode()
  2. 您的 map 键类是String。如果你看String.hashCode()代码,您会看到它依赖于每个单个字符值。

    Returns a hash code for this string. The hash code for a String object is computed as

    s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

    using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation. (The hash value of the empty string is zero.)

    值可以在 ASCII Table 中找到突出显示 hashCode() 区分大小写

解决方案/改进

  • 最简单的解决方案是通过将所有内容都转换为小写来确保 createKeyPermissions 方法始终生成一致的 key
  • 使用 TreeMap使用比较器,其中最合适的一个是 String.CASE_INSENSITIVE_ORDER

关于java - HashTable getcontainsKey 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46590031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com