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

Java Map中存入对象后无法访问其属性的问题求助

问题分析与解决

问题描述

创建若干对象并存入Map<Integer, Object>集合后,遍历Map时对象属性均显示为null,但通过inventory2.containsValue(objName)能确认对象存在。

原代码

Obj类

public class Obj {

    public String name;
    public int quantity;

    public Obj(String name, int quantity) {
        name = this.name;
        quantity = this.quantity;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    @Override
    public String toString() {
        return "obj [name=" + name + ", quantity="
                + quantity + "]";
    }
}

mapReview方法

public static void mapReview() {

    Map<Integer, Obj> inventory2 = new HashMap<>();
    Obj greenHerb = new Obj("Green Herb",2);
    Obj redHerb = new Obj("Red Herb", 4);

    for(int k = 0; k < inventory2.size(); k++) {
        System.out.println("Key is: " + k + " and name is: " + inventory2.get(k).getName() + " and quantity is: " + inventory2.get(k).getQuantity());
    }
}

错误点分析

  • 构造函数赋值逻辑完全颠倒:Obj的构造函数里,把成员变量的默认值(name为null、quantity为0)赋给了方法参数,而非将参数值赋予成员变量,导致对象属性从未被正确初始化。
  • 对象未存入Map:创建对象后没有调用inventory2.put()方法将对象添加到集合中,Map始终为空,遍历自然拿不到有效数据。
  • HashMap遍历方式错误:HashMap的key不是连续整数索引,用for(int k=0; k<inventory2.size(); k++)的方式遍历,根本无法获取到Map中的元素。

修正后的代码

修正后的Obj类

public class Obj {
    public String name;
    public int quantity;

    // 修正赋值顺序,将参数值赋给成员变量
    public Obj(String name, int quantity) {
        this.name = name;
        this.quantity = quantity;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    @Override
    public String toString() {
        return "obj [name=" + name + ", quantity=" + quantity + "]";
    }
}

修正后的mapReview方法

public static void mapReview() {
    Map<Integer, Obj> inventory2 = new HashMap<>();
    Obj greenHerb = new Obj("Green Herb", 2);
    Obj redHerb = new Obj("Red Herb", 4);

    // 将对象存入Map,指定对应的key
    inventory2.put(1, greenHerb);
    inventory2.put(2, redHerb);

    // 使用entrySet遍历Map,正确获取key和对应的对象
    for (Map.Entry<Integer, Obj> entry : inventory2.entrySet()) {
        int key = entry.getKey();
        Obj obj = entry.getValue();
        System.out.println("Key is: " + key + " and name is: " + obj.getName() + " and quantity is: " + obj.getQuantity());
    }
}

修正说明

  1. 构造函数修正后,对象的name和quantity会被正确初始化,属性值不再为null或默认0。
  2. 添加put操作后,对象成功存入Map,集合不再为空。
  3. 改用entrySet遍历Map,能直接获取每个键值对,避免了索引遍历HashMap的错误逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:22:10