Java有哪些数据类型?
Java语言数据类型分为两种:基本数据类型和引用数据类型。
Java基本数据类型范围和默认值:
需要注意一下,对于布尔类型:
如果 boolean 是单独使用(在编译之后使用 Java 虚拟机中的 int 数据类型来代替),则占 4 个字节;
如果 boolean 是以“boolean数组”的形式使用,则占 1 个字节(不过 Java 规范对 boolean 占用的内存空间没有明确的规定,不同的 JVM 有不同的实现机制)。
自动类型转换、 强制类型转换? 看看这几行代码?
Java 所有的数值型变量可以相互转换,当把一个表数范围小的数值或变量直接赋给另一个表数范围大的变量时,可以进行自动类型转换;反之,需要强制转换。
这就好像,小杯里的水倒进大杯没问题,但大杯的水倒进小杯就不行了,可能会溢出。
float f = 3.4; // 对吗?
不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型,会造成精度损失。
正确写法:
float f = (float)3.4; // 写法1
float f = 3.4F;
// 对吗?
short s1 = 1;
s1 = s1 + 1;
这会编译出错,因为1是int类型,而s1 + 1运算结果是int类型,要把这个结果赋值给左侧的short类型,这属于向下转型。向下转型并不是默认的,因此需要显示地强制类型转换:
short s1 = 1;
s1 = (short) (s1 + 1);
// 对吗?
short s1 = 1;
s1 += 1;
可以正确编译,因为s1 += 1
其实就相当于s1 = (short) (s1 + 1)
,这其中就有隐含的强制类型转换。
什么是自动拆箱/封箱?
- 装箱 :将基本数据类型用它们对应的引用类型包装起来;
- 拆箱 :将包装类型转换为基本数据类型;
Java可以自动对基本数据类型和它们的包装类进行装箱和拆箱。
举个栗子:
Integer i = 10; // 装箱
int n = i; // 拆箱
说说自增自减运算? 看下这几个代码运行结果?
++和--运算符可以放在变量之前,也可以放在变量之后。
当运算符放在变量之前时(前缀),先自增/减,再赋值;
当运算符放在变量之后时(后缀),先赋值,再自增/减。
例如,当 b = ++a 时,先自增(自己增加 1),再赋值(赋值给 b);当 b = a++ 时,先赋值(赋值给 b),再自增(自己增加 1)。也就是,++a 输出的是 a+1 的值,a++输出的是 a 值。
看一下这段代码运行结果?
int i = 1;
i = i++;
System.out.println(i); // 输出结果是1
对于JVM而言,它对自增运算的处理,是会先定义一个临时变量来接收i的值,然后进行自增运算,最后又将临时变量赋给了值为2的i,所以最后的结果为1。
相当于这样的代码:
int i = 1;
int temp = i;
i++;
i = temp;
System.out.println(i);
这段代码会输出什么?
int count = 0;
for(int i = 0; i < 100; i++) {
count = count++;
}
System.out.println("count = " + count); // 输出结果是0
相当于这样的代码:
int count = 0;
int temp = count;
count++;
count = temp;
System.out.println(count);