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;
}