金九银十Java综合面试总结
Java基础:
- Spri**ng是如何解决循环依赖的问题的?比如AautowiredB,BautowiredA,内部是如何是如何实现的?**
- S**pring**IOC的理解,原理与实现;
- 设计模式:代理模式与装饰者模式的区别;常用的设计模式:单例模式、代理模式、装饰着模式等,单例模式主要解决什么问题;
单例模式的优点:
单例模式的缺点: - S**pring boot何时启动结束;(58、)**
- S**pring boot启动类上的注解 @spring bootApplication说明?**
S**pring boot如何判断当前应用是否时web应用? spring boot启动流程: 1)构造SpringApplication实例,在构造过程中有判断当前应用的类型,代码如下:**
this.webApplicationType = WebApplicationType.deduceFromClasspath();
2)、执行run方法:
(1)、创建并应用监听;
(2)、加载配置文件;
(3)、准备并刷新上下文;
- Bean Factory与FactoryBean有什么区别?@Bean这个注解时如何实现Bean的注入的?
BeanFactory**是一个工厂类的接口,是spring**IOC的容器的核心接口,它的职责实例化、定位、配置应用程序中的对象即建立这些对象的依赖;
FactoryBean是一个Bean,它是实现了FactoryBean<**T> 接口的bean,根据该Bean的Id从BeanFactory中获取的实际是BeanFactory的getObject返回的对象,而不是Factory Bean本身;即BeanFactory是用来获取对象的,Bean Factory是用来管理对象的。**
- Java中的静态方法只有一个实例,如果想用多个实例怎么办?
- 深度克隆的主要实现方式?
- Java面向对象的基本特征,继承、封装与多态;
- 重写和重载的是什么意思?
- 怎样生命一个类不会被继承?final
- Integer是基本数据类型还是引用数据类型?
- HashMap中jdk1.7与jdk1.8的区别(58);
二叉树-》平衡二叉树-》红黑树;
- concurrent**hashMap 的底层实现原理(58);**
- spring、spring boot、springcloud之间的关系;
- Java种的自增是线程安全的吗,如何实现线程安全的自增?
- J**dk1.8种的stream有用过吗,stream的并行操作原理,stream并行的线程池是从哪里来的;**
- J**dk1.8的completableFuture有用过吗;**
- Java种的代理有几种实现方式;
Java 并发及JVM相关:
- 线上部署时出现内存溢出该如何处理?
1、使用top命令查看当前进程对应的内存大小信息,并使用shift+M按照内存大小进行排序,查看进程中内存占用较大的进程;
2、利用jstat查看某一进程虚拟机的GC情况;
3、生成dump文件,通过dump文件查看当时内存对象相关的信息;生成dump文件有两种方式:
1)、使用jmap直接生成dump文件;
jmap -dump:format=b,file=heap.prof 17561 ;
format=b:表示生成二进制类型的dump文件;
file=:后面写的四输出的dump文件路径;
17561:jvm进程ID;
- Java多线程几种状态变更的图,图中包括线程所处的状态及线程各个状态之间是如何切换的?
- Java中的wait和sleep的区别与联系?
- J**ava.untils.concurrent包主要用到了哪些知识? 并发容器: 同步锁(两种): 线程池: 并发工具(3种):**
- 如何在方法栈中进行数据传递?
使用volatile关键字 - ThreadLocal的底层实现形式及实现的数据结构?
- Java有返回值的多线程使用?
- Java中值类型和引用类型的区别(==与equals(**)**的区别、Java中的引用类型:值引用与);
- Java中方法参数的传递时值传递还引用传递?
- Java中堆和栈的区别?
- JVM**内存划分与垃圾收集算法:fullGC与youngGC;**
- Java**JVM相关内容结合项目介绍;**
- 线上如何排查JVM内存溢出问题?
1.可以通过idea进行远程debugger;
2.相关命令jstat、jmap、jconsole等;
3.相关的工具,如阿里的阿尔萨斯等; - 服务器CPU占用特别高,怎么查看(58),面试重点JVM及多线程;
- Array List是线程安全的吗?
- C**oncurrentHash Map是如何实现线程安全的;**
- S**ychornized是否是公平锁;**
- JVM为什么要增加元空间;
- J**avam如何查看问题,并进行jvm调优;**
- 堆G1垃圾收集器有了解么,有什么特点;
Mysql面试题:
M**ysql**MVCC、MySQL为什么选择B+树作为它的存储结构,为什么不选择Hash、二叉、红黑树(58);
- 如果仅仅是select * from table where id =45,**上面三种数据结构都可以实现,但是如果是select*fromtable where id <45;则它们的查找方式就类似于全表扫描。B+树只在最末端叶子节点存数据,叶子节点是以链表形式相互指向的;**
- 为什么不选择Hash索引:Hash索引不适合范围查找,而B+树特别适合范围查找;Hash索引每次查询都需要加载所有的索引数据到内存中,而B+树只需要根据匹配规则选择对应的叶子数据加载即可;
- M**ysql如何写sql才能提高sql的执行效率;**
- M**ysql数据库的事务与锁的理解;**
- 数据库临时表有没有用过,是怎么用的?
- 添加索引的缺点?
- M**ysql的最左原则;**
- M**ysql的锁:两条sql语句分别执行如下: sql1:更新数据的IDbetween10and 20 ; sql2:更新数据的ID为11; 那么这个锁是如何保证11这条数据不被更新的呢?**
- M**ysql的sql优化 1、Mysql使用过程中走索引的语句;**
2、索引的优化
3、亿级的数据必须使用like进行查询,如何优化
- 多数据源情况下如何进行事物的管理;
- U**nion和union**all有什么区别;
- dateTime和timestamp有什么区别;
- mysql数据库事务的几种形式,模式事务级别,Oracle、SQL server默认事务级别;
读未提交;
读已提交;
不可重复读;
可序列化; - mysql主从模式的实现;
如何解析sql语句;即explain关键字的使用;
- S**elect_type:查询类型,是简单查询还是复核查询;**
- Ty**pe:对表的访问类型:All、index、range、ref、eq_ref、const、system、null;从左到右,性能从差到好;**
- P**ossible_keys:指出mysql能使用按个索引在表中找到记录;**
- K**ey:该列显示mysql实际使用的索引;**
- F**iltered:按表条件过滤行的百分比;**
- E**xtra:执行情况的描述和说明;**
- 为什么不对mysql的所有表都添加索引?
- M**ysql索引为什么不用hash而用B+树;Hash的时间复杂度是多少;**
- B+树索引可以进行范围查询吗,比如大于小于;
- 应用种mysql是集群还是单节点,最大表数据量是多少;
M**ysql的主从同步原理,mysql主从复制主要有几种模式;**
- M**ysql主库在事务提交时会把数据库变更作为事件event记录在二进制文件binlog中;mysql主库上的sys_binlog控制binlog日志刷新到磁盘;**
- 主库推送二进制文件binlog中的事件到从库的中继日志relay**log,知乎从库根据中继日志重做数据库变更操作。通过逻辑复制,以此来达到数据一致。**
- M**ysql通过三个线程来完成主从库之间的数据复制:其中binLogDump线程泡在主库上,I/O线程和SQL线程泡在从库上。当从库启动复制时,首先创建一个I/O线程连接主库,主库随后创建binlogdump线程读取数据库时间并发送给I/O线程,I/O线程获取到数据库事件更新到从库的中继日志realylog中,之后从库上的sql线程读取中继日志relaylog中更新的数据库事件并应用;**
M**ysql主从复制主要有三种模式:**
- 基于sql语句的复制(statement-based replication,SBR);
- 基于行的复制(row**-based replication,RBR)**;
- 混合模式复制(mixed**-based replication,MBR)**;
Java框架相关:
- RabbitMQ的使用;
- Z**ookeeper的原理,什么情况下会使用zookeeper,zookeeper如何监听生成的节点,zk内部是如何实现的;**
- S**pringcloud**eureka是如何注册服务、如何监测心跳的,它注册的流程是怎么样的;
- R**edis在项目中是如何使用的;**
- 在分布式环境中如何快速发现某一台服务有问题;
- M**ysql中如何设置一个字段为自增的;**
- 分布式集群系统对外提供接口的时候如何验证对方的身份;
- S**pring boot整合jsp的流程,需要注意哪些点;**
E**ureka和zookeeper作为注册中心有什么区别(58);**
- C**AP理论:一致性(consistency)、可用性(Aviailability)、分区容错性(Partitiontolerance)**三者只能满足其二;
- CA:不是分布式架构,就使用这种,关系数据库按照CA进行设计,放弃分区容错性,因为没有分区;
- AP:加强可用性和分区容错性,放弃立即一致性(强一致性),追求最终一致性。比如eureka;比如微信提现,提示两小时到账,而不是马上到账;
- CP:强调强一致性和分区容错性,放弃可用性,比如zookeeper,master在宕机后进行选举leader期间服务不饿能提供;比如夸张转账,就是立即到账,你这边转出,那边收进,才任务一个事务完成;
- 由于ZK采用的时cp原则,所以其可用性降低,这是致命的问题,springcloud集成的eureka采用的是ap原则,牺牲了一致性,但是保证了可用性;
Zookeeper0、zookeeper1、zookeeper2,三个节点的集群描述一下从zk启动,到zk对外提供服务的整个过程(58);
Z**ookeeper集群leader的选举;**
- 服务器初始化阶段和服务器运行期间leader挂掉情况选举机制大体相同,此处仅对服务器初始化启动期间进行说明;
- 先后启动两台服务器,启动后两台服务器进行通信,每台服务器都试图找到lead,于是进入leader选举过程,过程如下:
- 每个server发出一个投票,由于初始概况,server1和server2都会将自己作为leader服务器来进行投票,每次投票都会包含所推举的服务器的myId和ZXID,使用(myid,ZXID)来表示,此时server1的投票为(1,0),server2的投票为(2,0),然后各自将这个投票发给集群中的其他机器。
- 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票,是否来自lookiing状态的服务器。
- 处理投票:针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,pk规则如下:
优先检查ZXID。ZXI**D**比较大的服务器优先作为leader。
如果ZXID相同,那么就比较myid。**M**yid比较大的服务作为leader服务器。 - 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受相同的投票信息,对于server1,server2而言,都统计出集群中已经有两台机器接受了(2,0)的投票信息,此时便认为已经选举出了leader;
- 改变服务器状态。一旦确定了leader,每个服务器就会更新自己的状态,如果是follower,就会变成Followiing,如果是leader,就会变成Leading。
- Z**ookeeper数据同步;**
- Z**ookeeper对外提供服务;**
有一个key,往zk写入,到写入成功它的大体过程是什么样的(58);
- 此处有一个客户端client和zookeeper服务器;
- C**lient向zookeeper的某一个server上写数据,发送一个写请求;**
- 如果server1不是leader,那么server1会把接收到的请求进一步转发给leader,印美每个zookeeper集群里有一个是leader,这个leader会将写请求广播给各个server;各个server写陈工后就会通知leader;
- 当leader收到大多数server(超过一半)数据写成功了,那么就说明数据写成功了,如果是三个节点的话,只要有两个节点数据写成功了,那么就默认数据写陈工l**,写成功之后,leader会告诉server1数据写成功了。**
- S**erver1会进一步通知client数据写成功了,这时就认为整个写操作成功;**
Z**ookeeper监听器的原理;**
- 首先要由一个main()线程;
- 在main线程中创建zookeeper客户端,这是就会创建两个线程,一个负责网络连接通信,一个负责监听;
- 通过connect线程将注册的监听事件发送给zookeeper。
- 在zookeeper的注册监听器列表中将注册的监听时间添加到列表中。
- Z**ookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。**
- listener线程内部调用了process方法;
- 排行榜功能的实现:使用redis的zset;zset的底层数据结构是什么样的;除了redis的zset还有什么其他的数据结构可以实现这个功能;
- R**edis的zset底层实现是跳跃表,跳跃表的底层实现是链表+索引(如上图),具体详情请点[https://www.jianshu.com/p/dc252b5efca6**][https_www.jianshu.com_p_dc252b5efca6]
- S**ychronized和ReentryLock的区别(重点:底层实现的区别); 区别:1、2、3、4:Sychronized底层是unsafe方法、ReentryLock底层是(AQS);**
- R**edis集群种类:主从模式、cluster模式及其应用;**
- R**edis种数据类型及应用场景;**
R**edis的使用场景及存储格式;redis的持久化;RDB与AOF的设置,redis种哪个版本开始可以进行分布式的使用;**
- R**edis默认持久化方式为RDB:有三个策略:save 900 1\save 300 10\save 60 10000;**
- A**OF**默认是关闭的;
- N**ginx如何做限流?令牌桶算法与漏桶算法;**
- T**omcat调优;**
- 为什么使用RPC框架,什么时候会使用http请求;
- 什么场景下会使用MQ;M**Q**的优势与劣势,什么时候不能用MQ(MQ做不到同步);
- S**pringcloud组件介绍;**
Linux服务器:
- L**inux如何查看应用占用内存情况;**
- L**inux脚本编写会么;**
- 线上应用的debugger;
idea有插件,可以远程链接服务器的代码,并在本地debugger;
其他工具:**pingpoint(**分布式性能监测工具); - 服务器CPU数量及线程池数量的关系;
1、服务器cpu数量(n);
2、是IO密集型(2n个线程)应用还是计算密集型(n+1个线程)应用;
算法题:
- 将一个矩阵顺时针旋转90°,请写出伪代码;
A11,A12,A13,**A31,A21,A11,**
A21,A22,A23, ——顺时针旋转90°——》 A32,A22,A22,
A31,A32,A33,**A33,A23,A13, (行,列)**
第i行第j列——》第(j)行第(**n-i**)列;
- 输入:a boy is good ,输出:good is boy a ;
- 链表:1-**>2->3->4->5;请写一个程序,将链表反转过来:5->4->3->2->1;**
综合考察:
- 如何做一个秒杀系统;
1、MQ做限流:保证只有1000个人可以访问系统;
2、使用redis做缓存;
3、redis往mysql中进行持久化
如何实现高可用、高并发、高吞吐的技术方案?
高并发:应用缓存、HTTP缓存、多级缓存、池化、异步并发、扩容、队列;
高吞吐:分布式集群;
高可用:负载均衡与反向代理(nginx)、隔离(hystrix)、限流(MQ/nginx)、降级(hytrix)、超时与重试(hystrix)、回滚(hystrix);
- A给B发请求,B执行往数据库insert的操作;设计一个架构,保证能够提供最大的并发量,架构如下:
- 分布式锁:
R**edis实现方式:
redis:为什么使用setnx,或者说set**和setNx有什么区别;
set**Nx:系统在10:05设置一个值,并给出5分钟的过期时间,系统刚刚set完之后redis集群崩溃,10:11分系统重启成功,那么redis中set的值是否还存在?**
考察点:
1、redis**的持久化:刚set完是否能够被持久化到快照或者binlog日志中;**
2、假设redis被持久化,且系统重启时间超过了redis设置的过期时间,那么key是否会被清理;
zookeeper实现方式:
- 缓存数据如何同DB同步更新?(mysql读取redis的binlog,进行数据的更新操作)
其他:
- 处于什么目的考PMP;
- 一个项目启动大会,大概是一个什么过程?
1.介绍项目启动;
2.任命项目经理;
3.宣布项目正式启动; - 对于自己来说,最近接触的比较新的东西或者知识;JVM、python;
- P**ython2和python3的区别(因为我上一个回答了python,所以这里会问);**
- 对自己开发的系统的服务器硬件的了解;
- 在什么应用场景下需要升级服务器配置,什么场景下需要扩充集群;
还没有评论,来说两句吧...