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

能否创建仅支持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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:27:02