虽然本文很简单,但是,这是基础必备的内容。其实内容也很好记,可是时间久了就容易忘记,所以还是有必要记录一下。
1、基本数据类型及其大小
基本类型 | 大小 | 包装类 |
---|---|---|
boolean | - | Boolean |
char | 2 | Character |
byte | 1 | Byte |
short | 2 | Short |
int | 4 | Integer |
float | 1 | Float |
long | 8 | Long |
double | 8 | Double |
补充:boolean类型
1、1个bit
理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。
2、1个字节
理由是虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。
3、4个字节
理由来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。
显然第三条是更准确的说法,那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。大多数人都会很自然的这样去想,我同样也有这个疑问,经过查阅资料发现,使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。
最后的总结:
根据http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html官方文档的描述:
boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.
布尔类型:布尔数据类型只有两个可能的值:真和假。使用此数据类型为跟踪真/假条件的简单标记。这种数据类型就表示这一点信息,但是它的“大小”并不是精确定义的。
可以看出,boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。这其实是运算效率和存储空间之间的博弈,两者都非常的重要。
2、Math类相关函数
double floor(double a);
表示向下取整,即小于等于a的最大整数,虽然返回类型是double型,但是表示的还是个int数据,因此需要强制类型转换为int。例如:Math.floor(1.5) = 1,Math.floor(-1.5) = -2。原理很简单,但是如果你觉得很容易记混,不妨用数轴来记忆:
-2 -1.5 -1 -0.5 0 0.5 1 1.5
-------|------|------|-----|----|-----|-----|
从数轴上面就可以看出,不超过1.5的整数是1,不超过-1.5的整数是-2
long round(double a)
就是小学中数学学的四舍五入,内部的实现为:Math.floor(x+0.5),即将原来的数+0.5,再取不超过这个数的最大整数。例如:Math.round(-1.5) = -1,Math.round(1.55) = 2,同样,我们可以借助上面的数轴来记忆,-1.5+0.5 = -1,因此-1.5的round值就是-1.
double ceil(double a)
表示向上取整,即大于等于a的最小整数,与floor概念相反。例如:Math.ceil(1.5) = 2,Math.ceil(-1.5) = -1.
double random()
产生随机数,随机数范围为[0,1)如果需要生成指定范围的随机数代码可以如下:
public static double random(double min, double max){
double r = Math.random;
return min+(max-min)*r;
}