面试记录(1)
人力面试
- 离职的原因?
- 是统招本科吗,学信网可查吗?
- 可以接受外包/驻地/外派吗?
- 上家公司的工资,福利,年终奖等
- 期望薪资?
- 什么时候入职?
- 项目介绍
技术面试
基本问题
- 自我介绍:面试官,您好!我叫某某。大学期间,大学期间我除了完成了必修的计算机专业课程外,参加过各类比赛,获得过数学建模的一些奖项,并且考取了英语的六级证书。课外积极的去接触了计算机的各个领域,比如Python和人工智能,函数式编程语言,前端的一些技术,并且坚持记录技术博客,后来选择Java作为专攻的语言,并且在毕业后从事了一年的Java后端开发,对Java开发的整套技术有了熟悉和实践。(说一些简历上没有的优势)
- 学习和成长:大学阶段主要学的还是计算机科学基础的原理,并且在课下去了解和接触了计算机科学与技术的很多领域,毕业后专攻Java后端开发,一年的时间对Java各个方面的技术都有了一定程度了解,并且参与了实际项目的开发,但还是觉得自己有很多不扎实的地方,所以今年开始从头数理整个Java体系,以求建立起一个完备系统的知识体系,并且开始有意识的深入理解原理,阅读源码,学习JVM,多线程一些底层的知识,为之后的进阶打下更牢靠的基础。(表现出自己的发展潜力)
项目问题
- 优惠券相关功能开发
- 亮点1:用redis提高访问速度,定时检查DB中库存的优惠券是否已经生效,生效则传入缓存。
- 亮点2:使用消息队列削峰和降流等等,因为发优惠券没要求时效性那么高,可以用MQ作为缓冲。
- 难点1:后台优惠券发券功能,发放到用户的卡包中,有一些的需要派发给所有用户,上百万的用户量,同一时间发放会导致后台系统直接卡死,并且因为事务的影响,一个插入失败可能导致全部插入失败,于是开始去解决大数量情况下插入慢的问题。
- 解决2:多线程进行派发,并且用到MQ。每次操作100或100个用户,用多线程分批放入MQ,然后让消费者慢慢消费,极大的解决了系统的消耗。
- 难点:前台用户领券,当优惠力度比较大的时候会出现用户抢券,每一次都在DB做操作会给DB压力过大,可以只在Redis中缓存下来优惠券的数量,当Redis中减到零再去更新数据库,使其保持一致。并且因为优惠券可能领不完,所以也要有一个定时任务来定时间更新的。
计算机网络
- TCP/IP 中的三次握手和四次挥手:说清每一次握手/挥手的包与状态
- 为什么三次握手而不是两次:消息延迟会导致失效的报文段被接受
- 对HTTP协议的了解:是什么,无状态,优点缺点
- TCP/IP和UDP的了解:安全?速度?连接?
- Http请求头里有什么东西:浏览器版本,请求来源。响应头里记录了请求类型(请求行中记录了请求方式,响应行中记录了状态码)
- 扩展:QQ用的是TCP/IP还是UDP?为什么不在线的时候也能建立链接留言 ?
多线程
- 线程的创建方式x3:四种简单说明使用场景
- 可重入锁:与关键字比较(手动,默认非公平),使用方法,什么是可重入,实现原理
- AQS:队列同步器,作用,原理(等待队列和state标记位)
- CAS:为什么,思想,原子性,原理到汇编
微服务
- 微服务是什么样的一个理念? 自治(团队独立,技术独立,前后端分离,数据库分离,部署独立)
- 基于什么样的场景提出来微服务,他有什么样的优点和缺点? 随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是系统架构的演变。优点:服务间独立,扩展性强,技术不受限。缺点:分布式系统的复杂性,运维难度增加等
- 服务间调用的协议:Dubbo是RPC,基于TCP速度快效率高;SpringCloud中Rest风格的实现是Http,优点是对服务的调用方没有任何技术限定,自由灵活。
- 微服务单个服务的失败会不会引起整个系统的问题?为什么要使用熔断技术? 会,解释。为什么熔断,Hystrix的熔断机制(用线程池存放等待线程,线程池慢则拒接接下来的调用,返回错误信息,防止阻塞;服务熔断,,)
- 扩展:Maven多模块和负载均衡比起来现在提出的微服务思想的优点?
数据库
- 数据库设计范式? 三范式介绍
- 事务ACID? 是什么,提一下原理
- 用过的数据引擎:介绍两个数据引擎即使用场景。
- 说一下数据库优化 引擎,表,分库分表,索引优化
- 说一下SQL相关x3 定位,分析,具体常见(insert,group by等)
- 数据库表的设计:一张表支持微信用户的登录,考虑三个字段,用户ID,用户登录的唯一凭证,微信名称(如何稳定,高效)
- MySQL如何查第二页前十条;
- 学生表和成绩表如何把成绩前十条信息输出来;
- 存储过程有了解吗?
Java基础
- 双等于 基本和引用
- 重载和重写 解释概念
- 抽象类和接口区别 :我觉得接口是一种特殊的抽象类,相同点是都不能被实例化要对七进行实现,不同点是关键字不同,抽象类强调的是从属关系,接口强调是功能,抽象类语法比较自由,接口只能定义抽象方法,默认使用Public,没构造方法,但能多实现。
- 基本数据类型有哪些X3 (byte8 short16 int32 long64)(float32,double64)boolen,char
- 基本数据类型和包装数据类型的应用场景,临时变量和类里面成员变量分别使用什么? 容器中需要使用包装类,包装类中有更多的方法。使用基本类型可以减少堆存储,减少垃圾回收频率。阿里手册强制:所有的POJO类属性必须使用包装数据类型(不会被赋默认值)。推荐,所有的局部变量使用基本数据类型(解决资源)。
- String是基础数据类型吗X2 不是
- 分割字符串的方法,返回值是什么? split():分割字符串,返回一个分割后的字符串数组。
- Java运行需要的最小环境 JRE
- ArrayList和LinkList的区别 X3 数据类型,区别,原理,复杂度
- 说一下HashMap 数据结构,版本差异,扩容机制
- 说一下ConcurrentHashMap 与hashtable,并发安全机制,扩容机制
- HashMap put 的过程 一步一步思路说清楚
- Java反射的原理? 功能,过去class对象的方式:类名.class,对象.getClass。原理:介绍Java代码生成类实例的阶段(JVM)
- 了解哪些数据结构? 数组,链表,散列表,树,队列,栈等,结合Java说
- 遇到的异常,常见的有哪些? 并发修改异常(hashmap中),内存溢出(如何解决),栈溢出,空指针(没注入对象)
- 枚举类型 ?
JavaEE框架
- SpringBoot
- Springboot 引入第三方的jar包,引起冲突了怎么解决? 看错误提示,一般是版本问题,试着调换版本
- **SpringBoot和SpringMVC的区别和优势:**内置Spring,提供了自动配置,搭建spring应用的脚手架,没有复杂的配置和凌乱的依赖关系。再介绍SpringMVC
- 常用注解
- @EnableAutoConfiguration 开启spring应用程序的自动配置,SpringBoot基于你所添加的依赖和你自己定义的bean,试图去猜测并配置你想要的配置。
- @ComponentScan:开启注解扫描
- @SpringBootConfiguration 声明当前类是SpringBoot应用的配置类,
- @SpringBootApplication 包括前三者
- Spring
- 常用注解
- 创建对象:@Component,@Service,@Controller,@Repository
- 输入属性: @Autowired 等
- AOP注解:@AspectJ
- spring中如何解决循环依赖问题? 重新设计代码,使用懒加载解决(尽量扯到Bean加载机制相关)
- 常用注解
- SpringMVC
- 常用注解?
- 请求映射:@RequestMapping 可用于类或方法上。
- 接受get请求的传参:@RequestParam
- 获取Post请求内容(请求体中的Json):@RequestBody
- 常用注解?
- MyBatis
- 使用过那些数据持久层的框架?JPA和Hibernate有了解吗?
- 常用注解 ? @Insert,@Delete,@Update,@Select,@Param。主要用的通用Mapper。
中间件
- MQ
- **对消息中间件的了解?**说优点(异步,解耦),原理(生产者消费者模型)
- 常见的消息中间件 四个常见简单说,kafka可以多谈一些
- 消息中间件有什么问题,如何解决? 复杂性提高,要考虑重复消费(保证幂等性,全局Id,消费完保存到redis中),与消息丢失(ACK机制,三个丢失环节的处理)
- 应用场景? 商品修改后数据库,索引库,静态页面(商品详情页面)都需要进行修改,如果直接让服务器端修改这些代码,违背了微服务的独立原则;所以产生了消息队列的机制,如果数据发生修改,服务器端只需要向消息队列发送消息,就可以做其他工作了(异步),而索引库和静态页面的接口时刻监听消息队列,如果监听到服务端的消息便进行数据的更新。
- 使用过程:在商品服务对商品进行写操作:增、删、改的时候,需要发送一条消息(发商品Id就可以了),通知其它服务。其他服务要创建监听器(@RabbitListener),接受消息进行修改。
- RabbitMQ基本连接的属性。
- 缓存
- **Redis缓存什么样的数据? **比较稳定的,变化比较少的
- Redis如何实现分布式锁 Redis是单线程的,多个客户端对Redis的连接不存在竞争关系,并且Redis的setnx命令可以方便的实现分布锁(只在键不存在时,才对键进行设置操作);新版本的jedis提供的set方法支持多参数的set方法可以设置NX属性,并且设置过期时间,避免发生死锁。
- 项目中的应用:验证码有一定有效期,一般是5分钟,我们可以利用Redis的过期机制来保存。
- esX2
Linux
- 常用的 Linux 命令? 查日志的,查网络的,进程管理,查磁盘的,
- 有没有搭建在 Linux 上的? es、redis、Nginx、fastDFS
- Linux中Tomcat端口配置在哪个文件中 ?找到tomcat的安装路径下的conf配置文件夹中的server.xml
JVM
- Jvm的GC:是什么,怎么找垃圾,怎么回收垃圾(四种算法),垃圾回收器
- JVM的类加载机制:双亲委派模型
- 内存溢出怎么办?:进行JVM优化,一般先代码优化,及时释放内存
其他
- 常见的设计模式,说一说XXX模式:工厂(IOC),代理(AOP),单例(bean),观察者(listener)
- Git 常用指令有哪些?
- 配置 git config
- 增删文件 git add
- 代码提交 git commit
- 分支 git branch
- 远程同步 git push
- Cookie和Session区别 定义,安全性,容量
- 分布式Session技术:没用Session存数据
- 前端的接触过吗?vue用过吗? 了解,能看懂,但前后端分离
- 算法:n个数组每个中五个数,如何找到合最大的
- Ajax 是一种在无需重新加载整个网页的情况下,能够更新(异步)部分网页的技术。JQeury实现方式$.get/post(),发送get/post请求
- JSP内置对象
HR面试
- 面试官问"你有什么问题问我吗?"时
- 面试官问你的优点是什么,应该如何回答? 面试的时候最好可以说几个你要应聘的职位所做的事情需要的优点或者说你要应聘的公司比较看重的优点(企业文化)。
- 面试官问你的缺点是什么,应该如何回答? 底层原理还有待提高
- 优势的技术在哪里,深入了解的