吉祥航空和绿盟科技的面试

发布时间 2023-10-08 10:41:08作者: 求知律己

1.吉祥航空

1.1. HashMap实现,线程安全方式

答:1)HashMap不安全性,效率高,允许key和value为空,默认初始容量为16,之后每次扩充为2的倍数 为2倍数是因为取余能提升hash&(length-1)预算效率 底层是有数组+链表/红黑树构成。

2)关于哈希冲突(存储的不同值由于哈希表计算的哈希值相同而造成的) ,在JDK1.8之后,当链表长度超过阈值8时,将链表转为红黑树(但在链表转为红黑树之前,先判断数组的长度是否小于64,如果小于,

那么选进行数组扩容,如果数组长度大于64,则转为红黑树), 减少搜索时间。

3)HashMap通过key的hashcode经过扰动函数(hash方法)得到hash值,然后通过(n(数组长度)-1) &hash判断元素存放位置,若当前位置存在元素,判断该元素与要存入元素的hash值以及key是否相同,若相同则覆盖,

不同则通过拉链法解决冲突。 拉链法:创建一个链表数组,数组每一格就是一个链表,若遇到哈希冲突,将冲突值放到链表中存放位置。

1.2 ConcurrentHashMap

一种安全,效率较HashMap低,不允许key和value为空的哈希表结构 底层也是由数组+链表/红黑树实现,在JDK1.7之前通过在每个数组的Segment部分加锁保证线程 安全,在JDK1.8之后使用,使用数组的Node头结点加锁

1.3 Spring中用到的设计模式,在自己项目如何实现的

Spring是一款轻量级的Java开发框架,旨在提高开发人员的开发效率以及系统的可维护性。 Spring是很多模块的融合,支持IOC(控制反转)和AOP(面向切面编程),可方便地对数据库访问, 方便集成第三方组件(邮件,任务。调度,缓存等),支持单元测试,支持Restful Java应用程序开发

  • 单例:Spring中的Bean默认都是单例模式(创建分页对象);
  • 代理:Spring中AOP的实现(AOP实现日志记载);
  • 工厂:Spring通过BeanFactory、ApplicationContext创建bean对象(避免重复创建对象);
  • 模板(行为):Spring中的jdbcTemplate、hiberateTemplate等以Template借我的对数据库操作的类 Spring通过Callback模式和模板方法配合灵活地实现代码复用 ;
  • 包装器:项目需要连接多个数据库,不同客户在每次访问中需要访问不同数据库,使得该模式可根据 客户需求动态切换不同数据源 ;
  • 观察者(行为):Sprin事件驱动模型即观察者模式经典应用 ;
  • 适配器模式:使用接口转换成客户希望的另一个接口,适配器模式使接口不兼容的类一起工作 Spring AOP的增强或通知使用到适配器,SpringMVC用适配器适配Controller ;
  • 装饰器:动态给对象添加一些额外的属性或行为。相比于继承更加灵活。如我们需要原有功能,但又不愿去修改原有代码。可设计一个Decorator套在原有代码外面。如InputStream家族,InputStream类 下有FileInputStream、
  • BufferedInputStream(在不修改InputStream代码下增加缓存,提升读取文件速度) Spring自动加载即通过注解或配置在SpringBoot下实现某块功能。

1.4 JVM是什么,JMM是什么

JVM是Java虚拟机包含三个部分类加载器、运行时数据区、执行引擎 。

JMM是Java内存模型,包含主内存和工作内存,JMM主要有八种操作分别是read、load、stoge、 write、use、assign、lock、unlock

  • read:作用域主内存,将共享变量从主内存传送到线程的工作内存;
  • load:作用域工作内存,将主内存传送的变量存储在工作内存的副本变量中 ;
  • stoge:将工作内存存储的变量传送给主内存 write:将工作内存传送的变量写入到主内存的变量中;
  • use:作用域工作内存,将工作内存的值传给执行引擎,当执行引擎遇到需要使用的这个变量时, 则执行该操作;
  • assign:作用于工作内存,当从执行获取到的值服药赋值时,通过栈来对该变量进行赋值;
  • lock:作用于主内存,将变量标记为独享状态;
  • unlock:作用域主内存,释放独占状态。

1.5 事务中如何避免两个线程同时修改同一个表

读未提交隔离级别:每个语句执行前生成一个Read View,只有在Read Viewe中的事务执行完后,才能对其他事务进行操作

1.6 实际中的单元测试用过吗

没有,用过集成测试。其实自己之前在test包中的Junit就是单元测试,测试每个部分的有效性 小结:简历中项目与实际公司项目在性能和QPS方面相对较大。后面需要考虑在项目中使用Jmeter压测项目

2 绿盟

2.1 父类和子类静态代码块、非静态代码块、构造函数执行顺序

答:父类静态代码块-》子类静态代码块-》父类非静态代码块-》子类非静态代码块-》父类构造函数-》 子类构造函数

2.2 父类子类成员变量赋值与构造方法赋值执行顺序

答:父类成员变量赋值-》子类成员变量赋值-》父类构造方法赋值-》子类构造方法赋值

2.3 创建线程方式

  1. new一个Thread类;
  2. 实现一个Runnable接口;
  3. 实现Callable接口(带返回值);
  4. 线程池创建线程;

2.4 三个线程实现三个依赖关系的三个安装任务

创建三个线程,将依赖关系理清楚,通过加锁来逐步执行,或者将依赖关系放入共享变量池中, 通过判断依赖关系之间的关系分派三个线程执行三个安装任务

3.小结

自己对基础面试题看的挺多,但是实际领悟不深,对于多线程题目做的不多,没有多应用,后面继续巩固多线程基础,在项目中尽量应用多线程知识点。