疫情之下,Java开发面试总结

引子

  • 由于个人原因,必须在疫情这个特殊的时期,选择了看工作机会,遂参与了一些面试。由于目前市场的惨淡,招人的要求提高,所以总结了自己目前遇到过得上海一些Java技术栈公司的题目。目前本人已经拿到几个offer,有半导体制造业的,医疗科技类的,外企医疗的,证券的,金融乙方的,金融甲方的,大大小小公司都有参与,遂总结题目和经验如下:

面试题目:

JAVA基础

1、Java有哪几种基础数据类型?

  • byte 、boolean、char、 short、int、float、long、double

2、抽象类和普通类有哪些区别?

  • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  • 抽象类不能实例化,普通类可以直接实例化

3、接口和抽象类有什么区别?

  • 实现:抽象类的子类使用extends来继承;接口必须使用implements来实现接口。
  • 构造函数:抽象类可以有构造函数;接口不能有;
  • 实现数量:类可以实现多个接口,但是只能继承一个抽象类
  • 访问修饰符:接口中的方法使用public修饰;抽象类中的方法可以是任意访问的修饰符。

4、Collection和Collections有什么区别

  • Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如List、Set等
  • Collections是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供排序方法:Collections.sort(list).

5、 List 、Set、Map之间的区别是什么?

  • list:有序,允许元素重复
  • set:无序(treeset有有序的),不允许元素重复
  • map:无序(treemap是有序的),key值必须唯一,value可重复

6、HashMap和Hashtable之间的区别?

  • 存储: HashMap允许key和value为null,而Hashtable不允许
  • 线程安全: Hashtable是线程安全的,而 HashMap是非线程安全的。
  • 推荐使用:在单线程环境下使用HashMappp,多线程环境下使用ConcurrentHashMap替代

7、说一下HashMap的实现原理?

  • HashMap 基于Hash算法实现,我们通过put(key,value)存储,get(key)来获取。当传入key时,HashMap会根据Key.hasCode()计算出hash值,根据hash值将value保存在bucket里。当计算出的hash值相同时,我们称之为hash冲突,HashMap的做法就是链表和红黑树存储相同的hash值得value。当hash冲突的个数比较少时,使用链表否则使用红黑树。

8、ArrayList和LinkedList的区别是什么?

  • 数据结构实现:ArrayList是动态数组的数据结构实现,而LinkedList是双向链表的数据结构实现。
  • 随机访问效率:ArrayList比LinkedList在随机访问的时候效率更高。
  • 增加和删除的效率:LinkedList的效率比ArrayList高;

多线程

1、线程和进程的区别?

  • 一个程序至少有一个进程,一个进程至少有一个线程,一个进程下可以有多个线程来增加程序的执行速度。

2、创建线程有哪几种方式?

  • 继承Thread重新run方法
  • 实现Runable接口
  • 实现Callable接口

3、synchronized和ReentrantLock的区别

  • ReentrantLock使用起来比较灵活,但是必须有释放锁的配合动作;
  • ReentrantLock必须手动获取与释放锁,而synchronized不需要手动释放和开启锁;
  • ReentrsntLock只适用于代码块锁,而synchronized可用于修饰方法,代码块等。

4、session和cookie的区别

  • 存储位置不同:session存储在服务器端,cookie存储在浏览器端
  • 安全性不同:cookie的安全性一般,在浏览器存储可以被伪造和修改
  • 容器和个数限制:cookie有容量限制,每个站点下的cookie也有个数限制
  • 存储多样性:session可以存储在Redis中,数据库中、应用程序中;而cookie只能存储在浏览器中

5、 如何实现跨域

  • 服务器端运行跨域设置CORS等于*
  • 在单个接口使用注解@CrossOrigin运行跨域;
  • 使用jsonp跨域

设计模式

  • 单例模式:保证被创建一次,节省系统开销。重点关注单例模式的三种形式;
  • 工厂模式(抽象工厂,简单工厂):解耦依赖。
  • 观察者模式:定义了对象之间一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新;

Spring

1 、解释一下什么是IOC?

  • 控制反转是spring的核心,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。简单说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理了,由其他(类,第三方容器)来管理;

2、Spring常用的注入方式

  • setter属性注入
  • 构造方法注入
  • 注解方式注入

3、Spring cloud的核心组件有哪些?

  • Eureka:服务的注册与发现
  • Feign:基于动态代理机制,根据注解和选择的机器,拼接请求url的地址,发起请求。
  • Ribbon:实现负载均衡,从一个服务的多台机器中选择一台;
  • Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
  • Zuul:网关管理,由Zuul网关转发请求给对应的服务;

RabbitMQ

1、 RabbitMQ如何保证消息的稳定性

  • 提供了事务的功能
  • 通过将channel设置为confirm(确认)模式

MySQL

1、 Mysql的索引是如何实现的?

  • 索引是满足某种特定查找算法的数据结构,不同的数据引擎的索引实现有所不同。目前主流的数据库引擎的索引是B+树实现的,B+树的搜索效率可以达到二分法的性能。

JVM

1、说一下JVM的内存模型

内存模型分为5个部分:程序计数器,java虚拟机栈,本地方法栈,方法区,java堆。java虚拟机栈用来存储局部变量表,操作数栈,动态链接和方法出口等信息;本地方法栈是调用Native方法服务的;java堆是内存中最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据;

2、简述垃圾回收器是如何工作的?
分代回收器有两个区:老年代和新生代,新生代默认的空间占比总空间的1/3,老年代默认占比2/3;新生代使用复制算法,新生代有三个区:Eden、 To Survivor、 From Survivor,他们的默认占比是8:1:1;它的执行流程如下:

  • 把Eden+ From存活的对象放入To区
  • 清空Eden和From分区
  • From和To交换
    每次From到To移动时存活的对象,年龄都+1,当年龄达到15,升级为老年代;大对象直接进入老年代;当老年代的空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体过程

先写到这里,会持续更新,如果写的不对的地方,请各位大神指出

你可能感兴趣的:(疫情之下,Java开发面试总结)