摘要:本文首发于的博客转载请注明出处基础抽象类和接口的区别类层面上抽象类与接口都不能被实例化抽象类只能继承一个直接父类,实现多个接口接口能继承多个接口抽象类大多用作模板类使用,接口用于规范模块间的行为方法抽象类可以用有抽象方法,静态方法以及普通方
本文首发于cartoon的博客
转载请注明出处:https://cartoonyu.github.io/c...
抽象类和接口的区别
类层面上
抽象类与接口都不能被实例化
抽象类只能继承一个直接父类,实现多个接口;接口能继承多个接口
抽象类大多用作模板类使用,接口用于规范模块间的行为
方法
抽象类可以用有抽象方法,静态方法以及普通方法;接口只能是抽象方法
抽象类中方法作用域跟普通类没有区别;接口方法只能是公共的
抽象类中可以通过方法间的相互引用实现自身逻辑,接口只能通过子类实现逻辑
抽象类可以拥有构造器,接口没有构造器
变量
抽象类可以有成员变量与静态变量,接口只能有final的静态变量
Object类有哪些成员方法
wait/notify
clone
hashCode/equals
getClass
finalize
克隆有哪些方法
实现Cloneable重写clone方法
实现Serialize接口
Collections有哪些方法
返回线程安全类
synchronizedXxx
返回不可变集合
emptyXxx
singletonXxx
unmotifitableXxx
集合间的转换
对集合内元素进行操作
添加元素到集合中
addAll
copy
查找元素
binarySearch
frequency
indexOfSubList
shuffle
替换
fill
replaceAll
改变元素位置
sort
swap
rotate
reverse
元素对比
min/max
disJoint
java常见异常类
系统级
IllegalAccessException
OutOfMemoryException
类级
ClassNotFoundException
ClassDefFoundException
对象级
NullPointerException
ClassCastException
CloneNotSupportedException
NoSuchFieldException
InstantiationException
方法级
IllegalArgumentException
NoSuchMethodException
操作级
数字
ArithmeticException
NumberFormatException
数组
ArrayStoreException
IndexOutOfBoundException
IO
IOException
FileNotFoundException
EOFException
数据库
SQLException
线程
InterruptedException
类加载机制是怎么样的
步骤
加载
校验
准备
解析
初始化
使用
卸载
双亲委派模型工作原理
类加载器
BootstrapClassLoader
ExtensionClassLoader
ApplicationClassLoader
UserClassLoader
当类被加载到内存时,逐层向上询问父加载器是否能加载,如果所有父加载器都不能加载,则由当前类加载器负责加载
这样做的原因能有效保证类的唯一性
HashMap的扩容机制
HashMap的扩容机制主要依赖于三个元素:capacity(默认为16),loadFactory负载因子,size当前元素个数
当前元素个数大于8时,内部数组自动转换为红黑树进行存储
当前元素个数大于初始容量x负载因子时,数组扩容两倍,且内部元素的位置重新进行哈希
当前元素个数小于初始容量的0.1倍时,数组缩小一半,同样元素位置需要重新哈希
ArrayList扩容机制
ArrayList扩容主要依赖于size(当前元素个数)以及capacity(默认10)的对比
当元素填满当前数组(capacity=size),将capacity扩容到现在的1.5倍,若计算后元素大于Integer.MAX_VALUE时,抛出OOM
ArrayList与LinkedList区别
ArrayList内部为数组,LinkedList内部为双向链表
新增元素
ArrayList涉及到数组扩容(或者伴随着arrayCopy)
LinkedList修改指针指向(或者伴随着遍历操作)
删除元素
ArrayList需要进行arrayCopy
LinkedList遍历链表并修改指针指向
ArrayList大小受Integer.MAX_VALUE影响,LinkedList大小理论上无限(受JVM调用最大内存影响)
ArrayList在插入元素时需要考虑当前容量以及进行arrayCopy操作,LinkedList插入不需要有额外操作
Array与ArrayList区别
存储类型
Array:基本数据类型以及对象
ArrayList:只能对象
大小限制
Array:在定义时指定,无法增大或缩小
ArrayList:定义时可不指定(初始为10),可以扩容
插入元素
Array:插入基本数据类型元素不涉及装拆箱操作
ArrayList:涉及装拆箱操作
Queue中poll与remove区别
poll与remove都是取出队头元素
队列不为空时,两个方法结果是一样的
队列为空
poll返回null
remove抛出NoSuchElementException
线程不同步集合如何转换成线程同步集合
通过Collections工具类返回
锁为读写锁,锁的粒度为对象级
通过java.util.Concurrent进行包装
锁为写锁,锁的粒度为元素级
通常都是用Concurrent进行包装
JVM
垃圾回收算法
标记-清除
标记不清理对象,清理未标记对象
速度快,但是会造成内存碎片
复制
将内存划分两块区域:清理区与存活区
将不清理对象移到存活区,删除清理区的所有对象
空间浪费大
标记-整理
标记不清理对象,清理未标记对象
移动整理存活对象
成本高,但是有效解决内存碎片问题
G1工作流程
初始标记(停顿线程)
标记GC Root直接关联对象
并发标记
从GC Root对堆中对象进行可达性分析
最终标记(停顿线程)
并行将Remembered Set Logs的数据合并到Remembered Set中
筛选回收
根据各Region的回收价值和成本进行回收计划的制定
Spring
Spring中有哪些模块
Spring Core(Spring 核心库)
Spring AOP
Spring ORM
Spring Dao
Spring Web
Spring Context
Spring Web MVC
Spring MVC的处理流程
请求通过DispatchServlet处理
普通逻辑处理交由Controller处理,Controller处理后返回model
视图处理,DispatchServlet调用View temlate进行视图返回
AOP概念
AOP面向切面编程,它将原本纵向的程序看作成一个个切面的组合,是OOP的补充
动态插入执行逻辑到原有执行流程中
通知(Advice):具体实现逻辑
连接点(JoinPoint):使用通知的位置
切入点(PointCut):指定使用通知的连接点位置
切面(Aspect):通知与切入点集合
引入(introduction):添加新方法属性到现有类中
目标(target):被通知的对象
代理(proxy)
静态代理
动态代理
织入(weaving):将切面引用到目标对象生成代理对象的过程
Spring bean的作用域
singleton(默认)
prototype
request
session
globalSession
数据库
MyBatis中#与$区别
传入数据
:当作字符串传入sql,相当于PrepareStatement
$:直接将参数传入sql,相当于Statement
安全性
可以防止sql注入,$不能
事务的四个特性
一致性
事务执行前后都是一致的
原子性
事务中操作结果都是一样的
隔离性
事务间的操作是相互隔离的
持久性
事务的执行结果是永久性的
char与varchar区别
char的长度是固定的,varchar的长度是不固定的
char会用空格填充到指定长度,varchar不会
char类型数据后面空格会被删除,varchar不会
char的检索效率比varchar高
逻辑分页与物理分页
逻辑分页会将全部数据加载到内存中,再利用代码逻辑返回分页结果
物理分页是在数据库层面进行分页
MyBatis的分页方式
数组分页
sql分页
拦截器分页
RowBounds分页
数据库三范式
第一范式
属性已经是不能分割的数据单位
第二范式
所有非主属性完全依赖于候选属性
第三范式
不存在传递依赖候选属性
内连接外连接区别
内连接只返回符合条件的共有记录
外连接会返回表的所有记录,插入符合条件的列
操作系统
线程与进程的区别
进程是操作系统分配资源时间的最小单位,线程是进程内部调用的实体
不同进程拥有操作系统分配的不同地址空间,同一进程的不同线程共享父进程的内存地址
进程的资源与空间由操作系统分配,线程资源与空间由进程分配
进程切换开销比线程大
进程崩溃不会造成对其他进程的影响;线程崩溃造成父进程的死亡
进程拥有一个程序运行的入口,线程依附进程生存
网络
http方法有哪些
方法
get
post
delete
put
options
connect
trace
link
unline
head
get与post的区别
幂等
get为幂等操作,post为非幂等操作
数据传输
get的数据通过url进行传输,post数据通过http报文传输
get数据大小受url长度限制,post不受限制
可缓存
get数据可缓存,post数据不可缓存
http报文
get的报文没有实体,post的报文有实体
forward与redirect区别
行为方
forward是浏览器行为
redirect是服务器行为
url是否改变
forward url不变
redirect url改变
资源消耗
forward的资源消耗比redirect小
数据共享
redirect不共享数据,forward可以共享request数据
效率
forward高
redirect低
TCP三次握手
一次握手(客户端发起)
创建TCB
发送SYN=1,seq=x
进入SYN-SENT
二次握手(服务器发起)
发送ACK=1,syn=1,ack=y+1,seq=x+1
进入SYN-RCVD
三次握手(客户端发起)
发送ACK=1,seq=x+1,ack=x+1
进入ESTABLISHED
UDP与TCP区别
TCP面向连接,UDP不面向连接
TCP有拥塞控制,UDP没有拥塞控制
TCP资源开销大,UDP资源开销小
TCP只支持一对一,UDP支持一对多
TCP提供可靠传输,UDP尽可能交付
TCP面向字节流,UDP面向报文
设计模式
单例模式实现的三种方法
https://www.cnblogs.com/ngy02...
静态内部类
懒汉式
双重检查式
BIO NIO AIO
BIO
同步阻塞
线程阻塞进行运算后返回结果
NIO
同步非阻塞
请求共用一个线程进行处理
线程会直接返回结果到请求
AIO
异步非阻塞
线程处理后会通过回调返回结果
反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
动态代理以及静态代理
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75464.html
摘要:然而,异步函数不会立即被推入调用堆栈,而是会被推入任务队列,并在调用堆栈为空后执行。将事件从任务队列传输到调用堆栈称为事件循环。我们调用接受和或返回另一个函数称为高阶函数的函数。 为了保证可读性,本文采用意译而非直译 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 1.如何理解 JS 中的this关键字? JS 初学者总是对 this 关键字感到困惑,因为与其他现...
摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...
摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...
摘要:并总结经典面试题集各种算法和插件前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快速搭建项目。 本文是关注微信小程序的开发和面试问题,由基础到困难循序渐进,适合面试和开发小程序。并总结vue React html css js 经典面试题 集各种算法和插件、前端视频源码资源于一身的文档,优化项目,在浏览器端的层面上提升速度,帮助初中级前端工程师快...
阅读 1050·2021-11-22 15:35
阅读 1686·2021-10-26 09:49
阅读 3232·2021-09-02 15:11
阅读 2078·2019-08-30 15:53
阅读 2637·2019-08-30 15:53
阅读 2919·2019-08-30 14:11
阅读 3529·2019-08-30 12:59
阅读 3243·2019-08-30 12:53