JAVA面试基础易错总结题

傷城~ 2022-06-02 05:50 339阅读 0赞

1.Java类型提升:

  1. int x=3;
  2. byte b=4;
  3. x=x+b;

运算的时候,自动把byte b值补为32位。

然后与x进行运算。(int是4个字节,byte是一个字节)

2.Java强制类型转换

丢失精度

  1. int x=3;
  2. byte b=4;
  3. b=(byte)(b+x);

b+x是int型。
3.区别(重要,容易错)

  1. byte b=4;
  2. byte b1=3;
  3. byte b2=7;
  4. b=b1+b2;

上面这段代码编译通不过,会报错。

但是:

  1. int x=4;
  2. int x1=2;
  3. int x2=Interger.MAX_VALUE;
  4. x=x1+x2;

编译可以通过,且x值为-21…..

原因是:

int是编译器默认类型,内部会自动计算完之后底层有保存过程,默认保留32位。

但是byte不是默认类型,编译的时候不知道b1和b2到底值是多少,系统认为可能会超出范围,所以会报错。
4.任何数据类型与字符串类型相加,都是做连接。

  1. System.out.println(3+"2");

输出的是32

  1. System.out.println("5+5"+5+5)

输出为5+5=55

5.

  1. int i=3;
  2. int b;
  3. b=i++

那么b=3;

若:

  1. int i=3;
  2. int b;
  3. b=++i;

那么b=4

若:

  1. int i=3;
  2. i=i++;

那么i=3.

上面其实第一、第三个例子是一个机制,以第一个例子为例,运算机制如下:

  1. temp = i;
  2. i=i+1;//i++
  3. b=temp//

i++的话要首先保留i初值到临时变量temp中,然后自增,最后要把临时变量最后做赋值运算。

而对先增运算++i来说比较简单(第二个例子),不需要有临时变量,只需要先自增,然后自增之后赋值就可以了。
4.

  1. short b=3;
  2. b+=2;

编译通过,但是若:

  1. short b=3;
  2. b=b+2;

b编译通不过。也就是说b+=2和b=b+2虽然结果一样,但是内部机制不完全一样的。

原因:short是两个字节。+=:也是一种赋值运算符,底层对这一个运算符会有一个检查和强制转换过程。不用显式做强转。

而对于b=b+2:2是int型,b+2是变量,类型提升为int,int是4个字节,比short大,当再赋值给b的时候,是个变量,无法确定大小,又没有做类型转换,就会编译出错。改成(short)(b+2)才可以。

而short b=2为什么可以呢,因为2是个确定的int常量,常量赋值给一个较小的空间时会自动强制类型转换变为较小的空间。

5.&和&&的区别:

两者的结果是相同的,但是运算有点不一样。

&:无论左边运算结果是什么,右边都参与运算。
&&:当左边为假时,右边是不参与运算的。当左边为真时,还要继续计算右边。

同理,或运算|和||也是一样的。

|:无论左边运算结果是什么,右边都参与运算。
||:当左边为真时,右边是不参与运算的。当左边为真时,还要继续计算右边。

上面是针对布尔型的。&,| 还表示位运算:

6&3=2

即0110&0011=010(0就是假,1就是真)

异或:不同为1.一个数a异或b之后再异或b,结果仍为a.

6.>>和>>>的区别:

:对于高位出现的空位,原来高位是什么就补什么。(相当于除以2的几次幂)

无符号右移:无论原高位是什么,都拿零补。

7.最有效率的方式算2乘以8等于几?

8.对两个整数值进行互换,不需要第三方变量?

  1. int a=3;
  2. int b=4;
  3. a=a+b;
  4. b=a-b;
  5. a=a-b;

这种方法有个缺陷,当a,b太大时,求和容易造成损失精度。
下面这种方法可以使用:(这种方式适合面试时候使用)

  1. a=a^b;
  2. b=a^b;
  3. a=a^b;

但是在开发的时候一般还是用第三方变量的,因为阅读性强。

  1. c=a;
  2. a=b;
  3. b=c;

9.Java当中唯一的三元运算符: ?:
(条件表达式)?表达式1:表达式2

应用:获取两个整数中较大的整数。

  1. int a=4;
  2. int b=5;
  3. int max=a>b?a:b

10.局部代码块{}可以定义局部变量的生命周期。

11.选择语句switch,语c++中switch的用法有点区别:

switch(x)//x的类型为short,int byte,char型。

无论default在哪里,如果没有break,就仍然是从case开始,把case按顺序读完再读default.

switch的结束标志是碰到break或者大括号。

如果没有break,会继续向下执行,将能执行的语句都执行,直到碰到break或大括号。

即java中如果switch的case语句中少写了break;这个关键字,在编译的时候并没有报错
          但是在执行的时候会一直执行所有case条件下的语句并不是去判断,所以会一直执行直到遇到break关键字跳出或者一直执行到defaut语句。
          还有就是如果在switch表达的结果在case中没话swithc就会从default执行,这是与C#不同的地方。

例子:

  1. public class TestSwitchCase {
  2. public static void main(String[] args){
  3. byte a = 5;
  4. switch(a){
  5. default: System.out.println(" default ");
  6. case 1 : System.out.println(" A ");
  7. case 2 : System.out.println(" B ");
  8. case 3 : System.out.println(" C ");
  9. break;
  10. case 4 : System.out.println(" D ");
  11. }
  12. }
  13. }

输出:

default
A
B
C

原因是:进入switch语句之后首先执行case语句,发现条件都不符合,因此执行default语句,但是default语句中并没有break.因此这之后会跳过所有的case条件判断,直接执行case中的语句,直到遇到break结束。

12.switch和if的区别:

if:(1)只对布尔型进行判断

(2)对区间判断
switch:(1)对具体的值进行判断

(2)值的个数是固定的,有限的

13.三种循环语句:while,do while,for

for(初始表达式;条件表达式(布尔型);循环后表达式)

while(条件表达式)

无限循环表达式:while(true) 或for(;;)

14.函数的重载指的是:

函数名相同,在同一个类中,参数类型或参数个数不同,与返回值类型无关。

15.JAVA在内存管理这一块优于C++,有垃圾回收机制;而C++要程序员自己去收,用析构函数。

发表评论

表情:
评论列表 (有 0 条评论,339人围观)

还没有评论,来说两句吧...

相关阅读