1、基本数据类型:
类型 | 位数 | 占用存储空间 | 最大值 | 最小值 | 默认值 | 其他 |
---|---|---|---|---|---|---|
byte | 8 | 1字节 | 127(2^7-1) | -128(-2^7) | 0 | 有符号、二进制补码表示 |
short | 16 | 2字节 | 32767(2^15-1) | -32768(-2^15) | 0 | 有符号、二进制补码表示 |
int | 32 | 4字节 | 2^31-1 | -2^31 | 0 | 有符号、二进制补码表示 |
long | 64 | 8字节 | 2^63-1 | -2^63 | 0L(0l) | 有符号、二进制补码表示 |
float | 32 | 4字节 | 2^128-1 | 2^(-149) | 0.0f | 单精度、IEEE754标准 |
double | 64 | 8字节 | 2^1024-1 | 2^(-1074) | 0.0d | 双精度、IEEE754标准 |
char | 16 | 2字节 | \uffff(65535) | \u0000(0) | \u0000(0) | 单一的、Unicode字符 |
boolean | false | true或false |
在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。也就是说JVM规范指出boolean当做int处理,也就是4字节,boolean数组当做byte数组处理,这样我们可以得出boolean类型占了单独使用是4个字节,在数组中是确定的1个字节。
2、封装对象
基本数据类型 | 封装对象 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
Integer i = 100; //自动装箱,编译器执行Integer.valueOf(100)
int j = i; //自动拆箱,编译器执行i.intValue()
###由于自动拆装箱的存在,要注意i为null的情况
Integer i = null;
int j = i.intValue();
###编译通过,但运行时报错NullPointerException
Integer i1 =200;
Integer i2 =200;
System.out.println("i1==i2: "+(i1==i2));
Integer i3 =100;
Integer i4 =100;
System.out.println("i3==i4: "+(i3==i4));
###答案为:false,true
知识点:
1、首先,==和equals()的区别:
==比较的是两个对象的引用是否相同,或者是比较原始数据类型是否相等;
equals()比较的是两个对象的内容是否相同,可以通过重写equals添加自己的比较逻辑。
2、其次,-128~127的Integer值可以从缓存中取得,即Integer类型的常用数字缓存IntegerCache.cache。其他情况要重新创建。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
补充:
-
short s1=1; s1=s1+1;编译报错;
s1=s1+1返回结果是int类型(隐式类型转换),需强转;
s1=s1+=1无问题;(+=具有强转效果)
-
switch语句不能作用于浮点数类型中;
-
封装类型+String都是final的,不可被扩展,数字类型的公共父类是Number类;
public static void main(String[] args) throws Throwable {
int j=0;
for(int i=0;i<1000;i++) {
j=j++;
}
System.out.println(j);
}
答案为:0;
解析:从底层来看,j=j++是对局部变量的操作
1、将局部变量j的值存放到栈顶:0
2、将局部变量j的值加1,j=1
3、将栈顶的值j放到局部变量中,j=0
知识点:
1、隐式类型转换(自动类型转换):从存储范围小的类型到存储范围大的类型
byte→short(char)→int→long→float→double,虚拟机自动完成
2、显示类型转换(强制类型转换):从存储范围大的类型到存储范围小的类型
double→float→long→int→short(char)→byte,损失精度
public static void main(String[] args) {
int m = 1234;
byte b = (byte)m;
System.out.println(b);
}
答案为:-46
解析:整数强制转换为整数时取数字的低位,例如int类型的变量转换为byte类型时,则只取int类型的低8位(也就是最后一个字节)的值。b1的计算方法如下:m的值转换为二进制是10011010010,取该数字低8位的值作为b的值,则b的二进制值是11010010,按照机器数的规定,最高位是符号位,1代表负数,在计算机中负数存储的是补码,则该负数的原码是10101110,该值就是十进制的-46