2022应届生面试总结
目录
前言
2022应届生热点面试题总结,热度不分前后
一、Java 基本数据类型
二、Java 1.8新特性
1. Lambda表达式。
Lambda其实就是一个匿名函数,Lambda允许将函数作为一个方法的参数,传递进方法当中,我们就把Lambda表达式理解为一个可以传递的代码,这样写出来的代码,就可以做到简洁、灵活。
2. 函数式接口
- 只包含一个抽象方法的接口,称为函数式接口。
- 可以通过Lambda表达式创建该接口的对象。(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。
- 可以在任何函数式接口上使用@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。
3. Stream API
Stream是Java8中处理集合非常厉害的工具,它可以对集合进行查找、过滤、映射等数据操作。Stream的出现使得对数据源的操作更加高效。Stream是操作数据源(集合、数组等)所生成的元素序列,它不会存储数据,而是对数据进行操作,当然这个操作并不会改变源数组,相反,会返回一个操作后的一个结果Stream。Stream操作的特点是延迟执行。这意味着他们会等到需要结果的时候才会执行,也叫做“惰性求值”。
4. 新时间日期API
Java1.8对日期改动特别大,之前很多API都被废弃,并且在1.8中引入了许多新的API。这是因为之前的日期类型的API都是线程不安全的,还需要动手封装,才能获得线程安全的时间的工具包。
三、equals()和==的区别
1. equals
- equals不能用于基本数据类型的变量的比较
- equals继承Object类,比较的是是否是同一个对象,比较的是引用地址
- 如果重写equals,比较的是所指向的对象的值。
2. ==
- 用于基本数据类型的变量的比较,比较的是值
- 用于引用类型的比较,比较的是所指向的对象的地址
四、重写和重载的区别
1.重写(Override)
- 编译时的多态性
- 发生在父子类中,子类重写父类方法
- 方法名相同,参数列表必须一样
- 返回值小于等于父类
- 抛出的异常范围要小于等于父类
- 访问修饰符大于父类,如果父类是private修饰,则不能被重写
1.重载(Overload)
- 运行时的多态性
- 发生在同一类中
- 方法名相同,参数列表不同,参数顺序,参数类型,参数个数
- 与访问修饰符和返回值无关
五、抽象和接口的区别
- 抽象类只能继承一个,接口可以实现多个。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。
- 接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系
六、HashMap和Hashtable的区别
-
继承的父类不同
-
HashMap线程不安全,HashTable线程安全
-
包含的contains方法不同
-
是否允许null值
-
计算hash值方式不同
-
解决hash冲突方式不同(地址冲突)
-
扩容方式不同(容量不够)
七、ConcurrentHashMap
1.ConcurrentHashMap-JDK1.7
JDK1.7 中的 ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成,即 ConcurrentHashMap 把哈希桶数组切分成小数组(Segment ),每个小数组有 n 个 HashEntry 组成。
2.ConcurrentHashMap-JDK1.8
在数据结构上, JDK1.8 中的ConcurrentHashMap 选择了与 HashMap 相同的Node数组+链表+红黑树结构;在锁的实现上,抛弃了原有的 Segment 分段锁,采用CAS + synchronized实现更加细粒度的锁。
详细
八、类加载的过程
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析3个部分统称为连接。
详细
九、对象创建过程
- 检查类是否已经被加载;
- 为对象分配内存空间;
- 为对象的字段赋默认值;
- 设置对象头;
- 执行实例的初始化方法init
- 执行构造方法。
十、 java反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
十一、String、StringBuffer、StringBuilder的区别
- String对象是不可变的,对String对象的增删改,实际上是创建了一个新的对象。
- StringBuffer是可变的,对StringBuffer对象的增删改是不会创建新对象的,并且它是线程安全的。
- StringBuilder是可变的,对StringBuilder对象的增删改是不会创建新对象的,它不是线程安全的。
十二、范型
- 保证了类型的安全性。
- 消除强制转换
- 避免了不必要的装箱、拆箱操作,提高程序的性能
- 提高了代码的重用性。
十三、深拷贝和浅拷贝
1.浅拷贝
浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
2.深拷贝
深拷贝把要复制的对象所引用的对象都复制了一遍。
详情
十四、java线程
- 初始(NEW)
- 运行(RUNNABLE)
- 阻塞(BLOCKED)
- 等待(WAITING)
- 超时等待(TIMED_WAITING)
- 终止(TERMINATED)
十五、java线程池
1.java线程池优点
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
2.ThreadPoolExecutor 3 个最重要的参数
- corePoolSize : 核心线程数线程数定义了最小可以同时运行的线程数量。
- maximumPoolSize :当队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。
- workQueue:当新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中