这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
前言
又到了巩固自身知识(复习面试题)的时候了,之前有过几次被问到的问题,刚好借助这次机会填补一下,顺便对自己温故而知新一下。
历练
Get和Post请求的区别
答:本质上没有区别,Get、Post请求本质都是HTTP的请求,而Http的请求底层都是TCP/IP ;要说明面上的区别就是,常规的获取请求用Get,Get请求在url上传参,Post请求在requestBody传参;但其实get在请求体,post在url传参技术上也是行得通的。
Get请求有传输大小限制 (2KB) ,Post理论上没有,但其实也有
SpringMVC 的流程
关于Spring MVC的执行原理可以说是老生常谈了,但是还是需要熟悉的
- 用户发送请求到前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器
- 处理器映射器找到具体的处理器(xml、注解),生成处理器对象及处理器拦截器(有的话)一并返回给DisPatcherServlet(前端控制器)
- DispatcherServlet调用HandlerAdapter处理器适配器
- HandlerAdapter经过适配调用具体的处理器(controller控制器)
- controller处理完返回ModelAndView(一般出现在前后端不分离的时候)
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将modelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体的View
- DispatcherServlet拿着view渲染并响应用户
List 详解
List在Java里边是一个接口,常见的实现类又ArrayList和LinkedList,在开发中用得比较多的是ArrayList
ArrayList的底层是数组;
-
与原生数组对比,为什么还要用ArrayList
- 原生数组有一个特点,需要为它指定大小,而ArrayList不需要;
- 在 new ArrayList() 的时候,默认会有一个object数组,大小为0.当我们第一次 add 添加数据时,会给这个数组初始化一个大小,这个大小默认值为 10。
- 原生数组的大小是固定的,而ArrayList的大小是可变的;是因为ArrayList实现了动态扩容:
- 在每一次add 的时候,都会先去计算数组够不够空间,如果空间足够,则直接添加进去。如果不够,那就得扩容;
- 在ArrayList的源码中,有一个grow方法,每一次的扩容原来1.5倍。比如说初始值是10,现在插入第11个元素,发现数组的空间不够,所以会扩容到15;
- 在空间扩容后,会调用arraycopy 对数组进行拷贝。
-
为什么说日常生活中使用较多的是ArrayList
有底层的数据结构来决定,在日常的开发中,遍历的需求比增删要多,即使是增删往往只需要add(尾部)进去就可以了,在尾部添加元素,ArrayList的时间复杂度也就O(1);
另外,ArrayList的增删底层调用的copyOf()被优化过,现代CPU对内存可以块操作,ArrayList的增删一点也不会比LinkedList慢。
-
Vector 是否有了解
Vector的底层结构是数组,一般我们现在已经很少使用了。相比较ArrayList,它是线程安全的,在扩容的时候它是直接扩容两倍。
继承 Collection 接口的集合有哪些?
-
List 是继承自Collection:
public interface Listextends Collection -
Set 是继承自Collection:
public interface Setextends Collection -
Map 不是
-
Iterator接口未实现Collection接口
-
Vector定义为
public class Vectorextends AbstractList implements List, RandomAccess, Cloneable, Serializable
Vector实现了List接口自然实现了Collection接口
总结
今天的总结,算是小小杂谈,在上班的途中,脑海里不断演练常见的面试题,自己会怎么回答,答不出来的便记录在案,算是为今天巩固一番