这与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;
}
"点"很好地输入,编译器将其作为int基本类型传递,这是非常有效的。在java中,可以使用一个类来包含该点,然后编写:
point getPoint()
{
return new point(1,2);
}
我正在尝试改进一个使用类"点"的重度递归java游戏程序。 (以及其他简单的类)因此jvm正在进行数以万计的新操作并在垃圾收集中花费了大量时间。改变班级"指向"进入一个打包int可能会或可能没有帮助,但它值得一试。但我希望有一个好的类型"点"在程序中使用而不仅仅是声明" int"无处不在我用点。
答案 0 :(得分:0)
如果你问同样的问题,你一定得到同样的答案。否。
没有办法做到这一点是Java,除了手动执行。你可以在那里定义一个long值并移动/掩盖两个int。或者你可以有一个int并在那里存储两条短裤。但是设置/获取值需要进行一些移动和屏蔽。
看到这个问题/答案: Packing two shorts into one int, dealing with negative and positive
答案 1 :(得分:0)
在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);
}
}
使用mutable时要非常小心 - 有一个很好的理由让类不可变是一个好主意。
<强>加强>
在进一步阅读您的问题时,这可能对您没有效果,因为您的Point
对象会堵塞您的系统。也许你应该让你的Point
对象变得可变。
答案 2 :(得分:0)
jvm正在进行数以万计的新操作,并在垃圾收集方面花费了大量时间。
有多少个不同的点?也许它值得缓存积分并重复使用它们,所以你只需要创建你需要的几个点,而不是垃圾收集。
Point应该是一个值对象,因此只要x和y坐标相同,就不应该返回Point的哪个实例。