这是本人备战面试过程中的一些笔记,本想抽空整理下再分享的,现在工作都半年了也没有去整理[尴尬]。所以现在直接发布了,中间没有补全的知识点自行学习吧,希望对于正在找工作的你有帮助!https://blog.csdn.net/liangshilin
1、哈夫曼树构建?
视频:https://v.qq.com/x/page/t0703gjawwz.html
n个权值构建哈夫曼树,节点数为:2n-1
哈夫曼树带权路径长度为除根节点外其他节点的和
2、数据库保护分别包括?
- 安全性控制(尽可能杜绝所有可能的数据库非法访问。方法:用户标识和鉴定、用户存取权限控制、定义视图、数据加密和审计)
- 完整性控制(数据库的完整性是指保护数据的正确性、有效性和相容性,防止错误的数据进入数据库造成无效操作。方法:约束,默认值,规则,存储过程,触发器)
- 并发性控制(保证多用户存取情况下,保持数据库中数据的一致性。方法:封锁技术和时标技术)
- 数据恢复(如果数据遭到破坏能够恢复到某一正确状态。方法:数据冗余、数据转储)
详细地址:https://blog.csdn.net/u011589338/article/details/78986703
3、TreeMap?
TreeMap 是一个有序的key-value集合,它是通过红黑树实现的;继承与AbstractMap,支持一系列导航方法、克隆、和序列化;非同步(即不是线程安全)
广度优先搜索用到的数据结构是:队列
深度优先搜索用到的数据结构是:数组
4、网络七层协议?
层 | 名称 | 数据类型 | 应用 |
---|---|---|---|
7 | 应用层 | APDU | 网关 |
6 | 表示层 | PPDU | |
5 | 会话层 | SPDU | |
4 | 传输层 | TPDU | |
3 | 网络层 | 报文 | 路由 |
2 | 数据链路层 | 帧 | 网桥、交换机 |
1 | 物理层 | 比特bit | 中继器、集线器 |
排序算法? https://www.cnblogs.com/onepixel/articles/7674659.html
查找算法? https://www.cnblogs.com/yw09041432/p/5908444.html
1、算法复杂度与初始状态无关的有:选择排序、堆排序、归并排序、基数排序。
2、元素总比较次数与初始状态无关的有:选择排序、基数排序。
3、元素总移动次数与初始状态无关的有:归并排序、基数排序。
5、实现同步的方式?
1.同步方法(synchronized 内置锁会保护整个方法,如果修饰的是静态方法,调用将会锁住整个类。)
2.同步代码块(synchronized 锁对象一般用this)
同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。
3.使用特殊域变量volatile
a.volatile关键字为域变量的访问提供了一种免锁机制,
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,
c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
4.使用重入锁实现线程同步(ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用synchronized方法和块具有相同的基本行为和语义,并且扩展了其能力。)
5.使用局部变量实现线程同步(ThreadLocal)
6、HTTP和HTTPS协议?
https://blog.csdn.net/xiaoming100001/article/details/81109617
7、二叉平衡树?
性质: 它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点总数的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci(斐波那契)数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。
8、三次握手?https://blog.csdn.net/qq_38950316/article/details/81087809
9、四次挥手?https://blog.csdn.net/qq_38950316/article/details/81087809
10、Java类的加载过程?
七个过程:加载>验证>准备>解析>初始化>使用>卸载
11、如何确保TCP的可靠性?
- 验证和
- 连接管理
- 重发控制
- 序列号
- 确认应答
- 窗口控制
12、乐观锁?悲观锁?
13、 哈希处理冲突的方式?
https://www.cnblogs.com/guweiwei/p/6945700.html
14、Java 8 Optional 类
Optional 类是一个可以为null的容器对象。如果值存在则isPresent() 方法会返回true,调用 get() 方法会返回该对象。
ofNullable(val) 允许传递空值,of(val) 传递空值抛NullPointerException异常,orElse(otherVal) 如果值不为空,返回值,否则返回otherVal。
15、TCP 套接字(Socket)执行过程?
服务端: 创建套接字create > 绑定端口bind > 监听连接listen > 接受请求accept,并返回新的套接字 > 用新返回的套接字接收/发送recv/send > 关闭套接字close.
客户端: 创建套接字create > 发起连接请求connect > 发送接收数据send/recv > 关闭套接字close.
16、死锁的必要条件?
- 互斥
- 循环等待
- 不可剥夺
- 请求保持
17、进程通信方式?
- 信号量Semaphore
- 命名管道FIFO
- 管道pipe
- 消息队列MQ
- 套接字Socket
- 共享存储ShareMemory
- 信号sinal
18、耦合类型?
- 内容耦合(1. 一个模块直接访问另一个模块的内部数据; 2. 一个模块不通过正常入口转到另一模块内部; 3.两个模块有一部分程序代码重迭(只可能出现在汇编语言中); 4.一个模块有多个入口。 )
- 公共耦合(若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。 )
- 外部耦合( 一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。 )
- 控制耦合(如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。 )
- 标记耦合(一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,而不是简单变量。)
- 数据耦合(一个模块访问另一个模块时,彼此之间是通过简单数据参数 (不是控制参数、公共数据结构或外部变量) 来交换输入、输出信息的。)
- 非直接耦合(两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。)
19、 调度分类及意义?
- 短程调度:又称进程调度,从进程的就绪队列选择一个进程运行。
- 中程调度:又称为对换。和内存管理相关,主要是为了提高内存的利用率引入的。
- 长程调度:又称作业调度。从磁盘上的后备作业队列中选取对应的作业调入内存。
Java中所有的类都直接或间接的继承了Object,接口(Interface)与类平行,不属于类。
20、Ant和Maven?
- Ant是软件构建工具,Maven的定位是软件项目管理和理解工具。
- Ant的特点: 没有一个约定的目录结构(必须明确让ant做什么,什么时候做,编译,打包);没有生命周期,必须定义目标及任务序列;没有集成依赖管理
- Maven的特点: 拥有约定,知道你的代码在哪里;拥有生命周期;拥有依赖管理,仓库管理。
21、类间常见关系?
- "USES-A"关系 -> 依赖关系
- "HAS-A"关系 -> 组合关系
- "IS-A"关系 -> 继承关系
22、排列组合算式?
排列,例:ABC的全排列有:A(m,n)=n!/(m-n)! => A(3,3)=3!/(3-3)! => 321/0! => 6/1=6 排列方式有:ABC,BAC,CBA,ACB,BAC,CAB.
组合,列:ABCD随意选两个组合,则:C(n,m)=n!/(n-m)!m! => C(4,2)=4!/(4-2)!2! => 4321/2121 => 6 组合方式有:AB,BC,CD,AD,AC,BD。
注:0!=1
23、@Controller和@RestController的区别是什么?
- 使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面。
- 使用@RestController注解相当于@ResponseBody + @Controller合在一起的作用,返回json等内容到页面。
24、Servlet的生命周期?Servlet是否单例?
-
Servlet的生命周期包含四个阶段:
1、加载和实例化
2、初始化 init()
3、处理请求 service()
4、服务终止 destroy() -
Servlet是否是单例?
是的。因为:
1、Servlet单实例,减少了产生servlet的开销;
2、通过线程池来响应多个请求,提高了请求的响应时间;
3、Servlet容器并不关心到达的Servlet请求访问的是否是同一个Servlet还是另一个Servlet,直接分配给它一个新的线程;如果是同一 个Servlet的多个请求,那么Servlet的service方法将在多线程中并发的执行;
4、每一个请求由ServletRequest对象来接受请求,由ServletResponse对象来响应该请求;
Servlet的生命周期 https://www.cnblogs.com/lgk8023/p/6427977.html
Servlet是否是单例 https://blog.csdn.net/xiaojiahao_kevin/article/details/51781946
25、重定向与转发?
重定向请求服务器两次,转发访问服务器一次。
https://blog.csdn.net/qq_34111779/article/details/78164027
26、Volatile关键字?
- volatile关键字一定能保证线程安全吗?不一定。线程安全需要保证可见性、有序性和原子性,而volatile关键字只能保证可见性和有序性,所以不一定线程安全。
https://www.cnblogs.com/kubidemanong/p/9505944.html
27、Statement、PreparedStatement和CallableStatemen?
-
Statement、PreparedStatement和CallableStatement都是接口(interface)。
-
Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。
-
Statement接口提供了执行语句和获取结果的基本方法;
PreparedStatement接口添加了处理 IN 参数的方法;
CallableStatement接口添加了处理 OUT 参数的方法。 -
a.Statement:
普通的不带参的查询SQL;支持批量更新,批量删除;
b.PreparedStatement:
可变参数的SQL,编译一次,执行多次,效率高;
安全性好,有效防止Sql注入等问题;
支持批量更新,批量删除;
c.CallableStatement:
继承自PreparedStatement,支持带参数的SQL操作;
支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持; -
Statement每次执行sql语句,数据库都要执行sql语句的编译 ,
最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。PreparedStatement是预编译的,使用PreparedStatement有几个好处
-
在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。
-
安全性好,有效防止Sql注入等问题。
-
对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;
-
代码的可读性和可维护性。
28、事务?
事务属性的种类:传播行为、隔离级别、只读和事务超时。
- 传播行为定义了被调用方法的事务边界。
传播行为 | 意义 |
---|---|
PROPERGATION_MANDATORY | 表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常 |
PROPAGATION_NESTED | 表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIRED 看起来没什么俩样 |
PROPAGATION_NEVER | 表示方法不能运行在一个事务中,否则抛出异常 |
PROPAGATION_NOT_SUPPORTED | 表示方法不能运行在一个事务中,如果当前存在一个事务,则该方法将被挂起 |
PROPAGATION_REQUIRED | 表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事 |
PROPAGATION_REQUIRES_NEW | 表示当前方法必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起 |
PROPAGATION_SUPPORTS | 表示当前方法不需要运行在一个是事务中,但如果有一个事务已经存在,该方法也可以运行在这个事务中 |
- 隔离级别
在操作数据时可能带来 3 个副作用,分别是脏读、不可重复读、幻读。为了避免这 3 中副作用的发生,在标准的 SQL 语句中定义了 4 种隔离级别,分别是未提交读、已提交读、可重复读、可序列化。而在 spring 事务中提供了 5 种隔离级别来对应在 SQL 中定义的 4 种隔离级别,如下:
隔离级别 | 意义 |
---|---|
ISOLATION_DEFAULT | 使用后端数据库默认的隔离级别 |
ISOLATION_READ_UNCOMMITTED | 允许读取未提交的数据(对应未提交读),可能导致脏读、不可重复读、幻读 |
ISOLATION_READ_COMMITTED | 允许在一个事务中读取另一个已经提交的事务中的数据(对应已提交读)。可以避免脏读,但是无法避免不可重复读和幻读 |
ISOLATION_REPEATABLE_READ | 一个事务不可能更新由另一个事务修改但尚未提交(回滚)的数据(对应可重复读)。可以避免脏读和不可重复读,但无法避免幻读 |
ISOLATION_SERIALIZABLE | 这种隔离级别是所有的事务都在一个执行队列中,依次顺序执行,而不是并行(对应可序列化)。可以避免脏读、不可重复读、幻读。但是这种隔离级别效率很低,因此,除非必须,否则不建议使用。 |
- 只读
如果在一个事务中所有关于数据库的操作都是只读的,也就是说,这些操作只读取数据库中的数据,而并不更新数据,那么应将事务设为只读模式( READ_ONLY_MARKER ) , 这样更有利于数据库进行优化 。
因为只读的优化措施是事务启动后由数据库实施的,因此,只有将那些具有可能启动新事务的传播行为 (PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事务标记成只读才有意义。
如果使用 Hibernate 作为持久化机制,那么将事务标记为只读后,会将 Hibernate 的 flush 模式设置为 FULSH_NEVER, 以告诉 Hibernate 避免和数据库之间进行不必要的同步,并将所有更新延迟到事务结束。 - 事务超时
如果一个事务长时间运行,这时为了尽量避免浪费系统资源,应为这个事务设置一个有效时间,使其等待数秒后自动回滚。与设
置“只读”属性一样,事务有效属性也需要给那些具有可能启动新事物的传播行为的方法的事务标记成只读才有意义。
29、加载驱动方法?
- 1.Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
- DriverManager.registerDriver(new com.mysql.jdbc.Driver());
- System.setProperty(“jdbc.drivers”, “com.mysql.jdbc.Driver”);
30、Java中异常分类?
31、JVM 参数配置?
-Xmx:最大堆大小
-Xms:初始堆大小
-Xmn: 年轻代大小
-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值。
https://blog.csdn.net/chen978616649/article/details/50380036
32、判断两个IP地址是否在同一网络?
两个IP地址与子网掩码按位与后的结果相同。
33、32位系统最大识别内存为?
- 32位系统最大识别内存 => 4G:2的32次方
- 64位系统最大识别内存 => 128G: 2的64次方
34、主键和唯一索引?
- 主键为一种约束,唯一索引为一种索引,本质上就不同;
- 主键创建后一定包含唯一性索引,而唯一索引不一定就是主键;
- 主键不允许空值,唯一索引可以为空;
- 主键可以被其他表引用,而唯一索引不可以;
- 一个表最多只能创建一个主键,而可以创建多个唯一索引;
- 主键和索引都是键,主键是逻辑键,索引为物理键,即主键不实际存在。
35、Java抽象类与接口?
36、文件权限信息?
0~9位符号说明: 第0位:- 表示普通文件,d表示目录。 1~3位:表示文件所有者权限,r可读,w可写,x可执行,-表示无此权限;比如:r-x表示可读不可写可执行(3个字母顺序是固定的,哪个位置上是 - 就说明无此权限)。 4~6位:表示文件所在组成员权限,内容与1~3位一致。 7~9位:表示其他组成员权限,内容与1~3位一致。
37、如果T1是由有序树T转换而来的二叉树,那么T中结点的前序就是T1中结点的前序,T中结点的后序就是T1中结点的中序。
38、Linux系统进程类型包括?
- 交互进程——有一个shell启动的进程,交互进程既可以在前台运行,也可以在后台运行。
- 批处理进程——这种进程和终端没有联系,是一个进程序列。
- 监控进程(守护进程)——Linux启动时启动的进程,并在后台运行。
39、socket?
- Socket 可以基于TCP 面向连接 也可以基于UDP无连接;
- Socket客户端的端口是不固定的;
- Socket服务端的端口是固定的;
- Socket用于描述IP地址和端口,是一个通信链的句柄.
40、操作系统内存分配算法?
- 首次适应法: 首次适应算法从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业(从地址最低开始查找)
- 最佳适应法: 最佳适应算法是指从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区的一种计算方法(从大小最小开始查找)
- 最坏适应法: 最坏适应分配算法要扫描整个空闲分区或链表,总是挑选一个最大的空闲分区分割给作业使用。(从大小最大开始查找)
- 循环首次适应法: 该算法是首次适应算法的变种。在分配内存空间时,不再每次从表头(链首)开始查找,而是从上次找到空闲区的下一个空闲开始查找(从上一次使用首次适应法查找的结果开始查找)
41、中断方式和剥夺方式?
- 中断方式: 指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。
- 剥夺方式: 当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的 处理机 ,将之分配给其它进程。