java基本数据类型
byte 1字节
short 2字节
int 4字节
long 8字节
char 2字节
float 4字节
double 8字节
boolean 1字节
Java的自动拆箱与装箱
装箱就是自动将基本数据类型转换为包装类型
拆箱就是自动将包装类型转换为基本数据类型
索引失效的场景
对索引使用左右模糊,或者左模糊匹配
对索引使用函数
对索引进行表达式计算
where中含有or
联合索引非最左匹配
对索引隐式类型转换
操作系统进程和线程区别
进程是资源分配的单位,线程是CPU调度的单位
进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈
线程同样具有就绪,阻塞,执行三种基本状态,同样具有状态之间的转换关系
线程能减少并发执行的时间和空间开销(线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,比如内存管理信息,文件管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享他们。同一个进程内的线程切换比进程切换快,因为线程具有相同的地址空间,这意味着同一个进程的线程都具有同一个页表,那么在切换的时候不需要切换页表。而对于进程之间的切换,切换的时候要把页表切换掉,而页表的切换过程开销比较大)
进程间通信方式
管道
消息队列
共享内存
信号量
socket
线程间通信方式
共享变量
锁机制
条件变量
信号量
管道
TCP和UDP区别
TCP是面向连接的传输层协议,传输数据前先要建立连接
UDP是不需要连接,即刻传输数据
TCP一对一的两点服务,即一条连接只有两个端点
UDP支持一对一,一对多,多对多的交互通信
TCP是可靠交付数据的,数据可以无差错,不丢失,不重复,按序到达
UDP是尽最大努力交付,不保证可靠交付数据
TCP有拥塞控制和流量控制机制,保证数据传输的安全性
UDP则没有,即使网络非常拥堵,也不会影响UDP的发送效率
TCP首部长度较长,会有一定的开销,首部在没有使用选项字段时是20个字节,如果使用了选项字段则会变长的
UDP首部只有8个字节,并且是固定不变的,开销小
TCP是流式传输,没有边界,但保证顺序和可靠
UDP是一个包一个包的发送,是有边界的,但可能会丢包和乱序
TCP和UDP应用场景
TCP是面向连接的,能保证数据的可靠性交付,使用场景:
FTP文件传输
Http/Https
UDP面向无连接的,随时可以发送数据,使用场景:
视频
广播通信
TCP重传机制有哪些
超时重传:在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文,就会重发该数据
快速重传:当收到三个相同的ACK报文时,会在定时器过期之前,重传丢失的报文段
是否可以将线程池的核心参数设置为0
可以设置为0,当核心线程数为0时,当有任务被提交时,会先将任务添加到任务队列,同时会判断当前工作的线程数是否为0,如果为0,则会创建线程来执行线程池的任务。
关键源码
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
测试代码
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
0,
3,
2,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(5));
threadPoolExecutor.execute(() -> {
System.out.println("任务中...");
});
}
重载和重写
重载发生在同一个类中,方法名相同,参数类型,参数个数,参数顺序可以不同
重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写
zset的数据结构
跳表:高效的范围查询
跳表是在链表基础上改进过来的,实现的一种多层有序链表,能够快速定位数据,查询的时间复杂度为O(logn)
哈希表:高效单点查询。根据元素获取权重
参考资料:
GitHub - Snailclimb/JavaGuide: 「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!