标签归档:Java

java中不同数据类型的内存分配方式

首先,在java中一共有两种数据类型,基本类型(primitive types)和引用类型(reference types)。

基本类型
java中的基本类型一共有八种,即byte, int, short, long, float, double, boolean, char。这些类型所申明的变量都是字面值,比如int a = 1,也就是说变量a指向的是1这个值,并没有对象和引用。值得注意的是,为了提高存储的速度,基本类型的变量内存都是存储在栈中的,而栈中的数据是是可以共享的。因此当我们同时声明两个同样字面值的变量时,编译器只会分配同一块内存。这个过程就是先在栈中查找是否存在这样的字面值,如果有则指向那块内存,如果没有就新分配一块内存。因此如果两个变量同时指向一个值,比如:int a = 1;int b = 2;当a的值被改变的时候,b的值并不会被改变,正如前面所说,a的值被改变时会重新去分配一块内存。
引用类型
主要包括一些对基本类型进行封装的类(又称为包装类),比如String,Integer,Double等,还有一些自定义的类。自定义类一般是显式的使用new关键字来告[……]

继续阅读

Java位操作符的一种简单应用

几乎每种语言都会有位操作符,左移右移、“与”“非”、“或”、“异或”等,这些操作符的意义大家肯定都知道,但是你可曾想过这些位操作符有什么实际的使用价值吗?今天来说下位操作符的一种简单应用。

在游戏开发工作中最常遇到的是对玩家状态的记录,比如奖励是否已经领取过,页面是否是否打开过等等。如果有连续的状态需要记录则他的形式大致是这样的:0100011,0表示没有,1表示有。最常见的做法是DB里使用一个varchar字段用来存储这样的状态:0100011。每次变更的时候找到那一位的状态,然后改下就好了,很直观。但其实我们也可以使用int类型来存储这种连续的状态,一个整数怎么能表示那么多的状态呢?答案是把十进制整数转换为二进制,然后通过位操作符去变更每一位二进制的状态。

问题:给定一个整数a,我们要改变她所表示的二进制的第n位的值为1。

首先构造一个特殊的二进制数,这个数第n位为1,其余都是0。代码表示就是:

int base= (int)Math.pow(2, n-1);

那如果我要改变第n位的值为1,只要将a|base即可。因为base的第n位是1,而其他位都是0,所以“或”之后第n位只能是1,而其他[……]

继续阅读