如何解决Map中用户名键的大小写敏感性匹配问题?
解决Map键的大小写敏感问题
嘿,这个问题我之前也碰到过!Java里默认的HashMap对字符串键是区分大小写的,所以'John'和'john'会被当成两个完全不同的键。要解决这个问题,有两种实用的办法,看你需求选:
方法一:统一键的大小写(推荐,性能更优)
这种方法是把所有键都转成小写(或大写)存储,查询的时候也把目标字符串转成同样的大小写去查找,用HashMap就能搞定,查找性能是O(1),适合数据量较大的场景。
修改你的收集代码:
List<User> usersList = User.getUsers(); Map<String, User> users = usersList.stream() .collect(Collectors.toMap( // 把用户名转成小写作为键 user -> user.getUsername().toLowerCase(), Function.identity(), // 处理重复键(比如存在'John'和'JOHN'的情况),保留第一个出现的用户 (existingUser, newUser) -> existingUser ));
查询的时候,记得把要检查的用户名也转成小写:
for(String username : activeUsers.getUsers()) { // 转成小写后再查询 User user = users.get(username.toLowerCase()); }
方法二:使用不区分大小写的TreeMap
TreeMap支持自定义键的比较规则,我们可以传入String.CASE_INSENSITIVE_ORDER这个内置的比较器,让它忽略大小写来匹配键。这种方法不用手动处理大小写,代码更直观,但TreeMap的查找性能是O(log n),适合数据量不大的场景。
修改收集代码:
List<User> usersList = User.getUsers(); Map<String, User> users = usersList.stream() .collect(Collectors.toMap( User::getUsername, Function.identity(), // 处理重复键冲突 (existingUser, newUser) -> existingUser, // 指定使用不区分大小写的TreeMap () -> new TreeMap<>(String.CASE_INSENSITIVE_ORDER) ));
查询的时候就不用额外处理了,直接用原字符串查找即可:
for(String username : activeUsers.getUsers()) { User user = users.get(username); }
注意点
如果你的用户列表里存在仅大小写不同的重复用户名(比如'John'和'JOHN'),一定要在toMap的第三个参数里指定冲突处理逻辑,否则会抛出IllegalStateException异常哦。
内容的提问来源于stack exchange,提问作者user9729328
相关产品推荐
相关产品推荐

