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