You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于HashMap实现用户卡片的查询与添加?求HashMap学习指导

关于User类功能实现与HashMap使用的问题解答

一、先修正你的User类代码问题

嘿,作为编程新手不用慌,咱们一步步梳理你代码里的问题并修正:

  1. 多余的User user;变量:这个变量完全没初始化,调用user.getUsername()会直接抛出空指针异常,根本不需要它,直接用当前对象的this.usernamethis.password就行。
  2. userValidate方法的判断逻辑错误:你用contains来校验用户名密码,这会导致比如用户名是"james",输入"jam"也能匹配,显然不符合登录的精确校验要求,应该用equals来做精确匹配。
  3. getCards方法的编译与逻辑错误:返回类型是HashMap<String, Card>,但你写了return true;,这会直接编译失败;而且逻辑上没必要循环keySet,只要用户验证通过,直接返回整个userHash集合就行。
  4. addCard方法的逻辑缺失:验证通过后没有把卡片实际添加到HashMap里,应该用卡片的唯一ID作为key,把card对象存进去。

修正后的代码如下:

public class User {
    String username;
    String password;
    HashMap<String, Card> userHash = new HashMap<>(); // key is the cardID

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User ---------" + "\n" + "Username: " + username + "\n" + "Password: " + password;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public boolean userValidate(String username, String password) {
        // 精确匹配用户名和密码
        if (this.username.equals(username) && this.password.equals(password)) {
            System.out.println("User accepted");
            return true;
        } else {
            System.out.println("Access denied");
            return false;
        }
    }

    public HashMap<String, Card> getCards(String username, String password) {
        // 先验证用户,通过就返回所有卡片,否则返回null
        if (userValidate(username, password)) {
            return userHash;
        }
        return null;
    }

    public boolean addCard(Card card, String username, String password) {
        if (userValidate(username, password)) {
            // 假设Card类有getCardId()方法获取卡片唯一ID作为key
            userHash.put(card.getCardId(), card);
            System.out.println("Card added successfully");
            return true;
        }
        System.out.println("Failed to add card: invalid credentials");
        return false;
    }
}

注:这里默认你的Card类有getCardId()方法来获取卡片唯一标识,如果没有的话,记得在Card类里补充这个方法,或者用其他能唯一标识卡片的属性作为HashMap的key。

二、HashMap实用使用技巧

作为新手,掌握这些技巧能帮你少踩很多坑:

  • 选对Key类型:优先用不可变类型(比如String、Integer)作为Key,因为可变类型如果修改内部值,哈希值会变化,导致HashMap找不到对应的Value。
  • 重写equals和hashCode:如果要用自定义类作为Key,必须重写这两个方法,否则HashMap无法正确判断两个Key是否相等。
  • 尽量避免Null值:虽然HashMap允许存Null Key和Null Value,但实际开发中尽量避免,容易引发空指针异常,调试起来很麻烦。
  • 高效遍历:如果只需要遍历Key,用keySet();只需要Value用values();需要同时获取键值对的话,用entrySet(),后者效率更高,不用重复根据Key查Value。
  • 合理设置初始容量和负载因子:HashMap默认初始容量是16,负载因子0.75,当元素数量达到容量*负载因子时会自动扩容。如果提前知道要存多少元素,可以在初始化时设置合适的容量,减少扩容次数,提升性能,比如new HashMap<>(100)
  • 线程安全问题:HashMap不是线程安全的,如果在多线程环境下使用,建议用ConcurrentHashMap,或者用Collections.synchronizedMap()包装一下。

三、学习建议

不用找外部网站,站内的Stack Overflow就有超多关于HashMap的优质问答,搜“HashMap best practices”或者“Java HashMap tips”就能找到很多开发者的实际经验分享;另外Java官方的API文档也是最权威的资料,里面详细说明了HashMap的所有方法和注意事项。

内容的提问来源于stack exchange,提问作者James

火山引擎 最新活动