面试专用JAVA快速通关
Posted RyouJou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试专用JAVA快速通关相关的知识,希望对你有一定的参考价值。
Java篇
JVM
001.谈谈对Java的理解
<需要对JAVA语言特点做汇总>
JAVA语言特点有以下方面:
1.平台无关性(一次编译到处运行)
2.GC垃圾回收机制
3.语言特性(泛型,反射,Lambda表达式)
4.面向对象(封装,继承,多态)
5.类库
6.异常处理
002.如何实现平台无关性
<.java文件 -> .class文件 -> 指令>
JAVA源码首先被编译成字节码,再由<不同平台的JVM进行解析>,
Java语言在不同的平台上运行时不需要进行重新编译,Java虚拟机在执行字节码的时候,把字节码转换成对应平台的机器指令
# <过程>
1.编写java源码
2.javac 编译指令(语法检查等)
3.编译后生成.class文件(二进制文件);
<可以通过javap -c xxx 反编译>
4. java命令执行.class文件
003.什么是JVM
1.<Java虚拟机(JVM)是一种抽象化的计算机>
<是一个内存中的虚拟机,JVM的存储就是内存>,仿真模拟各种计算机的功能
2.JVM也<有自己完善的架构>,如处理器,堆栈, 寄存器,指令系统等
3.<JVM屏蔽了与具体操作系统相关的信息>,不需要知道运行原理,<可以专注写java代码>,剩下的事情由jvm帮我们解析字节码去运行
4.这就是JVM存在的原因
5.JVM内存结构模型和GC就是我们平时需要掌握的
004.谈谈JVM的内存架构
<整个JVM大致分为五个部分>
<Class Loader 类加载器>
依据特定格式加载class文件到内存
<Runtime Data Area 运行时数据区>
JVM内存空间结构模型
方法区,堆 ; 本地方法栈,java栈,程序计数器
<Execution Engine 执行引擎>
对命令进行解析
<NativeInterface 本地接口>
融合不同开发语言的原生库为java所用
需要一些较高执行性能的时候需要调用其他语言来处理(C++),JVM开辟了一块为Native的内存来调用方法
<NativeLibrary 本地接口库>
Native接口写好的库
005.什么是反射reflect
JAVA反射机制是<在运行状态中>,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性;这种<动态获取信息>以<动态调用对象方法>的功能称为java语言的反射机制
006.谈谈ClassLoader,编译到执行过程
1.编译器将.java源文件编译成Robot.class字节码文件
2.ClassLoader将字节码转换为JVM中的Class<Robot>对象
框架篇
SpringBoot
001.常用注解
# 项目配置注解
<@SpringBootApplication 复合注解>
是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解。
<@SpringBootConfiguration:标注当前类是配置类>
这个注解继承自@Configuration。并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
<@EnableAutoConfiguration:是自动配置的注解>
这个注解会根据我们添加的组件jar来完成一些默认配置,我们做微服时会添加spring-boot-starter-web这个组件jar的pom依赖,这样配置会默认配置springmvc 和tomcat
<@ComponentScan:扫描当前包及其子包>
被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。
等价于<context:component-scan>的xml配置文件中的配置项。
<@Autowired>是spring的自动装配,从bean 工厂中获取一个bean时,这个注解可以用到构造器,变量域,方法,注解类型上。
<@Resource>一样都可以用来装配bean,不是spring提供的,是属于J2EE规范的注解。
<@MapperScan:spring-boot支持mybatis组件>
的一个注解,通过此注解指定mybatis接口类的路径,即可完成对mybatis接口的扫描。
<@mapper需要加在每一个mapper接口类上面>
# 三层注解
<@Controller 表明这个类是一个控制器类>
<@RequestMapping 使用拦截请求>,如果不在method中注明请求的方式,默认是拦截get和post请求。这样请求会完成后转向一个视图解析器。
<@ResponseBody注解>前后端会做分离。返回json数据
<@RestController 复合注解>是@Controller 和@ResponseBody的结合
<@GetMapping><@PostMapping><@PutMapping><@DeleteMapping>Rest风格
<@CrossOrigin>可以为整个controller配置启用跨域,也可以在方法级别启用
<@PathVariable>路径变量注解,@RequestMapping中用{}来定义url部分的变量名
<@Service 注解用来标记业务层的组件>
@Resource默认按照名称方式进行bean匹配
@Autowired默认按照类型方式进行bean匹配
<@Repository 作为DAO对象,管理操作数据库的对象>
<@Component>通用注解,其他三个注解是这个注解的拓展
<@Transactional>通过这个注解可以声明事务,可以添加在类上或者方法上
<@Configuration>配置类
# 拦截注解
<@ControllerAdvice>Controller的统一处理注解
<@ExceptionHandler>配合完成统一异常拦截处理
<@RestControllerAdvice>可以将异常以json的格式返回数据
002.Spring IOC(控制反转,面向对象)
配置 + 类型 = IOC容器
# <如何优先装配bean(bean歧义冲突)>
@Primary 优先装配,防止bean歧义冲突
# <如何主动获取Bean根据命名获取>
@Repository("alphadao")// 重新命名这个bean的名字
//主动获取ioc容器中自定义名字的bean
alphaDao = applicationContext.getBean("alphadao",AlphaDao.class);
# <Bean的生命周期>
@PreDestroy,在bean销毁之前执行
@PostConstruct,在bean初始化之后构造执行
# <如何IOC容器每次创建新的bean>
<IOC容器的bean默认是单例模式,只创建一次>
<@Scope("prototype")>创建多个bean
<@Scope("singleton")>默认是单例模式,只创建一次bean
# <如何自动装配指定名字的bean>
@Repository("alphadao")
@Autowired
@Qualifier("alphadao")
003.Spring Application做了什么
# <spring应用 运行了启动>
SpringApplication.run() 这个类做了什么?
<@SpringBootApplication>=
@SpringBootConfiguration(配置文件) +
@EnableAutoConfiguration(启动自动配置) +
@ComponentScan(组件扫描) + ……
1.启动Tomcat
2.自动创建了一个spring容器
3.自动装配bean
SpringCloud
001.万变不离其综,微服务的4个核心问题
根本原因:网络不可靠
1.API 路由问题
2.HTTP,RPC通信问题
3.注册和发现,高可用问题
4.熔断机制
002.什么是微服务,如何独立通讯
<提倡将单一的应用程序划分成一组小的服务>,每个服务运行在其独立的自己的进程内,服务间互相协调,互相配置,为用户提供价值。<服务之间采用轻量级的通信机制互相沟通,每个服务都围绕具体的业务进行构建,并且能够独立部署到生产的环境中>。
1.API 路由问题
2.HTTP,RPC通信问题
3.注册和发现,高可用问题
4.熔断机制
003.什么是服务熔断,什么是服务降级
根本原因:网络不可靠
1.API 路由问题
2.HTTP,RPC通信问题
3.注册和发现,高可用问题
4.熔断机制
004.SpringCloud和Dubbo和Alibaba的区别
根本原因:网络不可靠
1.API 路由问题
2.HTTP,RPC通信问题
3.注册和发现,高可用问题
4.熔断机制
计算机网络篇
网络协议(四,七层)
OSI七层(仅供参考模型)
TCP/IP (主流)
(应用层,传输层,网络层,链路层)
TCP
<TCP三大特性> <ACK确认和SYN序号> <源端口和目的端>
<seq序号><TCP滑动窗口><>
1. 能不能说一说 TCP 和 UDP 的区别?
2. 说说 TCP 三次握手的过程?
3. 说说 TCP 四次挥手的过程?
001.能不能说一说 TCP 和 UDP 的区别?
# <一句话 概括>:
TCP是一个<面向连接的、可靠的、基于字节流的传输层协议>。
而UDP(用户数据报)是一个面向无连接的传输层协议。
# 详细:
<TCP 三大特性 >:
1.<面向连接>。是客户端和服务器的连接,在双方互相通信之前,TCP 需要<三次握手建立连接>,而 UDP 没有相应建立连接的过程
2.<可靠性>。体现在<有状态, 即ACK确认和序号>,<可控制>。
TCP有状态:<保证数据包按序到达,精准记录哪些数据发送了,哪些数据被对方接收了>
TCP可控制:丢包了或者网络环境不佳,<控制自己的发送速度或者重发>
3.<面向字节流>UDP 的数据传输是基于数据报的,
而 TCP 为了维护状态,将一个个<IP包变成了字节流>
# <IP协议和TCP协议>
< IP是无连接的通信协议 ,是不可靠的>
所以需要它的上层协议TCP传输控制协议来传输,增加可靠性
002.说说 TCP 三次握手的过程?
# <一句话 概括>
以<谈恋爱>为例,就是确认<各自爱和被爱的能力>
<男方主动,女方被动>
<第一次:>
男: 我爱你。
女方收到。
由此证明男方拥有爱的能力。
<第二次:>
女: 我收到了你的爱,我也爱你。
男方收到。
OK,现在的情况说明,女方拥有爱和被爱的能力。
<第三次:>
男: 我收到了你的爱。
女方收到。
现在能够保证男方具备被爱的能力。
由此<完整地确认了双方爱和被爱的能力>,两人开始一段甜蜜的爱情。
# 详细
<三次握手过程 - closed - listen -sent>
从最开始双方都处于<CLOSED状态>。然后服务端开始监听某个端口,进入了<LISTEN状态>。
然后客户端主动发起连接,发送 SYN , 自己变成了SYN-<SENT状态>。
服务端接收到,返回SYN和ACK(对应客户端发来的SYN),自己变成了SYN-REVD。
之后客户端再发送ACK给服务端,自己变成了ESTABLISHED状态;服务端收到ACK之后,也变成了ESTABLISHED状态。
另外需要提醒你注意的是,从图中可以看出,SYN 是需要消耗一个序列号的,下次发送对应的 ACK 序列号要加1,为什么呢?只需要记住一个规则:
<凡是需要对端确认的,一定消耗TCP报文的序列号>
# <为什么不是两次?>
根本原因: 无法确认客户端的接收能力。
# <为什么不是四次?>
当然可以,100 次都可以。但为了解决问题,三次就足够了,再多用处就不大了。
# <三次握手过程中可以携带数据么?>
<第三次握手的时候,可以携带>。前两次握手不能携带数据。
如果前两次握手能够携带数据,有人想攻击服务器,增大了<服务器被攻击的风险>。
003.说说 TCP 四次挥手的过程?
# <一句话 概括>
以<分手>为例,就是确认<不爱的能力和分手通知>
<男方主动,女方被动>
<第一次:>
男: 我不爱你了。
女方收到。
由此证明男方已经不爱。
<第二次:>
女:
1.我知道了,我不爱你了。
<第三次:>
2.我们分手吧
男方收到。
OK,现在的情况说明,女方不爱了和想分手了。
<第四次:>
男: 我收到了你的分手。
女方收到。
由此<完整地确认了双方真正分手>
<等待2MSL><挥手是为了终止连接>
<等待是为了避免新旧连接混淆>
<为了确保有足够时间让对方收到ack包>
# <为什么需要四次>
因为全双工,发送方和接受方都需要FIN报文和ACK报文
004.HTTP和TCP/IP
TPC/IP协议是<传输层协议>,主要解决数据如何在网络中传输
而HTTP是<应用层协议>,主要解决如何包装数据
HTTP超文本传输协议
1.主要特点
2.请求响应的步骤
3.输入URL后,按下回车之后的流程
4.HTTP状态码
001.主要特点?
支持客户/服务端模式
简单快速
灵活
无连接
无状态
002.请求响应的步骤?
客户端连接到Web服务器
发送HTTP请求
服务器接受请求并返回HTTP响应
释放TCP连接
客户端浏览器解析html内容
003.输入URL后,按下回车之后的流程?
DNS解析域名对应的地址
(浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,DNS缓存)
建立TCP连接
发送HTTP请求
服务器处理请求并返回HTTP报文
浏览器解析渲染页面
连接结束
004.HTTP状态码
<五种可能的取值,1~5代表处理过程>
1xx 表示请求已接收,继续处理
2xx 正常接收
3xx 重定向,初步完成请求需要进一步操作
4xx 客户端错误 请求无法实现
5xx 服务端错误 不能响应合法的请求
<详细>
200: 正常返回信息
400: Bad Request 客户端请求语法错误,服务端不能理解
401: Unauthorized 请求未授权
403: Forbidden 服务器收到请求,但是拒绝提供服务
404: Not Found 请求资源不存在 eg.错误URL
500: Internal Server Error 服务器发生不可预期的错误 eg.服务器抛出异常代码健壮性不佳
503: Server Unavailable 服务器当前不能处理请求,一段时间后可能恢复 eg.连接池满了
005.Get请求和Post请求区别
<三个层面>
http报文层面:get请求信息放在url中,post放在报文体中
数据库层面:get符合幂等性和安全性,post不符合
其他层面:get可以被缓存存储,post不行
006.Cookie和Session
Cookie数据存放在客户的浏览器上,Session数据放在服务器上
Session相对于Cookie更安全
Session会占用服务器,若考虑减轻服务器压力,应当使用Cookie
<Cookie 客户端保存机制>
服务器发给客户端的特殊信息,以文本的形式存放在客户端
客户端再次请求的时候,会把Cookie回发
服务器接收到后,会解析Cookie生成与客户端相对应的内容
<Session 服务端保存机制>
服务端的机制,在服务器上保存的信息
解析客户端请求操作并操作session id,按需保存状态信息
<Session 实现方式>
方式一:<Cookie来实现>在发送Cookie时候绑定一个JSessionID在Cookie头中,下次请求的时候<携带这个头>
方式二:<URL回写来实现>通过URL返回的新URL链接携带一个JSessionID
以上是关于面试专用JAVA快速通关的主要内容,如果未能解决你的问题,请参考以下文章