能否创建仅支持0、1、-1三个值的迷你int类以优化井字棋代码性能?
实现方案
Java 暂不支持自定义和原生int完全等价的基础数据类型,不过可以通过以下几种方案实现你的需求,兼顾空间占用和易用性:
方案1:直接使用byte数组(最贴合你的预期用法,性能最优)
三个取值0、1、-1刚好可以用1字节的原生byte类型存储,比32位int节省75%的空间,使用方式和你给出的示例完全一致,不需要额外自定义类:
public static final byte X = 1, O = -1, EMPTY = 0; byte[][] board = new byte[3][3]; board[0][0] = X; board[0][1] = O;
该方案没有任何额外对象开销,读写性能和原生int数组几乎一致,是井字棋场景的首选。
方案2:封装自定义值类型(类型安全,禁止非法取值)
如果你需要强类型校验,确保不会出现-1、0、1之外的取值,可以封装自定义类实现:
public final class MyDataType { // 预定义三个唯一实例,避免重复创建对象 public static final MyDataType EMPTY = new MyDataType((byte) 0); public static final MyDataType X = new MyDataType((byte) 1); public static final MyDataType O = new MyDataType((byte) -1); private final byte value; // 私有构造方法,禁止外部创建其他实例 private MyDataType(byte value) { this.value = value; } // 支持从int值转换 public static MyDataType fromInt(int val) { return switch (val) { case 0 -> EMPTY; case 1 -> X; case -1 -> O; default -> throw new IllegalArgumentException("仅支持-1、0、1三个取值"); }; } // 转换为int参与胜负计算 public int intValue() { return value; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; MyDataType that = (MyDataType) o; return value == that.value; } @Override public int hashCode() { return value; } @Override public String toString() { return String.valueOf(value); } }
使用方式:
MyDataType[][] board = new MyDataType[3][3]; board[0][0] = MyDataType.X; board[0][1] = MyDataType.O; board[0][2] = MyDataType.fromInt(0); // 胜负判断示例 int rowSum = board[0][0].intValue() + board[0][1].intValue() + board[0][2].intValue(); if (rowSum == 3) System.out.println("X获胜"); if (rowSum == -3) System.out.println("O获胜");
方案3:极致压缩方案(单个int存储整个棋盘)
如果追求极致空间占用,可以用2bit存储一个格子的状态,9个格子总共只需要18bit,单个int就能存下整个棋盘,适合需要批量存储大量棋盘状态的场景:
public class CompressedBoard { private int board = 0; // 取值规则:0=EMPTY, 1=X, 2=O(内部存储用2代替-1节省位运算开销) public int get(int row, int col) { int pos = (row * 3 + col) * 2; int storeVal = (board >> pos) & 0b11; return storeVal == 2 ? -1 : storeVal; } public void set(int row, int col, int val) { int pos = (row * 3 + col) * 2; int storeVal = val == -1 ? 2 : val; // 先清空对应位置的旧值,再写入新值 board &= ~(0b11 << pos); board |= (storeVal << pos); } }
内容的提问来源于stack exchange,提问作者user13278163
相关产品推荐
相关产品推荐

