Java开发工程师面试题总集
作者:互联网
自身信息模块
⼀个好的⾃我介绍应该包含这⼏点要素
-
⽤简单的话说清楚⾃⼰主要的技术栈于擅⻓的领域;
-
把重点放在⾃⼰在⾏的地⽅以及⾃⼰的优势之处;
-
重点突出⾃⼰的能⼒⽐如⾃⼰的定位的bug的能⼒特别厉害。
例:
⾯试官,您好!我叫独秀⼉。我⽬前有1年半的⼯作经验,熟练使⽤Spring、MyBatis等框架、了解 Java 底层原理⽐如JVM调优并且有着丰富的分布式开发经验。离开上⼀家公司是因为我想在技术上得到更多的锻炼。在上⼀个公司我参与了⼀个分布式电⼦交易系统的开发,负责搭建了整个项⽬的基础架构并且通过分库分表解决了原始数据库以及⼀些相关表过于庞⼤的问题,⽬前这个⽹站最⾼⽀持 10 万⼈同时访问。⼯作之余,我利⽤⾃⼰的业余时间写了⼀个简单的 RPC 框架,这个框架⽤到了Netty进⾏⽹络通信, ⽬前我已经将这个项⽬开源,在 Github 上收获了 2k的 Star! 说到业余爱好的话,我⽐喜欢通过博客整理分享⾃⼰所学知识,现在已经是多个博客平台的认证作者。 ⽣活中我是⼀个比较积极乐观的⼈,⼀般会通过运动打球的⽅式来放松。我⼀直都⾮常想加⼊贵公司,我觉得贵公司的⽂化和技术氛围我都⾮常喜欢,期待能与你共事!
项⽬经历怎么写?
简历上有⼀两个项⽬经历很正常,但是真正能把项⽬经历很好的展示给⾯试官的⾮常少。对于项⽬经历⼤家可以考虑从如下⼏点来写:
-
对项⽬整体设计的⼀个感受
-
在这个项⽬中你负责了什么、做了什么、担任了什么⻆⾊
-
从这个项⽬中你学会了那些东⻄,使⽤到了那些技术,学会了那些新技术的使⽤
-
另外项⽬描述中,最好可以体现⾃⼰的综合素质,⽐如你是如何协调项⽬组成员协同开发的或者在遇到某⼀个棘⼿的问题的时候你是如何解决的⼜或者说你在这个项⽬⽤了什么技术实现了什么功能⽐如:⽤redis做缓存提⾼访问速度和并发量、使⽤消息队列削峰和降流等等。
Java基础模块
类和对象的概念、区别和联系?
类与对象是整个面向对象中最基础的组成单元。
**类:**是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法);
**对象:**对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。
可以一句话来总结出类和对象的**区别:**类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。
什么是消息队列(MQ)?
MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构,是分布式系统中重要的组件。主要解决应用耦合,异步消息,流量削峰等问题。可实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统中不可缺少的中间件。
MQ的作用?
消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。
解耦:一个业务需要多个模块共同实现,或者一条消息有多个系统需要对应处理,只需要主业务完成以后,发送一条MQ,其余模块消费MQ消息,即可实现业务,降低模块之间的耦合。
异步:主业务执行结束后从属业务通过MQ,异步执行,减低业务的响应时间,提高用户体验。
削峰:高并发情况下,业务异步处理,提供高峰期业务处理能力,避免系统瘫痪。
MQ有什么缺点?
系统可用性降低:
本来系统运行好好的,现在你非要加入个消息队列进去,那消息队列挂了,你的系统不是呵呵了?因此,系统可用性会降低。
系统复杂度提高:
加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。因此,需要考虑的东西更多,复杂性增大。
一致性问题:
A系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。
什么是生产者和消费者?
生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。
什么是阻塞队列?
阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。
网络基础模块
http和https的区别?
http协议和https协议的区别:传输信息安全性不同、连接方式不同、端口不同、证书申请方式不同。
一、传输信息安全性不同
-
http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。
-
https协议:是具有安全性的ssl加密传输协议,为浏览器和服务器之间的通信加密,确保数据传输的安全。
二、连接方式不同
-
http协议:http的连接很简单,是无状态的。
-
https协议:是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。
三、端口不同
-
http协议:使用的端口是80。
-
https协议:使用的端口是443。
四、证书申请方式不同
-
http协议:免费申请。
-
https协议:需要到CA申请证书,一般免费证书很少,需要交费。
DNS是什么?
dns是一个域名系统,是万维网上作为把域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
**意义:**通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。在解析域名时,可以首先采用静态域名解析的方法,如果静态域名解析不成功,再采用动态域名解析的方法,域名是互联网上的身份标识,是不可重复的唯一标识资源; 互联网的全球化使得域名成为标识一国主权的国家战略资源。
某个区域的资源记录通过手动或自动方式更新到单个主名称服务器(称为主 DNS服务器)上,主 DNS 服务器可以是一个或几个区域的权威名称服务器。
CDN是什么?
CDN是指内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器。
通过中心平台的负载均衡内容分发,调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络内。
在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
数据库模块
说说看,你是如何对SQL进行性能优化的?
- EXPLAIN
- SQL语句中IN包含的值不应过多
- SELECT语句务必指明字段名称
- 当只需要一条数据的时候,使用 limit 1
- 如果排序字段没有用到索引,就尽量少排序
- 如果限制条件中其他字段没有索引,尽量少用 or
- 尽量用union all代替union
- 不使用ORDER BY RAND()
- 区分in和exists, not in和not exists
- 使用合理的分页方式以提高分页的效率
- 分段查询
- 避免在 where 子句中对字段进行 null 值判断
- 不建议使用%前缀模糊查询
- 避免在where子句中对字段进行表达式操作
- 避免隐式类型转换
- 对于联合索引来说,要遵守最左前缀法则
- 必要时可以使用force index来强制查询走某个索引
- 注意范围查询语句
- 关于JOIN优化
索引是什么?
索引是帮助MySQL高效获取数据的排好序的数据结构(本质是一种优化查询的数据结构)。
为什么要建立索引?
如果我们不借助任何索引结构帮助我们快速定位数据的话,我们查找一条记录,就要逐行去查找、去比较。从最开始进行比较,发现不是,继续下一行。。。如果表很大的话,有上千万条数据,就意味着要做很多很多次磁盘I/O才能找到。速度是很慢的。
目的就是为了减少磁盘I/O的次数,加快查询速率。
什么时候需要建索引?
-
主键自动建立唯一索引
-
频繁作为查询条件的字段
-
外键关系建立索引
什么时候不需要建索引?
-
表记录太少
-
经常增删改的表
-
数据列存在太多重复的内容没有必要建索引
什么情况索引会失效?
redis的5种数据类型?他们之间的区别?
- string 字符串(可以为整形、浮点型和字符串,统称为元素)
- list 列表(实现队列,元素不唯一,先入先出原则)
- set 集合(各不相同的元素)
- hash hash散列值(hash的key必须是唯一的)
- sort set 有序集合
Tomcat模块
Tomcat性能优化?
- 内存优化
- 并发优化
- 缓存优化
- IO优化
- 开启线程池
- 添加Listener
- 组件优化
分布式模块
分布式锁有哪些方式?
三种实现分布式锁的方式:
- 基于数据库实现排他锁:做唯一性约束,这里如果有多个请求同时提交到数据库的话,数据库会保证只有一个操作可以成功。
- 基于redis实现
- 基于zookeeper实现
什么是负载均衡?
负载均衡,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,从而协同完成工作任务。
负载均衡的基本原理?
任何的负载均衡技术都要想办法建立某种一对多的映射机制:一个请求的入口映射到多个处理请求的节点,从而实现分而治之。
这种映射机制使得多个物理存在对外体现为一个虚拟的整体,对服务的请求者屏蔽了内部的结构。
采用不同的机制建立映射关系,可以形成不同的负载均衡技术,常见的包括:
-
DNS轮询
-
CDN
-
IP负载均衡
负载均衡有哪几种实现方式?
目前最常见的负载均衡应用是Web负载均衡,根据实现的原理不同,常见的web负载均衡技术包括:DNS轮询、IP负载均衡和CDN。其中IP负载均衡可以使用硬件设备或软件方式来实现。
DNS轮询:
DNS轮询是最简单的负载均衡方式。以域名作为访问入口,通过配置多条DNS A记录使得请求可以分配到不同的服务器。
DNS轮询没有快速的健康检查机制,而且只支持WRR的调度策略导致负载很难“均衡”,通常用于要求不高的场景。并且DNS轮询方式直接将服务器的真实地址暴露给用户,不利于服务器安全。
CDN:
CDN(Content Delivery Network,内容分发网络)。通过发布机制将内容同步到大量的缓存节点,并在DNS服务器上进行扩展,找到里用户最近的缓存节点作为服务提供节点。
因为很难自建大量的缓存节点,所以通常使用CDN运营商的服务。目前国内的服务商很少,而且按流量计费,价格也比较昂贵。
IP负载均衡:
IP负载均衡是基于特定的TCP/IP技术实现的负载均衡。比如NAT、DR、Turning等。是最经常使用的方式。
IP负载均衡可以使用硬件设备,也可以使用软件实现。硬件设备的主要产品是F5-BIG-IP-GTM(简称F5),软件产品主要有LVS、HAProxy、NginX。其中LVS、HAProxy可以工作在4-7层,NginX工作在7层。关于三者的简单对比,可以参考这里。
硬件负载均衡设备可以将核心部分做成芯片,性能和稳定性更好,而且商用产品的可管理性、文档和服务都比较好。唯一的问题就是价格。
软件负载均衡通常是开源软件。自由度较高,但学习成本和管理成本会比较大。
项目模块
项目介绍从下⾯⼏个⽅向来考虑
-
对项⽬整体设计的⼀个感受(⾯试官可能会让你画系统的架构图)
-
在这个项⽬中你负责了什么、做了什么、担任了什么⻆⾊
-
从这个项⽬中你学会了那些东⻄,使⽤到了那些技术,学会了那些新技术的使⽤
-
另外项⽬描述中,最好可以体现⾃⼰的综合素质,⽐如你是如何协调项⽬组成员协同开发的或者在遇到某⼀个棘⼿的问题的时候你是如何解决的⼜或者说你在这个项⽬⽤了什么技术实现了什么功能⽐如:⽤redis做缓存提⾼访问速度和并发量、使⽤消息队列削峰和降流等等。
标签:负载,缓存,Java,均衡,队列,面试题,索引,总集,DNS 来源: https://blog.csdn.net/weixin_46017976/article/details/118657507