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

Java中如何动态填充引用类型数组并避免内存浪费?

关于Java对象数组初始化的问题解答

首先纠正你的核心误解:对象数组存储的是对象引用,而非对象本身。你写的new Card[SPADES][KING]并没有创建52个Card对象,只是创建了一个能容纳52个Card类型引用的二维数组容器——每个位置默认值是null,占用的内存仅为52个引用的空间(64位JVM下每个引用约8字节,总共才416字节),完全不存在内存浪费的问题。

你之前的代码抛出NullPointerException,本质是只声明了数组变量Card[][] deck;,但未初始化数组本身,此时deck是null,自然无法访问deck[i][j]。另外你的循环代码还有语法错误:内层循环的变量名和外层重复使用了i,应该改为j,否则会编译报错。

正确的实现代码应该是这样:

// 先初始化数组,确定存储引用的容器大小
Card[][] deck = new Card[SPADES][KING];

// 循环创建Card对象,并将引用存入数组对应位置
for(int i = DIAMONDS; i <= SPADES; ++i) {
   for(int j = ACE; j <= KING; ++j) {
        deck[i][j] = new Card(i, j);
   }
}

这段逻辑完全合理:先创建存放引用的数组容器,再逐个创建Card对象并把引用存入数组对应位置。整个过程中仅会创建52个Card对象,数组本身只是负责存储这些对象的引用,没有多余的内存消耗。

如果确实不想提前固定数组大小,也可以用List集合动态存储,比如List<List<Card>> deck = new ArrayList<>();,再逐层添加花色列表和Card对象,但对于扑克牌这种固定数量的场景,数组反而更高效、更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:10:18