1、ArrayList怎么扩容
ArrayList默认初始容量大小为10,以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。
- 取到老数组长度
- 如果
minCapacity - elementData.length > 0
,则进行扩容 - 计算新数组长度
int newCapacity = oldCapacity + (oldCapacity >> 1)
,相当于扩容1.5倍 - 老数组copy到新数组
2、Jdk空接口的作用
Serializable 接口之所以定义为空,是因为它只起到了一个标识的作用,告诉程序实现了它的对象是可以被序列化的,但真正序列化和反序列化的操作并不需要它来完成。
定义空接口的初衷,打个比方,就像你知道自己要做某件事(比如监听事相关类型的件),但自己还拿不出具体措施(也可以说这时候还无从下手,因为要监听的事件类型和处理方式都各不相同)。这时,空接口就相当一个占位符的作用。这样带来的另外一个好处是,拿前面的比喻来说,不管你定义了哪些事件监听器,你最后都可以找到他们最古老的根(EventListener
),类的层次也就被刻画出来了,所有各种类型的监听器都被划到一个具有相同含义的种属(Catalog)EventListener
下,而不是泛意义上的Object下。
3、htt协议content-type 和 accept区别
Content-Type(内容类型),一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。这个就是经常看到一些网页打开之后会下载一个文件或者是一张图片的原因。
Content-Type代表发送端(客户端/服务器)发送的实体数据的数据类型。
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
Accept用来指定什么媒体类型的响应是可接受的,即告诉服务器我需要什么媒体类型的数据,此时服务器应该根据Accept请求头生成指定媒体类型的数据。
Accept表示客户端(浏览器)支持的类型,也是希望服务器响应发送回来的数据类型。
Accept: text/html # 一个精确的MIME类型
Accept: image/* # 匹配如image/png、image/gif等的任何图像类型
Accept: */* # 任何MIME类型
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8 # q是因子权重
- Content-Type属于实体头Response Header,Accept属于请求头Request Header
Accept代表客户端希望接收到的类型,如Accept: application/json;charset=UTF-8,代表接收JSON数据格式的数据;Content-Type代表服务器发送实体数据的类型,如Content-Type: application/xml,代表发送XML数据格式的数据。
3、DispatcherServlet线程安全?
在web容器中对
DispatcherServlet
初始化的时候是放在Synchronized
修饰的同步代码块中实现的,可以保证Servlet创建和初始化的时候是对线程可见的,因此可以保证DispatcherServlet
调用initStrategies()
方法是可以把成员变量刷新到主存中的。但是值得注意的是在DispatcherServlet
中有一些变量是未被static final
修饰的,这不会引起线程不安全么?/** Detect all HandlerMappings or just expect "handlerMapping" bean? */
private boolean detectAllHandlerMappings = true;
/** Detect all HandlerAdapters or just expect "handlerAdapter" bean? */
private boolean detectAllHandlerAdapters = true;
/** Detect all HandlerExceptionResolvers or just expect "handlerExceptionResolver" bean? */
private boolean detectAllHandlerExceptionResolvers = true;
/** Detect all ViewResolvers or just expect "viewResolver" bean? */
private boolean detectAllViewResolvers = true;
/** Throw a NoHandlerFoundException if no Handler was found to process this request? **/
private boolean throwExceptionIfNoHandlerFound = false;
/** Perform cleanup of request attributes after include request? */
private boolean cleanupAfterInclude = true;
/** MultipartResolver used by this servlet */
private MultipartResolver multipartResolver;
/** LocaleResolver used by this servlet */
private LocaleResolver localeResolver;
/** ThemeResolver used by this servlet */
private ThemeResolver themeResolver;
/** List of HandlerMappings used by this servlet */
private List<HandlerMapping> handlerMappings;
/** List of HandlerAdapters used by this servlet */
private List<HandlerAdapter> handlerAdapters;
/** List of HandlerExceptionResolvers used by this servlet */
private List<HandlerExceptionResolver> handlerExceptionResolvers;
/** RequestToViewNameTranslator used by this servlet */
private RequestToViewNameTranslator viewNameTranslator;
/** FlashMapManager used by this servlet */
private FlashMapManager flashMapManager;
/** List of ViewResolvers used by this servlet */
private List<ViewResolver> viewResolvers;
但仔细查看这些变量的使用处,发现都是在
initStrategies()
初始化时调用的init方法中进行了赋值,这样就可以保证未被安全修饰符修饰的变量始终是可见的,尽管它们未被修饰,但是并不会影响到DispatcherServlet
的可见性。4、TCP和UDP的区别?
HTTP知识的面试题
UDP一次最大传输多少字节?
65507字节 约等于 64K (千字节 Kilobyte)
因为UDP包头有2个byte用于记录包体长度。2个byte可表示最大值为:216-1 = 64K-1=65535
UDP包头占8字节, ip包头占20字节, 65535-28 = 65507