您的当前位置:首页正文

java中用一个int来表示多种属性(枚举的替代方法)

2024-11-26 来源:个人技术集锦

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;//或者1<<0
public static final int PEAR = 0X02;//或者1<<1
public static final int BANANA = 0X04;//或者1<<2
public static final int GRAPE = 0X08;//或者1<<3
//判断是否有苹果标志
public boolean hasAppleFlag(){
	return mFruitFlag&APPLE==APPLE;
}
//设置苹果标志,调用多次也无妨
public void setAppleFlag(){
	mFruitFlag|=APPLE;
}
//移除苹果标志,调用多次也无妨
public void removeAppleFlag(){
	mFruitFlag&= (~APPLE);
}
//其余类推
  • 经过上面的例子讲解,你应该知道,通过按位与,按位或,我们就能用一个int表示许许多多的类型,这样能大大节省内存空间
显示全文