Java 哈希表getcontainsKey不工作

Java 哈希表getcontainsKey不工作,java,hashtable,containskey,Java,Hashtable,Containskey,我不明白为什么这个简单的方法不起作用 我的类AccessChecker具有属性Hashtable permissions=newhashtable()使用两种方法: 第一种方法 如果我将this.permissions.containsKey(key)放在这个方法的末尾,使用一个好的键,它就会工作 public void updatePermissions() { List<Permission> permissionsTmp = permissionRepository.f

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

我的类
AccessChecker
具有属性
Hashtable permissions=newhashtable()使用两种方法:

第一种方法

如果我将
this.permissions.containsKey(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之前,您需要调用updatePermissions将所有数据放入您的权限中


如果您在没有updatePermissions的情况下运行HasAccessTowerService,则权限列表中没有任何内容=>this.permissions.containsKey(key)不起作用

在运行HasAccessTowerService之前,您需要调用updatePermissions将所有数据放入您的权限中

如果在没有updatePermissions的情况下运行hasAccessToWebservice,则权限列表中没有任何内容=>this.permissions.containsKey(key)not work

问题摘要 总结一下主题,问题围绕着关键的一致性:

  • Map.containsKey(Object key)
    主要依靠
    Object.hashCode()
  • 地图键类是
    String
    。如果您查看代码,您将看到它依赖于每个单个字符的值

    返回此字符串的哈希代码。字符串对象的哈希代码计算为

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

    使用int算术,其中s[i]是字符串的第i个字符,n是字符串的长度,^表示求幂。(空字符串的哈希值为零。)

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

  • 解决方案/改进
    • 最简单的解决方案是确保
      createKeyPermissions
      方法始终通过将所有内容以小写形式放置的接口生成一致的密钥
    • 在最合适的位置使用比较仪
    问题摘要 总结一下主题,问题围绕着关键的一致性:

  • Map.containsKey(Object key)
    主要依靠
    Object.hashCode()
  • 地图键类是
    String
    。如果您查看代码,您将看到它依赖于每个单个字符的值

    返回此字符串的哈希代码。字符串对象的哈希代码计算为

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

    使用int算术,其中s[i]是字符串的第i个字符,n是字符串的长度,^表示求幂。(空字符串的哈希值为零。)

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

  • 解决方案/改进
    • 最简单的解决方案是确保
      createKeyPermissions
      方法始终通过将所有内容以小写形式放置的接口生成一致的密钥
    • 在最合适的位置使用比较仪

    什么不起作用?您是否有错误,或者只有您希望有
    containsKey(…)==true,而它是false?containsKey返回总是false,但是当我在哈希表上搜索时,我看到了我的键,您是否介意给出一个让我想到的数据示例?该链接还提到,
    Hashtable
    已过时,如果可以,请切换到
    HashMap
    。与问题无关,但我看到您将所有内容都记录在
    log.error
    中,但它看起来更像
    info
    debug
    我用HashMap替换Hashtable,但结果相同。在我的日志中,我看到了我搜索keey“adminvannesSetBonSAVPOST”的方法,我的HashMap包含这个键(HashMap.keySet().toString()):[admin lorientSetBonSavPOST,AdminVanneGetBonSavget,admin lorientDeleteBonSavDELETE,AdminVannencetBonSavpost,swaroskyGetBonSavGET,AdminLorientGetBonSavdelete]更改为
    HashMap
    将神奇地解决您的问题,这是为了保持最新。使用
    SAV
    admannessbonsavpost
    使用
    SAV
    使用
    admannessbonsavpost
    是否正常?什么不起作用?您是否有错误,或者只有您希望有
    containsKey(…)==true,而它是false?containsKey返回总是false,但是当我在哈希表上搜索时,我看到了我的键,您是否介意给出一个让我想到的数据示例?该链接还提到,
    Hashtable
    已过时,如果可以,请切换到
    HashMap
    。与问题无关,但我看到您将所有内容都记录在
    log.error
    中,但它看起来更像
    info
    debug
    我用HashMap替换Hashtable,但结果相同。在我的日志中,我看到了我搜索keey“adminvannesSetBonSAVPOST”的方法,我的HashMap包含这个键(HashMap.keySet().toString()):[admin lorientSetBonSavPOST,AdminVanneGetBonSavget,admin lorientDeleteBonSavDELETE,AdminVannencetBonSavpost,swaroskyGetBonSavGET,AdminLorientGetBonSavdelete]更改为
    HashMap
    将神奇地解决您的问题,这是为了保持最新。使用
    SAV
    admannessbonsavpost
    使用
    SAV
    使用
    admannessbonsavpost
    是否正常?updatePermissions是启动应用程序的调用,包含数据。updatePermissions是启动应用程序的调用,包含数据。
    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;
    }