Java打印自定义对象数组仅输出类名@哈希值无法显示元素内容问题
问题场景
在Eclipse开发环境中使用JSwing与JAVA-WS搭建带GUI界面的库存管理系统,将哈希结构存储的库存数据转换为InventoryItem数组时遇到阻碍,非Java领域资深开发者,寻求解决方案。
对应实现代码
数组转换方法代码如下:
@Override public InventoryItem [] getAllInventoryItem() { ArrayList<InventoryItem> items = new ArrayList<InventoryItem>(); InventoryItem item=null; for(Map.Entry<String, InventoryItem> e : inventories.entrySet()) { item=new InventoryItem(); item.setBrand(e.getValue().getBrand()); item.setCode(e.getKey()); item.setName(e.getValue().getName()); items.setPrice(e.getValue().getPrice()); items.add(item); } return (InventoryItem []) items.toArray(new InventoryItem[items.size()]); }
异常现象
- 直接调用方法打印数组,代码:
System.out.println((inventory.getAllInventoryItem()));
控制台输出:
[Lcom.lansang.inventory.fx.InventoryItem;@123772c4
- 改用
Arrays.toString()打印数组,代码:
System.out.println((Arrays.toString(inventory.getAllInventoryItem())));
仍无法获取数组内元素实际内容,输出:
[com.lansang.inventory.fx.InventoryItem@123772c4, com.lansang.inventory.fx.InventoryItem@2d363fb3]
问题修复方案
- 首先修正代码里的笔误:循环内
items.setPrice(e.getValue().getPrice());写法错误,items是ArrayList集合实例,不存在setPrice方法,这里是要给当前新建的item对象赋值价格,应改为item.setPrice(e.getValue().getPrice());,否则代码无法正常编译运行。 - 打印看不到元素内容的核心原因:Java中所有类默认继承
Object类,直接打印对象时会调用Object默认实现的toString()方法,返回格式固定为类全路径名@对象内存哈希值,和你哈希转数组的逻辑没有关系,数组本身已经正确装载了库存数据。 - 要打印出元素实际内容,只需在
InventoryItem类中重写toString()方法,自定义要展示的字段内容即可,参考实现:
// 将该方法写入InventoryItem类内部 @Override public String toString() { return "库存商品{" + "商品编码='" + code + '\'' + ", 商品名称='" + name + '\'' + ", 品牌='" + brand + '\'' + ", 价格=" + price + '}'; }
- 额外优化:方法末尾返回数组时的强转
(InventoryItem [])是多余代码,items.toArray(new InventoryItem[items.size()])本身就会返回InventoryItem[]类型的数组,不需要额外强制类型转换。
内容的提问来源于stack exchange,提问作者Ckxsl023
相关产品推荐
相关产品推荐

