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

java中的类型化int和位域打包,java,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; } 点的类型很好,编译器将其作为int基元类型传递,这非常有效。在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;
}
点的类型很好,编译器将其作为int基元类型传递,这非常有效。在java中,可以使用类来包含点,然后编写:

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

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

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

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

见以下问题/答案:

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

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

增加

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

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

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


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

我以x-y点为例,但实际上我已经将其转换为一个整数。游戏板是10x10,所以只需要100点。但是还有另外两个被大量使用的类:Move和ValueMove。Movex,y有100*100个可能的值,这些值也可以放入int。因此,使用缓存,我可以通过使用10000个元素的数组将Move保留为类,并让getMovex,y索引数组并返回Move。ValueMove是一个Move和一个int值。这可能包含在长期使用的包装操作中。ValueMove对于缓存的概念来说有点太大了。缓存不必提供所有可能的值。只是最常用的。GC速度很慢。然后,我保留了移动之间的转置表,而不是在每次移动之前清除,因为这些数据中的一些通常可以重用。现在,所有的移动对象都会一直持续到第一次碰撞,这可能需要一段时间,甚至几分钟。这让它变得非常慢。听起来你想要积累的可变移动对象。
/**
 * 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);
  }
}