你有信仰就年轻,疑惑就年老;有自信就年轻,畏惧就年老;有希望就年轻,绝望就年老;岁月使你皮肤起皱,但是失去了热忱,就损伤了灵魂。
1.基本数据类型
类型 | 位 | 取值范围 | 默认值 |
---|---|---|---|
byte | 8 | -2^7 ~ 2^7-1 | 0 |
char | 16 | \u0000 ~ \uffff | \u0000(Unicode编码) |
short | 16 | -2^15 ~ 2^15-1 | 0 |
int | 32 | -2^31 ~ 2^31-1 | 0 |
float | 32 | 3.4e-45~1.4e38 | 0.0f |
long | 64 | -2^7 ~ 2^7-1 | 0 |
double | 64 | 4.9e-324~1.8e308 | 0.0d |
boolean | – | true、false | false |
Tip1:boolean只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。
在JVM中:
boolean被int替代,使用 1 来表示 true,0 表示 false。
boolean数组被byte数组替代。
同样,在JVM中short、char、boolean、byte在内存中都以int形式处理;float则以double形式处理。
Tip2:Java字符采用Unicode编码,因此一个字符占2个字节,即16位,因此char类型可以用来保存一个汉字:char ch = ‘中’;
2.基本数据类型的字面值
class LiteralTest{
public static void main(String[] args) {
byte b1 = 127; // ok
byte b2 = 128; // 编译报错 Incompatible types.
short s1 = 32767; // ok
short s2 = 32768; //编译报错 Incompatible types.
float f1 = 1.2; // 编译报错 Incompatible types.
}
}
-
对于整数的字面值:若字面量的值超出了变量数据类型所能表示的范围,就会报错。
-
对于浮点类型的字面值:浮点类型的字面值就是double类型的。
因此,上述报错的代码,都可以通过强制类型转化来解决,但是可能存在精度损失。
byte b2 = (byte)128;
short s2 = (short)32768;
// 对于 float,既可以强制类型转化,也可以在数值后加f
float f1 = (float)1.2;
float f1 = 1.2f;
大的数据类型(位数多的)向小数据类型(位数少的)进行强制类型转换,存在数据截断。
byte b = (byte)-129; // 原码:1 10000001 求补码==》 1 01111111
System.out.println(b); // 截取 8bit: 0 1111111 ==》 127
由于数据在计算机中都以二进制补码形式存放,因此-129在计算机中的表示为 1 01111111 ,byte只有8bit,因此高位1被丢弃,截取后为:0 1111111,0 作为符号位,数值位1111111,正数原码和补码相同,所以会打印127。
3.数据类型转换
- 实线箭头:由低字节向高字节自动转换,无数据丢失
- 虚线箭头:将容纳的信息多的数据类型转换成更小容量的数据类型,转换可能有精度丢失,需强制类型转换
4.包装类型
byte —> Byte
short —> Short
int —> Integer
long —> Long
float —> Float
double —> Double
boolean —> Boolean
Tip:包装类型被final修饰,不可被继承。
JDK1.5新特性:自动拆装箱,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
Integer x = 2; // 装箱 调用了 Integer.valueOf(2)
int y = x; // 拆箱 调用了 X.intValue()
5.缓存池
Java基本数据类型的包装类型实现了缓存池的有:
- Boolean :true 和 false
- Byte : All byte value
- Short : -128~127
- Integer : -128~127
- Character : \u0000 ~ \u007F(0-127)
在valueOf方法中,会先判断值是否在缓存池中存在,若存在则会使用缓存池中的对象,否则才会new一个对象。
Integer x = Integer.valueOf(123);
Integer y = Integer.valueOf(123);
System.out.println(x == y); // true x和y都是来自缓存池中的对象的引用
Tip: 在JDK1.8中,Integer的缓存池IntegerCache上界默认为127,下界为-128,但是上界是可调的,在启动JVM时,可通过 -XX:AutoBoxCacheMax= < size > 来指定上界大小。