基础语法
1、Java 有哪些基本数据类型?
如图所示:
表格总结:
数据类型 |
内存大小 |
默认值 |
取值范围 |
byte |
1 B |
(byte)0 |
-128 ~ 127 |
short |
2 B |
(short)0 |
-215 ~ 215-1 |
int |
4 B |
0 |
-231 ~ 231-1 |
long |
8 B |
0L |
-263 ~ 263-1 |
float |
4 B |
0.0F |
±3.4E+38(有效位数 6~7 位) |
double |
8 B |
0.0D |
±1.7E+308(有效位数 15 位) |
char |
英文 1B,中文 UTF-8 占 3B,GBK 占 2B。 |
'\u0000' |
'\u0000' ~ '\uFFFF' |
boolean |
单个变量 4B / 数组 1B |
false |
true、false |
注意:JVM 没有 boolean 赋值的专用字节码指令,boolean f = false
就是使用 ICONST_0 即常数 0 赋值。单个 boolean 变量用 int 代替,boolean 数组会编码成 byte 数组。
2、自动类型转换、强制类型转换?看看这几行代码?
Java 所有的数值型变量可以相互转换,当把一个表数范围小的数值或变量直接赋给另一个表数范围大的变量时,可以进行自动类型转换;反之,需要强制转换。
这就好像,小杯里的水倒进大杯没问题,但大杯的水倒进小杯就不行了,可能会溢出。
float f=3.4,对吗?
- 不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4 或者写成float f =3.4F。
short s1 = 1; s1 = s1 + 1;对吗?short s1 = 1; s1 += 1;对吗?
- 对于 short s1 = 1; s1 = s1 + 1;编译出错,由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。
- 而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。
3、自动装箱/拆箱是什么?
每个基本数据类型都对应一个包装类,除了 int 和 char 对应 Integer 和 Character 外,其余基本数据类型的包装类都是首字母大写即可。
自动装箱: 将基本数据类型包装为一个包装类对象,例如向一个泛型为 Integer 的集合添加 int 元素。
自动拆箱: 将一个包装类对象转换为一个基本数据类型,例如将一个包装类对象赋值给一个基本数据类型的变量。
比较两个包装类数值要用 equals
,而不能用 ==
。Java可以自动对基本数据类型和它们的包装类进行装箱和拆箱。
4、break ,continue ,return 的区别及作用?
- break 跳出整个循环,不再执行循环(结束当前的循环体)
- continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
- return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)
5、说说自增自减运算?看下这几个代码运行结果?
++和--运算符可以放在变量之前,也可以放在变量之后。
当运算符放在变量之前时(前缀),先自增/减,再赋值;当运算符放在变量之后时(后缀),先赋值,再自增/减。
例如,当 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。
和上面的题目一样的道理,同样是用了临时变量,count实际是等于临时变量的值。
6、为什么Integer a=100,b=100时候a==b返回true,而Integer c=1000,d=1000时候c==d返回false?
Integer a=100
实际上是执行了Integer i = Integer.valueOf(100)
的操作,Integer
类型的范围是-128~127
,当满足条件时会放入缓存空间中。- 而
c=1000
不在-128~127
的范围内,则会开辟新的内存地址。所以c==d
返回为false
。
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
7、用最有效率的方法计算2乘以8?
2<<3,位运算,数字的二进制位左移三位相当于乘以2的三次方。
8、&和&&区别,||与|的区别?
- &&与&区别:两者都表示“与”运算,但是&&运算符第一个表达式不成立的话,后面的表达式不运算,直接返回。而&对所有表达式都得判断。
- || 与|区别:两者都表示“或”运算,但是||运算符第一个表达式成立的话,后面的表达式不运算,直接返回。而|对所有表达式都得判断。