面试复盘|银行国企秋招+许愿
渤海银行
先问项目:balabalabalabala
微服务:balabalabalabala
1.springboot的启动注解
答:@SpringBootApplication
2.springboot启动注解包含了spring的哪些注解
答:1. @SpringBootConfiguration:组合了spring中@Configuration的注解,实现配置文件的功能
2.@EnableAutoConfiguration:打开自动配置功能,也可以关闭某个自动配置的选项
3. @ ComponentScan:类比Spring的组件扫描
3.自动装配 @Aurowired用的多么
答:非常多
4.@Autowired和 @Resource的区别
答: @Autowired 默认是按照类型装配注入的 ,默认情况下它要求依赖对象必须存在(可以设置它 required 属性为 false )。
@Resource 默认是按照名称来装配注入的 ,只有当找不到与名称匹配的 bean 才会按照类型来装配注入。
5.如果想要@Autowired根据名称自动装配,需要和哪个注解配合使用?
答:需要和@Qualifier注解一起使用
6.MyBatis用的也很多吧,说一下#和$的区别吧
答:1. #{} 是占位符,预编译处理; ${} 是拼接符,字符串替换,没有预编译处理。
2. Mybatis 在处理 #{} 时, #{} 传入参数是以字符串传入,会将 SQL 中的 #{} 替换为 ? 号,调用 PreparedStatement 的 set 方法来赋值。
3.Mybatis 在处理${}时,是原值传入 ,就是把$ {} 替换成变量的值,相当于 JDBC 中的 Statement 编译
4.变量替换后, #{} 对应的变量自动加上单引号 ‘’ ;变量替换后, ${} 对应的变量不会加上单引号
7.#和$在使用的时候哪个会引起SQL注入?
答:${}
8.9.10.11.redis集群和一大堆Linux命令....
答:1. Redis 集群实现了对 Redis 的水平扩容,即启动 N 个 redis 节点,将整个数据库分布存储在这 N 个节点中,每个节点存储总数据的 1/N 。
2.Redis 集群通过分区( partition )来提供一定程度的可用性( availability ): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
Linux:
1.查看进程 ps -ef | grep redis
2.vi里面搜索一个东西怎么搜 /+要搜索的关键字
3.vi跳转到最后一行或者第一行 :$跳转到最后一行,:0或者1跳转到第一行
4.翻页:ctrl+f向下翻页,ctrl+b向上翻页
5.普通的应用一般是放在什么地方执行 tomcat
6.Linux后台启动命令 只是在命令前要加上nohup:nohup command &
然后换另一个面试官提问
1.数据库的索引是什么?
答: 索引时数据库管理系统中一个排序 的数据结构,以协助快速查询,更新数据库中表的数据
2.like会用到索引么?
答:这个需要分 情况,如果like后面是%开头并且没有使用覆盖索引的话那就会索引失效。
3.查询的时候怎么实现分页查询
答:在查询语句最后一行加上limit语句
农行研发中心
1.Redis有哪些高可用方案
答:1.主从模式:通过主从复制实现一主多仆或者薪火相传的Redis结构
2.哨兵模式:在主从模式下单独加一个哨兵集群,可以对主机从机进行监控,当主机宕机后,自动选举出一个从机升级为主机
3.集群模式:实现了 Redis 的分布式存储,对数据进行分片,也就是说每台 Redis 节点上存储不同的内容,假设有n个节点,那么每个节点就会存储数据的1/n
2.Redis的数据结构/数据类型
答:String,list,set,zset,hash
3.用哪种数据类型可以实现简单的消息队列呢
答:list就可以
4.缓存穿透、缓存击穿、缓存雪崩
答:1.缓存穿透是指用户要查询的数据不存在,在Redis中没查到会转向数据库查询,如果这时候有大量的并发请求发给数据库,会造成数据库的压力骤增,导致数据库被压垮。
2.缓存击穿是指用户要查询的数据存在,但是在Redis中过期了,在Redis中没查到会转向数据库查询,如果这时候有大量的并发请求发给数据库,会造成数据库的压力骤增,导致数据库被压垮。
3.缓存雪崩是指用户要查询的多个数据存在,但是在Redis中全部过期了,在Redis中没查到会转向数据库查询,如果这时候有大量的并发请求发给数据库,会造成数据库的压力骤增,导致数据库被压垮。
5.如果Redis中的数据过期了,那Redis是怎么删除的这个数据呢
答:过期的策略通常有三种:
1.定时过期:给每个设置了过期时间的key都加一个定时器,到了过期时间就自动清除,这个策略对内存友好,可以立即清除过期key
2.惰性过期:不需要给设置了过期时间的key加定时器,只是当用户每次查询的时候,才去检验这个被查询的key是不是过期,如果过期了就再从数据库查询并缓存到Redis中
3.定期过期:每间隔一定时间,就会自动扫描一定数量的expires字典中一定数量的key,如果过期了就删除。
Redis中同时使用了惰性过期和定期过期两种过期策略。
6.Redis的淘汰策略
答:1.volatile-lru:从已经设置了过期时间的key中,选取最近很少使用的key进行淘汰
2.volatile-ttl:从已经设置了过期时间的key中,选取快要过期的key进行淘汰
3.volatile-random:从已经设置了过期时间的key中,随机选取key进行淘汰
4.allkeys-lru:从所有数据中,选取最近很少使用的数据进行淘汰
5.allkeys-random:从所有数据中,随机选取数据进行淘汰
6.no-enviction:禁止驱逐
7.除了还知道哪些缓存数据库
答:memcatched
Memcatched只支持字符串类型,没有Redis这么多元化。而且不支持持久化机制。
8.Springboot的监视器说一下
答:springboot的监视器叫springboot actuator,可以帮助开发人员访问生产环境中正在运行的应用程序的当前状态,有几个指标必须在生产环境中检查和监控。
9.springboot中yaml是什么
答:yaml是一种人类可读的数据序列化语言,通常用于配置文件。它更加结构化,能分层配置数据。
Yaml相比properties更加配置有序,并且支持数组,但是不支持@PropertySource注解导入自定义的配置
10.springboot中的核心配置文件叫什么
答:application.properties和bootstrap.properties,后缀也可以是yml和yaml。
11.cookie和session
答:1.cookie是用户向服务器发请求时,服务器给客户端的浏览器颁发的一个文件,记录了用户的相关信息,客户端每次向服务器发请求,都需要带着这个cookie来服务器验证,验证通过后服务器返回给客户端相关信息。
2.Cookie是有大小限制的,单个不超过4kb,多数浏览器规定一个站点只允许保存20个。
3.Session是服务器端的,是客户端和服务器在会话过程中,服务器分配的一块存储空间,cookie中默认有sessionID,在验证时session会和cookie中的sessionid验证。
12.在一个分布式的系统里,session肯定不能每个服务器都存放,那么如何实现在分布式系统里共享session呢?
答:可以放到Redis里实现在分布式系统上共享session
13.说一下tcp的三次握手吧
答:1.第一次是客户端向服务器发出一个SYN请求,SYN置1,同时传递一个初始序列号给服务器,发送完成后客户端进入SYN-SEND状态。
2.第二次是服务器接收到来自客户端的SYN请求后,返回给客户端一个SYN+ACK报文,同时发送一个序列号,发送完毕后,服务器进入了SYN-RECEIVED状态。
3.第三次是客户端收到了来自服务器的SYN+ACK信号后,返回给服务器一个ACK报文,发送完毕后,客户端进入了established状态,当服务器收到这个ACK后,服务器也进入established状态,这样tcp连接就建立了。
农银金科
1.介绍项目,说几个spring的组件
答:springmvc、springdao、springcore、springaop、springcontext、springorm、springweb
2.什么是jwt
答:1.jwt全程是json web token,是一个json形式的web应用使用的令牌,用于在各方之间安全的把信息通过json对象来实现传输,是一个开放标准。
2.jwt常常被用来做授权和信息交换。
3.jwt由三部分组成,header.payload.signature,三部分之间以一个.来连接。其中header中保存着json的加密算法和数据格式,payload中保存中用户信息,signature作为一个签名,三者连接起来共同组成一个字符串,就是jwt串。
3.jwt是有时效的,那么同一个用户多次发出请求,jwt要是过期了怎么办,你们是怎么处理这一块的?
答:应该是把jwt放到redis中,当一个用户每发出一次请求后,就把redis中的jwt串刷新一次,这样每次都是一个新的过期时间。
4.java的反射机制了解吗?
答:对于任何一个对象,程序都能够在运行时获取它的所有属性和方法;对于任何一个对象,程序都能在运行时调用的它的所有属性和方法。这种在运行时动态的获取对象的参数和方法的机制就是java的反射机制。
5.举几个应用了反射的例子
答:spring框架中就大量的应用了反射,还有spring的aop中使用的动态代理也是以反射为基础
6.设计模式了解过哪些
答:只会使用单例模式
7.介绍一下springmvc吧
答:1.springmvc是一个基于mvc架构的控制层框架,是springboot和spring集成了的用于开发web应用的模块,其中包含了三个层面:model、view、controller。
2.model层里,java程序的大部分代码都集中在这一层,view层是程序呈现给用户的部分,是用户和程序交接的接口,controller使用来处理用户输入数据,以及更新业务模型的部分。
3.springmvc的运行流程是这样的:
(1)用户向服务器发出请求,请求被前端控制器DispatcherServlet捕获
(2)DispatcherServlet对请求的url解析,得到请求资源标识符uri。然后根据这个URI,调用handlermapping获得该handler配置的所有相关对象,最后以HandlerExecutionChain对象的形式返回
(3)DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter
(4)提取request中的模型数据,填充Handler入参,开始执行Handler(Controller)。
(5)Handler执行完成之后,会给DispatcherServlet返回一个模型视图ModelAndView对象
(6)根据返回的ModelAndView,选择一个合适的ViewResolver返回给DispatcherServlet
(7)ViewResolver结合model和view,渲染视图
(8)将渲染的结果返回给客户端
8.数据库如何删除一个表的数据
答:可以使用delete后面不加where限定条件,也可以直接使用truncate和drop来删除
9.连接池
交行软开
1.介绍项目
2.jvm调优有了解吗
答:首先调优工具有这些:
jvisualvm:虚拟机监视和故障处理平台
jps :查看当前 Java 进程
jstat:显示虚拟机运行数据
jmap:内存监控
jhat:分析 heapdump 文件
jstack:线程快照
jinfo:虚拟机配置信息
有了这些工具就可以利用这些工具进行调优:
1、堆信息查看
可查看堆空间大小分配(年轻代、年老代、持久代分配)
提供即时的垃圾回收功能
垃圾监控(长时间监控回收情况)
查看堆内类、对象信息查看:数量、类型等
对象引用情况查看
有了堆信息查看方面的功能,我们一般可以顺利解决以下问题:
年老代年轻代大小划分是否合理
内存泄漏
垃圾回收算法设置是否合理
2、线程监控
线程信息监控:系统线程数量
线程状态监控:各个线程都处在什么样的状态下
Dump 线程详细信息:查看线程内部运行情况
死锁检查
3、 热点分析
CPU 热点:检查系统哪些方法占用的大量 CPU 时间;
内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)这两个东西对于系统优化很有帮助。我们可以根据找到的热点,有针对性的进行系统的瓶颈查找和进行系统优化,而不是漫无目的的进行所有代码的优化。
4、快照
快照是系统运行到某一时刻的一个定格。在我们进行调优的时候,不可能用眼睛去跟踪所有系统变化,依赖快照功能,我们就可以进行系统两个不同运行时刻,对象(或类、线程等)的不同,以便快速找到问题。
举例说,我要检查系统进行垃圾回收以后,是否还有该收回的对象被遗漏下来的了。那么,我可以在进行垃圾回收前后,分别进行一次堆情况的快照,然后对比两次快照的对象情况。
5、内存泄露检查
内存泄漏是比较常见的问题,而且解决方法也比较通用,这里可以重点说一下,而线程、热点方面的问题则是具体问题具体分析了。
内存泄漏一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而导致新的资源分配请求无法完成,引起系统错误。内存泄漏对系统危害比较大,因为它可以直接导致系统的崩溃。
3.dump检查
答:不会,求大佬来知道
4.问个数据库相关的吧,给定一个作者表,一个书籍表,查询出出版了大于等于2本书籍的作者名
答:select 作者表.作者名 from 作者表 join 书籍表 on 作者表.作者名 = 书籍表.作者名 group by 作者表.作者名 having count(书籍表.书籍) >= 2
中国系统
。。。。一言难尽