1. 常见面试问题一

封装、继承、多态的理解

  • 封装
    • 认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口
  • 继承
    • 就是子类继承父类的属性和行为,使得子类对象具有和父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为
    • 可以提高代码的复用性,类与类之间产生联系,是多态的前提
  • 多态
    • 多态指的是对象的多态性,而不是这个类
    • 多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。
    • 代码中的多态性,就是父类引用指向子类对象
    • 多态要有动态绑定,否则就不是多态
    • 三个条件:1、子父类关系 2、有重写 3、要有父类引用指向子类对象

hashmap和hashtable区别

线程key、value继承类遍历方式
HashMap非线程安全允许null继承AbstractMap只支持Iterator迭代器遍历
HashTable线程安全不允许null继承Dictionary类Iterator和Enumeration枚举器
  • 继承不同

    • HashTable继承的是陈旧的Dictionary类,而HashMap继承的抽象类AbstractMap实现了Map接口。
    // HashMap
    public class HashMap<K, V> extends AbstractMap<K, V> implements Cloneable, Serializable {...}
    // Hashtable
    public abstract class AbstractMap<K, V> implements Map<K, V> {...}
    
  • 线程安全不一样

    • HashTable中的方法是同步的,而HashMap中的方法在默认情况下是非同步的。在多线程并发的情况下,可以直接使用HashTable,如果要使用HashMap的话就要自己增加同步处理。
    • 分析源代码可以看到Hashtable的put()方法是synchronized的,而HashMap的put()方法却不是。
  • 允不允许null值

    • Hashtable中,key和value都不允许出现null值,否则会抛出NullPointerException异常。
    • 在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
  • 内部遍历方式不同

    • Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
  • 哈希值的使用不同

    • HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
  • 内部实现方式的数组的初始大小和扩容的方式不一样

    • HashTable的hash数组初始大小是11,增加的方式是old*2+1。
    • HashMap的hash数组默认大小是16,而且一定是2的指数。

ArraryList和LinkList的区别

  • 首先两者都实现了List接口
  • 数据结构不同
    • ArrayList是动态数组实现的,LinkList是链表实现的
  • 效率不同
    • 当随机访问List(get和set操作的时候),ArrayList效率更高,因为linklist是线性的,所以需要指针从前往后依次查找
    • 当对数据进行增、删操作时,LinkList效率更高
  • 自由度不同
    • ArrayList自由度较低,因为它需要手动设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,调用下标进行使用
    • LinkList自由度高,能够动态的随数据量的变化而变化
  • 主要控件开销不同
    • ArrayList主要控件开销在于需要在List列表预留一定空间
    • Linklist主要控件开销在于需要存储结点信息和结点指针信息

spring

  • Spring框架是一种轻量级的、一站式的企业级开发解决方案
  • 最简单的说:你的类(方法,属性)都写好了,spring可以帮你new一个类,可以给你的属性赋值,帮你执行方法。还可以在方法调用中,注入其他代码先或者后执行。这就是spring的核心做的事。
  • cglib动态代理和jdk自带的代理:
    • cglib动态代理 代理类与被代理类是父子关系
    • jdk自带代理使用接口
    • JDK动态代理的两个核心接口(类)分别是InvocationHandler和Proxy。注意:只能代理接口。
    • CGLIB动态代理的两个核心接口(类)分别是MethodInterceptor和Enhancer。是不是跟JDK动态代理很相似,用法也差不多。但CGLIB可以代理类和接口。注意:不能代理final类。

Spring的AOP/IOC

  • AOP
    • AOP(面向切面编程),是一种编程范式,AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化。
    • 优点:
      • 降低模块的耦合度
      • 使系统容易扩展
      • 提高代码复用性
    • 实现AOP的主要设计模式就是动态代理。
  • IOC
    • IOC(控制反转)就是依赖倒置原则的一种代码设计思路。就是把原先在代码里面需要实现的对象创建、对象之间的依赖,反转给容器来帮忙实现。
    • Spring IOC容器通过xml,注解等其它方式配置类及类之间的依赖关系,完成了对象的创建和依赖的管理注入。实现IOC的主要设计模式是工厂模式。
    • 优点:
      • 集中管理,实现类的可配置和易管理。
      • 降低了类与类之间的耦合度。

