Java面试

java后端春招知识宝典

2020-03-10  本文已影响0人  団长大人

Java面试相关知识点

这篇笔记主要用来记录一个大牛的java相关知识点

一、计算机网络

网络上的知识,基本上以理论为主

1. OSI七层协议

物理层:用于信号传输,进行数模转换/模数转换,基本数据是:比特,网卡在这一层工作

数据链路层:定义格式化数据进行传输和为物理介质的控制,提供数据校验,基础数据是:帧,交换机在这一层工作

网络层:将网络地址翻译成物理地址并且决定传输的路径,基本数据是:数据包,路由器在这里工作(TCP/IP协议就在此层

传输层:解决数据传输的稳定性,必要时将数据分割(TCP/UDP协议就工作在此层

会话层:解决不同操作系统的通讯语法的问题

应用层:HTTP协议就工作在此层

OSI

2. TCP/IP协议族的四层协议

OSI七层协议知识一个概念性的框架,TCP/IP协议族是OSI七层模型的实现,但是它并没有完全按照OSI七层模型进行实现。

TCP/IP协议族

3. TCP和三次握手

IP协议是无链接的通讯协议,但是IP协议没有控制包的顺序和可靠性,因此需要上层的TCP协议进行控制。

TCP将上层的数据报文分割成适当大小的包交给网络层进行发送,为了保证顺序和可靠,TCP会对每个包进行编号,并且需要接收方发送ACK进行确认来确保不会丢包

3.1 TCP报文头

TCP报文头

3.2 三次握手

三次握手

相关的标识位如下

握手过程


注意:第二次握手时S端收到首次发送C端的SYN包,发送确认包和自己的SYN包时如果S端没有收到ACK确认时,S端会不断重试,linux默认情况下会等待63秒

4.四次挥手

四次挥手

5.UDP和TCP的区别

5.1 UDP的特点

6. TCP的滑动窗口

TCP的滑动窗口是为了解决TCP的流浪控制和乱序重排的问题,未来研究这个问题,我们先知道下面这两个概念

6.1 滑动窗口过程

滑动窗口发送

每次收到接受放确认的连续包后,窗口会进行滑动,框入更多的未发送数据

7. HTTP协议

主要特点:

7.1 HTTP请求/响应结构

HTTP请求报文 HTTP响应报文

7.2 Cookie和Session

7.3 HTTPS

加入ssl层,加入安全套接层,提供安全和数据完整性的协议,通过身份验证和数据加加密的完整性

二、 数据库

1. 数据库设计和模块划分

如果我没来设计数据库,需要这样几部分

2. 索引模块

为什么要使用索引?

相当于字典的目录,通过索引可以大幅提升查询速度

2.1 索引的数据结构

2.2. 密集索引和稀疏索引的区别

2.3 SQL衍生问题

  1. 如何优化慢SQL

    • 根据慢日志定位问题:修改mysql中的变量来开启慢日志(下面的操作在my.ini更改后就会永久保存)

      shwo variables like 'query'        #找到和查询有关的全局变量
      set global show_query_log = no #开启慢日志
      set global long_query_time = 1 #设置慢查询时间为1秒
      show status like '%slow_queries' #查看慢sql个数
      
    • 利用explan来分析select查询,用法就是在select前面加上explan就好了

      • 关注出现的type字段,如果是“index”或者"all"就表明查询是通过全表扫描完成的,需要优化

      • 关注extar字段

        [图片上传失败...(image-52b86-1584189158882)]

    • 修改SQL让其尽量使用索引或者添加索引

  2. 联合索引最左原则

    • 最左匹配原则:A、B字段组成联合索引,当where A = xxxwhere A = xxx and B = xxx时,会使用这个联合索引,但是当where B = XXX时,就不会使用这个索引了

    • 原因:联合索引建立时,会先对第一个字段进行排序,在这个顺序的基础上再对第二个字段进行陪许,因此第二个字段是局部有序的

      最左匹配
  1. 索引是越多越好吗

    索引并不是越多越好。索引也需要维护并且占用空间。

3. 锁模块

3.1 MyISAM和InnoDB锁的区别

3.2 锁的分类

3.3 数据库事务的四大特性

3.4 事务并发访问产生的问题和隔离级别

4. SQL关键语法

假设我们的表结构如下

表例子

4.1 Group By

根据查询结果进行分组查询,对每个组的数据进行聚合运算。

例子:查询所有同学的学号,姓名,选课数,和每个同学成绩的总和

selete s.student_id,stu.name,count(s.coures_id),sum(s.score)
    form score s,student stu
    where s.student_id = stu.student_id
    greop by student_id

4.2 Having

通常于Group By一起使用,给Group By 添加限定条件

例子: 查询所有平均分大于60分的同学的学号,姓名,选课数,和每个同学的平均成绩

selete s.student_id, stu.name, count(s.coures_id), avg(s.score)
    form score s,student stu
    where s.student_id = stu.student_id
    greop by student_id
    having avg(s.score) > 60

例子:查询使用没有学全所有课程的学号和姓名

selete s.student_id, stu.name
    from score s, student stu
    where s.student_id = stu.student_id
    group by s.student_id
    having count(*) < (
        select count(*) from course
    ) 

三、Redis

1 IO多路复用模型

2 Redis数据类型

3 相关问题

3.1 如何从redis中查询固定前缀的简直对

3.2 实现分布式锁

3.3 避免同一时间大量的key过期

过期时间需要添加随机值

3.4 redis做一步队列(消息队列)

用list数据的pop操作和push的操作

4 Redis持久化方式

4.1 RDB持久化

会在固定的间隔保存一次整个数据库的全量数据。使用save指令在主线程中进行RDB备份,使用bgsave指令使用fork的子线程完成备份

4.2 AOF持久化

相当于备份操作日志,每一个和写入有关的操作会被记录到一个文件中

四、Java相关知识点

1. ClassLoader

1.1 类从编译到执行的过程

1.2 ClassLoader

在JVM中,所有的类对象都是由ClassLoader进行加载的,主要功能是从class文件中的二进制数据流加载类对象,是Java的核心组件

1.3 类装载方式

类装改过程如下

类装载过程

2. JVM内存模型

2.1 内存模型划分的区域

从线程的角度分类

Q45Q2XM6V~13}$7H5_N2N@8.png

2.2 JVM常见问题

3. Java垃圾回收机制

3.1 判定为垃圾的算法

当一个java对象没有被任何对象引用时就会判定为垃圾

3.2 垃圾回收算法

3.3 分代收集算法

对内存进行分类,不同的空间使用不同的手机算法

空间划分

3.4 新生代的垃圾收集器

serial parNew

3.5 老年代收集器

serial old parOld CMS

3.6 相关问题

4. Java并发编程

4.1 java线程相关

4.2 java中的锁

4.3 JMM如何解决可见性的问题

4.4 乐观锁和CAS操作

4.5 Java线程池

利用Executors提供的线程池可以满足不同场景的需求

线程池
上一篇 下一篇

猜你喜欢

热点阅读