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
相关产品推荐
相关产品推荐

