Java中的自定义数据类型

时间:2010-08-16 05:09:19

标签: java

对于应用程序,我需要一个24位的无符号数据类型。 不幸的是,这种数据类型在Java中不可用。我打算将它作为一个新类实现。但我不确定这种实现的性能。

建议我自己上课吗?

如果可取,是否可以获得良好的表现?

2 个答案:

答案 0 :(得分:4)

据推测,你的意思是将它实现为一个使用更大数据类型和边界检查的类,如下所示:

public class Unsigned24 {
    private static final MAX_UNSIGNED24 = Math.pow(2, 24) - 1;
    private static final MIN_UNSIGNED24 = 0;

    private final int value;

    public Unsigned24(int value) {
        if (value > MAX_UNSIGNED24 || value < MIN_UNSIGNED24)
            throw new IllegalArgumentException("value out of bounds: " + value);
        this.value = value;
    }

    public int getValue() {
        return value;
    }

// ... other methods, such as equals(), comparison, addition, subtraction, etc.
}

这样可行,但可能不值得。此外,它实际上并不只占用24位内存,而是32加上对象的开销。

这实际上取决于你的目标。为什么要一个24位整数。

这只是因为你对这些值有限制吗?如果是这样,你可能想要做类似上面的事情。

是因为你有很多,想要节省内存吗?如果是这样,您可能希望构建一个抽象24位整数数组的类,并在内部将它们连续保存在字节数组中。

是否因为您正在与某些需要24位的硬件或网络接口连接?在这种情况下,您可能希望查看java.nio类。

答案 1 :(得分:3)

如果你想节省空间,你可以使用int进行计算,并将最不重要的3个字节映射到byte []或只是三个字节:

  public static byte[] convert(int i) {
    return new byte[]{ (i & 0xff0000) >> 16, (i & 0xff00) >> 8, (i & 0xff) };
  }

  public static int convert(byte[] b) {
    if (b == null && b.length != 3)
      throw new IllegalArgumentException();

      return (b[2] << 16) | (b[1] << 8) | b;
  }

(无法验证它是否没有错误,但至少应该提出一个想法)