springboot的启动流程自动装配原理

  • SpringBoot的启动主要是通过实例化SpringApplication来启动的,启动过程主要做了以下几件事情:配置属性、获取监听器,发布应用开始启动事件初、始化输入参数、配置环境,输出banner、创建上下文、预处理上下文、刷新上下文(加载tomcat容器)、再刷新上下文、发布应用已经启动事件、发布应用启动完成事件。

  • 1、创建定时器stopWatch并启动
    2、获取并运行listeners[SpringApplicationRunListeners]
    3、打印banner
    4、创建上下文ApplicationContext(判断是否webEnvironment加载AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext)
    5、预处理上下文(context,listeners,args-ResourceLoader加载类)
    6、刷新上下文(refresh添加后置处理器)
    7、再刷新上下文(sort后置处理器排序)
    8、listeners发布finish(callFinishedListener)
    9、定时器stopWatch停止计时
    10、打印启动日志
    

SpringMVC启动流程

在这里插入图片描述

1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
11.DispatcherServlet响应用户。

Java8大数据类型

​ byte:1byte = 8bit     1个字节是8个bit

short:2byte

int:4byte

long:8byte

float:4byte

double:8byte

boolean:1byte

char:2byte

取值范围:例:byte

byte占用8位,每位用0或1表示,能够表示256(2^8)个数据。 2.这8位分为符号位(最高位)和数值位(剩余七位),符号位0表示正数,1表示负数。计算机是用二进制来表示数据的,一个字节也就是8个比特位,其中最高位表示符号位(0正1负)

故byte的取值范围为1000 0000 到 0111 1111

七层和五层网络模型

在这里插入图片描述

运输层三次握手、四次挥手

UDP:

无连接:意思就是在通讯之前不需要建立连接,直接传输数据。

不可靠:是将数据报的分组从一台主机发送到另一台主机,但并不保证数据报能够到达另一端,任何必须的可靠性都由应用程序提供。

TCP协议:

TCP协议是面向连接的、可靠传输、有流量控制,拥塞控制,面向字节流传输等很多优点的协议。

三次握手:

在通信之前,会先通过三次握手的机制来确认两端口之间的连接是否可用。而UDP不需要确认是否可用,直接传。
在这里插入图片描述

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手:

通信完成后,连接就会被释放,通过四次挥手机制来完成这个事情。
在这里插入图片描述

第一次挥手:从ESTABLISHED变为主动关闭状态,客户端主动发送释放连接请求给服务器端,FIN=1。发送完之后就变为FIN_WAIT_1状态,这个状态可以说是等待确认状态。

第二次挥手:服务器接收到客户端发来的释放连接请求后,状态变为CLOSE_WAIT,然后发送确认报文给客户端,告诉他我接收到了你的请求。为什么变为CLOSE_WAIT,原因是是客户端发送的释放连接请求,可能自己这端还有数据没有发送完呢,所以这个时候整个TCP连接的状态就变为了半关闭状态。服务器端还能发送数据,并且客户端也能接收数据,但是客户端不能在发送数据了,只能够发送确认报文。客户端接到服务器的确认报文后,就进入了FIN_WAIT_2状态。也可以说这是等待服务器释放连接状态。

第三次挥手:服务器端所有的数据度发送完了,认为可以关闭连接了,状态变为被动关闭,所以向客户端发送释放连接报文,发完之后自己变为LAST_WAIT状态,也就是等待客户端确认状态

第四次挥手:客户端接到释放连接报文后,发送一个确认报文,然后自己变为TIME_WAIT,而不是立马关闭,因为客户端发送的确认报文可能会丢失,丢失的话服务器就会重传一个FIN,也就是释放连接报文,这个时候客户端必须还没关闭。 当服务器接受到确认报文后,服务器就进入CLOSE状态,也就是关闭了。但是由于上面说的这个原因,客户端必须等待一定的时间才能够进入CLOSE状态。

网络层(ip协议等):

ARP协议(地址解析协议):通过ip地址来解析主机的mac地址;

IGMP协议(用于多播)

ICMP协议(两部分ICMP差错报告报文、ICMP询问报文)比如我们经常用来测试网络连接畅通的ping命令等
在这里插入图片描述

数据链路层(网络连接):

以太网,局域网,集线器和网桥等。

三个基本问题:封装成帧、透明传输、差错控制以及可靠传输

点对点协议PPP。

物理层(数据传输媒介和原理):

机械特性、电气特性、功能特性、过程特性

几种响应报文状态码:

1xx:表示通知信息的,比如请求收到了或正在进行处理

2xx:表示成功,也就是服务器接收到了你的请求,并成功处理了,一般最喜欢看到的就是200了。200:这次请求成功了。

3xx:表示重定向,服务器告诉浏览器要完成请求你必须采取进一步的行动,也就是去访问另一个网页,

4xx:表示客户的差错,比如请求中有错误的语法或不能完成.404错误:就是找不到资源,就是你的URL写的有错误,使定位不到正确的资源

5xx:服务器的差错,如服务器失效,或者内部出现异常不能完成你的请求. 500错误:就是服务器写的代码中有问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值