Byte
- 长度:1byte/8bit
- 最大值:127 0b0111_1111
- 最小值:-128 0b1000_0000
byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数。
1 在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。
2 正数的最高位都是 0 ,正数的值就是二进制表示的值。
3 负数的最高位都是 1 ,负数的值是 取反后加一 然后加个负号得到得值。
4 我们用8位的二进制来说明一下此规则:
比如:00000001。最高位是0 为正数 ,那么表示的就是 十进制的 1。
再比如:10000001.最高位是1 为负数,值是多少?取反得到 01111110 加1 得到 01111111 ,那么值为 -127
Short
- 长度:2byte/16bit
- 最大值: 2^15 32767 0x7fff 0b0111_1111_1111_1111
- 最小值:-2^15 -32768 0x8000 0b1000_0000_0000_0000
Integer
- 长度:4byte/32bit
- 最大值: 2^31 -21亿 0x7fffffff
- 最小值:-2^31 -21亿 0x80000000
Long
+长度:8byte/64bit
+最大值: 2^63 约9*10^18
- 最小值:-2^63
Float
- 长度:4byte/32bit
- 正最大值:0x7f7fffff,约3.4*10^38
- 正最小值:0x00000001,月1.4*10^(-45)
对于Float的equals方法,比较的是两个float值的二进制表示,因此+0.0f.equals(-0.0f)返回false,NaN.equals(NaN)返回true,这是FLoat与float不同的地方。 -
float f = 1.2报错:
image.png - 认为把一个双精度的值赋予一个单精度浮点数。这种情况下,java不会为我们自动转换,只会报错提醒。
- float在计算机内部一般用32位二进制表示,而double用64位表示,相对精度更高。至于报错错,是由于java默认浮点类型字面量为double类型,所以需要做个强制类型转换
Double
- 长度:8byte/64bit
- 正最大值:1.8*10^308
- 正最小值:4.9*10^(-304)
float 和double 主要区别
- 01.在内存中占有的字节数不同
单精度浮点数在机内存占4个字节
双精度浮点数在机内存占8个字节 - 02.有效数字位数不同
单精度浮点数有效数字8位
双精度浮点数有效数字16位 - 03.数值取值范围
单精度浮点数的表示范围:-3.40E+38~3.40E+38
双精度浮点数的表示范围:-1.79E+308~-1.79E+308 - 04.在程序中处理速度不同
一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快
如果不声明,默认小数为double类型,所以如果要用float的话,必须进行强转。
new Integer(1) 与 Integer.valueOf(1) 区别
- new Integer(1) :会新建一个对象;
- Integer.valueOf(1) :使用对象池中的对象,如果多次调用,会取得同一个对象的引用。
- Integer i = 1 等同于 Integer.valueOf(1)
对象池机制
为了提高性能,Java 在 1.5 以后针对八种基本类型的包装类,提供了和 String 类一样的对象池机制;
让我们看一下 Integer.valueOf(int i) 的源码,就很容易理解了:
public final class Integer extends Number implements Comparable<Integer> {
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (IntegerCache.low)];
return new Integer(i);
}}
基本类型对应的缓冲池
Boolean:true , false
Short, Int, Long:-128 ~ 127
Byte, Character : \u0000 到 \u007F,也就是 0 ~ 127
网友评论