java中用一个int来表示多种属性(枚举的替代方法)
- 我们经常会有好多个枚举变量的值,如果用枚举来表示有点浪费资源,用基本类型相对于枚举会好点,但还是有点浪费资源
- int有四个字节,总共有32bit,用一个bit来代表一个属性的话,那一个int就可以表示32个属性,这比我们声明32个int去表示32个属性是不是节省了很多内存
- 那究竟该怎么利用一个int呢
- 比如你现在要标识篮子里的水果类型:苹果 梨 香蕉 葡萄四种
- 那么你可以这么设计,用int的最后一个字节来表示各种水果,其余3个字节都为0,因为都为0,就用最后一个字节来表示了
- 0000 0001 代表苹果,即0x01
- 0000 0010 代表梨,即0x02
- 0000 0100 代表香蕉,即0x04
- 0000 1000 代表葡萄,即0x08
- 0000 0000表示一个空篮子,想在你想往篮子放苹果,那么就执行按位或(|),0000 0000 | 0000 0001,得到篮子为0000 0001
- 再放进香蕉,执行按位或(|),0000 0001 | 0000 0100 现篮子为 0000 0101
- 此时篮子为0000 0101表示已经有两种水果了
- 现在你想知道篮子里有没有香蕉这种类型,那么就执行按位与(&),0000 0101 & 0000 0100,得到 0000 0100,这个值跟香蕉的定义是一样的,说明有香蕉
- 如果你想知道篮子里有没有葡萄,那么就执行按位与(&),0000 0101 & 0000 1000,得 0000 0000 ,结果与葡萄0000 1000并不符合,说明没有葡萄
- 如果想移除刚刚加入的香蕉,要先取反再按位与,0000 0101 & (~ 0000 0100)= 0000 0101 & 1111 1011 = 0000 0001 ,现在篮子变为 0000 0001,跟刚加入苹果时的一样了
- 伪代码如下
private int mFruitFlag = 0;
public static final int APPLE = 0X01;
public static final int PEAR = 0X02;
public static final int BANANA = 0X04;
public static final int GRAPE = 0X08;
public boolean hasAppleFlag(){
return mFruitFlag&APPLE==APPLE;
}
public void setAppleFlag(){
mFruitFlag|=APPLE;
}
public void removeAppleFlag(){
mFruitFlag&= (~APPLE);
}
- 经过上面的例子讲解,你应该知道,通过按位与,按位或,我们就能用一个int表示许许多多的类型,这样能大大节省内存空间