有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的类型化int和位域打包

这与Implementing a C style bitfield in Java基本上是同一个问题。但是,有没有一种方法可以在不使用类的情况下以类型化的方式实现这一点呢?例如,下面是一些“C”代码:

typedef struct
{
    unsigned int x: 8;
    unsigned int y: 8;
} point;

point getPoint()
{
    point p;
    p.x = 1;
    p.y = 2;
    return p;
}

“point”类型很好,编译器将其作为int基元类型传递,这非常有效。在java中,可以使用类来包含点,然后编写:

point getPoint()
{
    return new point(1,2);
}

我正在尝试改进一个使用类“点”(以及其他简单类)的高度递归java游戏程序,因此jvm正在执行大量新操作,并在垃圾收集方面花费大量时间。将类“point”更改为压缩int可能有帮助,也可能没有帮助,但值得一试。但是我希望在程序中使用一个好的类型“point”,而不是在我使用point的任何地方都声明“int”


共 (3) 个答案

  1. # 1 楼答案

    jvm正在执行无数的新操作,并在垃圾收集方面花费了大量时间

    有多少个不同的点?也许值得对点进行缓存并重用它们,这样您就可以只创建所需的几个点,而不必进行垃圾收集

    点应该是一个值对象,所以只要x和y坐标相同,返回点的哪个实例就不重要

  2. # 2 楼答案

    如果你问同样的问题,你肯定会得到同样的答案。没有

    在Java中,除了手动操作之外,没有其他方法可以做到这一点。您可以定义一个长值并在其中移位/屏蔽两个整数。或者你可以有一个int并在那里存储两条短裤。但是设置/获取这些值需要进行一些移动和掩蔽

    见以下问题/答案: Packing two shorts into one int, dealing with negative and positive

  3. # 3 楼答案

    在Java中,让你感到震惊的通常不是对象的大小,而是你抓住它的时间。然而,在某些情况下,您可能会寻找一个可变的int

    /**
     * Mutable integer.
     */
    public class Mint {
      private int i = 0;
    
      public Mint () {
      }
    
      public Mint (int i) {
        this.i = i;
      }
    
      /**
       * @return the i
       */
      public int get() {
        return i;
      }
    
      /**
       * @param i the i to set
       */
      public int set(int i) {
        this.i = i;
        return i;
      }
    
      public int add ( int i ) {
        this.i += i;
        return i;
      }
    
      public int sub ( int i ) {
        this.i -= i;
        return i;
      }
    
      public int mul ( int i ) {
        this.i *= i;
        return i;
      }
    
      public int div ( int i ) {
        this.i /= i;
        return i;
      }
    
      public int mod ( int i ) {
        this.i %= i;
        return i;
      }
    
      @Override
      public String toString () {
        return Integer.toString(i);
      }
    }
    

    在使用可变项时请非常小心——有一个很好的理由说明为什么使类不可变是一个好主意

    已添加

    在进一步阅读您的问题时,这对您可能没有Point对象阻塞您的系统那么有效。也许您应该改为使Point对象可变