You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从HashMap的Account对象中访问修改accOpBalance及存储交易记录

解决方案与代码示例

1. 先规范Account类的设计

要安全修改余额并记录交易,首先得把账户核心数据封装好,避免外部直接操作字段。下面是优化后的Account类:

import java.util.LinkedList;
import java.util.List;

public class Account {
    // 私有字段,禁止外部直接修改
    private double accOpBalance;
    // 用LinkedList存交易记录,方便快速添加最新记录、删除最旧记录
    private List<String> recentTransactions;
    // 固定最多保存6条交易
    private static final int MAX_TRANSACTIONS = 6;

    // 构造方法初始化余额和交易记录集合
    public Account(double initialBalance) {
        this.accOpBalance = initialBalance;
        this.recentTransactions = new LinkedList<>();
    }

    // 获取当前余额的方法
    public double getAccOpBalance() {
        return accOpBalance;
    }

    // 存款操作:校验金额有效性,修改余额并记录交易
    public void deposit(double amount) {
        if (amount > 0) {
            accOpBalance += amount;
            addTransaction("存款 +" + amount + ",当前余额:" + accOpBalance);
        }
    }

    // 取款操作:校验金额和余额,修改余额并记录交易
    public void withdraw(double amount) {
        if (amount > 0 && amount <= accOpBalance) {
            accOpBalance -= amount;
            addTransaction("取款 -" + amount + ",当前余额:" + accOpBalance);
        } else {
            addTransaction("取款失败:金额无效或余额不足,尝试金额:" + amount);
        }
    }

    // 统一处理交易记录:最新记录放最前面,超过6条就删掉最旧的
    private void addTransaction(String transaction) {
        recentTransactions.add(0, transaction);
        if (recentTransactions.size() > MAX_TRANSACTIONS) {
            recentTransactions.remove(MAX_TRANSACTIONS);
        }
    }

    // 获取交易记录的副本,避免外部直接修改内部集合
    public List<String> getRecentTransactions() {
        return List.copyOf(recentTransactions);
    }
}

2. HashMap中账户的操作

HashMap里存的是Account对象的引用,所以取出对象后直接调用方法修改,不需要重新put回Map。下面是使用示例:

import java.util.HashMap;
import java.util.Map;

public class AccountManager {
    public static void main(String[] args) {
        // 初始化存储账户的HashMap,键用账号,值用Account对象
        Map<String, Account> accountMap = new HashMap<>();

        // 添加一个初始余额1000的账户
        accountMap.put("ACC1001", new Account(1000.0));

        // 取出账户并执行交易
        Account account = accountMap.get("ACC1001");
        if (account != null) {
            account.deposit(500.0);
            account.withdraw(200.0);
            account.deposit(300.0);
            account.withdraw(150.0);
            account.deposit(400.0);
            account.withdraw(250.0);
            account.deposit(100.0); // 第7笔交易,会自动删除最旧的那一条
        }

        // 查看账户状态
        Account targetAccount = accountMap.get("ACC1001");
        if (targetAccount != null) {
            System.out.println("当前余额:" + targetAccount.getAccOpBalance());
            System.out.println("最近6条交易记录:");
            for (String trans : targetAccount.getRecentTransactions()) {
                System.out.println("- " + trans);
            }
        }
    }
}

3. 给新手的代码反馈

  • 别直接暴露类字段:如果把accOpBalance设为public,外部可能直接把余额改成负数或者不合理的值,用私有字段+方法的封装方式,能在方法里做校验,保证数据合法。
  • 选对集合类型:用LinkedList存交易记录,头部添加和尾部删除的效率比ArrayList高,适合这种需要频繁更新顺序的场景。
  • 判空很重要:从HashMap取账户时一定要检查是否为null,不然容易触发NullPointerException。
  • 交易记录可扩展:如果以后需要更详细的交易信息(比如交易时间、交易类型编码),可以把String换成一个专门的Transaction类,包含时间、金额、类型等字段,扩展性更强。
  • 避免直接修改内部集合:返回交易记录时用List.copyOf()返回不可修改的副本,防止外部代码不小心篡改账户的交易记录。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:40:22