Java面试高频八股文

发布时间 2023-12-05 15:36:27作者: Avava_Ava

一、Java基础(一)

1. 面向对象和面向过程的区别

面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题;

面向对象会先抽象出对象,然后用对象执行方法的方式解决问题;

面向对象开发的程序一般更易维护、易复用、易扩展;

 

 

 

 

2.基本类型与包装类

①Java 中的几种基本数据类型了解么?

Java 中有 8 种基本数据类型,分别为:

  • 6 种数字类型:
    • 4 种整数型:byteshortintlong
    • 2 种浮点型:floatdouble
  • 1 种字符类型:char
  • 1 种布尔型:boolean

 

为什么像 byteshortintlong能表示的最大正数都减 1 了?

因为在计算机中以二进制补码来表示整型,其中首位是用来作为符号位的,0表示正数,1表示负数,

当符号位为0,数值位也全为0时表示0,而当符号位为1时,数值位全为0时表示-2^n,所以0开头的正数有一个用来表示0了,所以比负数少了一个;

 

 

②基本数据类型和包装类型的区别

Ⅰ. 用途不同:包装类型可以用于泛型,而基本数据类型不可以;

Ⅱ. 占用空间不同:基本数据类型占用空间比包装类型小;

Ⅲ. 比较方式不同:基本数据类型用==比较的是值,而包装类型比较的是对象的内存地址,要想比较包装类型的值应当用equals()方法;

Ⅳ. 默认值不同:基本数据类型中数值的默认值是0,boolean连续的默认值是false,而包装类型属于引用类型,默认值是null;

 

 

③包装类型的缓存机制/常量池技术了解吗?

包装类型的常量池技术指的是Byte、Short、Integer、Long这四种整型的包装类默认创建了[-128, 127]的缓存数据,Character创建了数值在[0, 127]的缓存数据,Boolean直接返回TURE或FALSE,

对于在上述范围内的包装类型,会直接从缓存中返回对应的对象,无需创建新的对象,只有在超出范围或是手动new一个对象时,才会创建新的对象;

 

 

④自动装箱与拆箱了解吗?原理是什么?

自动拆装箱是一种语法糖,

其中自动装箱指的是将基本数据类型转换成对应的包装类型,实际上是调用了对应包装类型的静态方法Xxx.valueOf(),例如Integer a = Integer.valueOf(1)

自动拆箱指的是将包装类型转换成对应的基本数据类型,实际上是调用了包装类型的xxxValue()方法,例如Integer a = 1;  int b = a.intValue();

 

 

⑤了解自动拆箱引发的NPE(Null Pointer Error 空指针异常)问题吗?

因为自动拆箱实际上就是调用了包装类型的xxxValue()比如intValue()方法,所以当调用者为null时,就会引发空指针异常,

比如在三目运算符中,当一个表达式为基本数据类型,另一个为包装类型时,就会触发自动拆箱,此时若包装类型为空,就会触发空指针异常,

解决办法是尽量让三目运算符中的两个表达式都是包装类型、或是都是基本数据类型,这样就不会触发自动拆箱了;

 

 

 

 

3.相等的判断:== 和 equals() 的区别

①使用==判断是否相等:对于基本数据类型,判断的是数值,对于引用类型,判断的是对象的内存地址;

 

②使用equals()方法判断引用类型是否相等:

对于重写了equals()方法的类,会使用重写的equals()方法进行比较,通常都是对类中的各个属性的值进行比较,

对于没有重写equals()方法的类,则会使用父类Object的equals()方法进行比较,实际上就是使用==比较对象的内存地址;

public boolean equals(Object obj) {
     return (this == obj);
}

 

③因为在使用对象调用equals()方法时若调用者为null,可能会出现空指针异常,所以更推荐使用JDK7中引入的工具类Objects的equals()方法,

其逻辑是若两个对象内存地址相等,或第一个对象不为空,且使用第一个对象调用其equals()方法与第二个对象比较的结果为true,则返回true,否则返回false;

    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

 

 

 

 

4.深浅拷贝