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()); } }
修正说明
- 构造函数修正后,对象的name和quantity会被正确初始化,属性值不再为null或默认0。
- 添加
put操作后,对象成功存入Map,集合不再为空。 - 改用entrySet遍历Map,能直接获取每个键值对,避免了索引遍历HashMap的错误逻辑。
内容的提问来源于stack exchange,提问作者DazedandConfucius
相关产品推荐
相关产品推荐

