面试题复习总结(全)

最近在复习找工作,把自己总结的频繁出现在面试中的知识点跟大家分享一下,希望对大家找工作有帮助,不足之处还请批评指正!一起加油哦!

持续更新。。。。。。

  • Linux命令复习

    • 怎么查看端口状态:

      netstat -a 查看所有的服务端口 ; netstat -t 显示tcp服务端口 netstat -u 显示udp服务端口

    • 怎么查看进程状态:

      ps -auc

  • 计算机网络

    • 浏览器输入一个地址回车之后都发生了啥?

      (参考:https://blog.csdn.net/jiao_0509/article/details/82491299

      • 1、第一步,解析域名对应的IP地址,首先到浏览器缓存中查找,再到系统缓存中查找(查找本地hosts文件),然后到dns服务器中查找(域名服务器中的查找采用迭代查询)。
      • 2、第二步,浏览器与目标服务器建立TCP连接,主机浏览器通过DNS解析得到了目标服务器的IP地址后,与服务器建立TCP连接。这其中包括三次握手。
      • 3、连接成功建立后,浏览器通过http协议发送请求,浏览器向主机发起一个HTTP-GET方法报文请求。请求中包含访问的URL,也就是http://www.csdn.com/ ,KeepAlive,长连接,还有User-Agent用户浏览器操作系统信息,编码等。这个过程中有可能会发生重定向操作(如:为了负载均衡)。
      • 4、服务器处理请求。服务器接收到获取请求,然后处理并返回一个响应。
      • 5、服务器发出一个HTML响应。返回状态码200 OK,表示服务器可以响应请求,返回报文。
      • 6、释放TCP连接,四次挥手。
      • 7、浏览器显示页面。在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了,浏览器接收到返回的数据包,根据浏览器的渲染机制对相应的数据进行渲染。渲染后的数据,进行相应的页面呈现和脚步的交互。
    • 迭代查询的过程:

      根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器dns.net的IP地址。本地域名服务器向顶级域名服务器dns.net进行查询。顶级域名服务器dns.net告诉本地域名服务器,下一次应查询的权限域名服务器dns.csdn.net的IP地址。本地域名服务器向权限域名服务器dns.csdn.net进行查询。权限域名服务器dns.csdn.net告诉本地域名服务器,所查询的主机www.csdn.net的IP地址。本地域名服务器最后把结果告诉主机。

    • TCP三次握手过程:
      • 1、浏览器所在的客户机向服务器发出连接请求报文(SYN标志为1);
      • 2、服务器接收报文后,同意建立连接,向客户机发出确认报文(SYN,ACK标志位均为1);
      • 3、客户机接收到确认报文后,再次向服务器发出报文,确认已接收到确认报文;此处客户机与服务器之间的TCP连接建立完成,开始通信
    • TCP四次挥手过程:
      • 1、 浏览器所在主机向服务器发出连接释放报文,然后停止发送数据;
      • 2、服务器接收到释放报文后发出确认报文,然后将服务器上未传送完的数据发送完;
      • 3、 服务器数据传输完毕后,向客户机发送连接释放报文;
      • 4、客户机接收到报文后,发出确认,然后等待一段时间后,释放TCP连接。
    • tcp四次挥手中的TIME_WAIT状态存在的理由?

      (参考:https://blog.csdn.net/stpeace/article/details/75714797

      • 1、TIME_WAIT存在的理由之一是:尽可能护送最后的ACK达到对端。
      • 2、 TIME_WAIT存在的理由之二是:新旧四元组互不干扰。
    • TCP 和 UTP 有什么区别?(深入回答)

      (参考:https://www.cnblogs.com/xiaomayizoe/p/5258754.html

      • 1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
      • 2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
      • 3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
      • 4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
      • 5、TCP首部开销20字节;UDP的首部开销小,只有8个字节。
      • 6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
    • HTTP请求post和get请求的区别?

      (参考:https://segmentfault.com/a/1190000009512784

      • 1、get把请求的数据放在url上,即HTTP协议头上,post把数据放在HTTP的包体内(requrest body)。
      • 2、get提交的数据最大是2k(原则上url长度无限制,那么get提交的数据也没有限制咯?限制实际上取决于浏览器,(大多数)浏览器通常都会限制url长度在2K个字节,即使(大多数)服务器最多处理64K大小的url。也没有卵用。)。
      • 3、post理论上没有限制。实际上IIS4中最大量为80KB,IIS5中为100KB。
      • 4、GET产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
      • 5、POST产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
      • 6、GET在浏览器回退时是无害的,POST会再次提交请求。
      • 7、GET产生的URL地址可以被Bookmark,而POST不可以。
      • 8、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
      • 9、GET请求只能进行url编码,而POST支持多种编码方式。
      • 10、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
      • 11、GET只接受ASCII字符的参数的数据类型,而POST没有限制
      • Get请求效率高啊!
  • 数据库

    • 一条SQL执行的很慢的原因?

      (参考:http://www.matools.com/blog/190432671

      • 一个 SQL 执行的很慢,我们要分两种情况讨论:
      • 1、大多数情况下很正常,偶尔很慢,则有如下原因:(1) 数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘。(2) 执行的时候,遇到锁(其他用户在操作相同的表),如表锁、行锁。
      • 2、这条 SQL 语句一直执行的很慢,则有如下原因:(1) 没有用上索引:例如该字段没有索引;由于对字段进行运算、函数操作导致无法用索引。(2) 数据库选错了索引
    • MySQL有哪些存储引擎以及他们之间的区别?

      (参考:https://blog.csdn.net/suifeng3051/article/details/52669644#commentBoxhttps://blog.csdn.net/zgrgfr/article/details/74455547>)

      • InnoDB 和 MyISAM之间的区别:
      • 1.InnoDB支持事物,而MyISAM不支持事物
      • 2.InnoDB支持行级锁,而MyISAM支持表级锁
      • 3.InnoDB支持MVCC, 而MyISAM不支持
      • 4.InnoDB支持外键,而MyISAM不支持
      • 5.InnoDB不支持全文索引,而MyISAM支持。
      • 6、InnoDB是聚集索引,MyISAM是非聚集索引
    • 查看正在执行的Sql语句的执行状态
      • mysql>show processlist
    • 说说MySQL事务。说说ACID是什么?
      • 原子性(Atomicity)
        • 事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
      • 一致性(Consistency)
        • 数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。
      • 隔离性(Isolation)
        • 一个事务所做的修改在最终提交以前,对其它事务是不可见的。
      • 持久性(Durability)
        • 一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
    • 事务的隔离级别?(由若到强)
      • 未提交读(READ UNCOMMITTED)
        • 事务中的修改,即使没有提交,对其它事务也是可见的。
      • 提交读(READ COMMITTED)
        • 一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
      • 可重复读(REPEATABLE READ)
        • 保证在同一个事务中多次读取同样数据的结果是一样的。
      • 可串行化(SERIALIZABLE)
        • 强制事务串行执行。
  • Java和JVM

    • 说说垃圾回收?(参考)
      • 老年代,新生代,永生代(方法区)的区别等,各自使用的回收算法,新生代又分eden和survivor区
      • 新生代:少了存活,复制算法;老年代:标记—整理/标记—清理算法
      • >15年龄,存到老年代
    • 如果想要让多个线程执行到某个点,都达到之后再继续执行,可以用java的那些类来实现?
      • CountDownLatch 和CyclicBarrier
    • 什么是反射?
      • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    • 反射有什么用?
    • IO阻塞与非阻塞是什么?各自有啥好处?知道多路复用吗?了解过 select 吗?说说他与 epoll 的区别?
      • IO请求的两个阶段:
        • 1.等待资源阶段:IO请求一般需要请求特殊的资源(如磁盘、RAM、文件),当资源被上一个使用者使用没有被释放时,IO请求就会被阻塞,直到能够使用这个资源。
        • 2.使用资源阶段:真正进行数据接收和发生。
      • 在等待数据阶段,IO分为阻塞IO和非阻塞IO。
        • 1.阻塞IO: 资源不可用时,IO请求一直阻塞,直到反馈结果(有数据或超时)。
        • 2.非阻塞IO:资源不可用时,IO请求离开返回,返回数据标识资源不可用
      • 在使用资源阶段,IO分为同步IO和异步IO。
        • 1.同步IO:应用阻塞在发送或接收数据的状态,直到数据成功传输或返回失败。
        • 2.异步IO:应用发送或接收数据后立刻返回,数据写入OS缓存,由OS完成数据发送或接收,并返回成功或失败的信息给应用。
    • NIO 与普通 I/O 的区别主要有以下两点:
      • NIO 是非阻塞的;
      • NIO 面向块,I/O 面向流。
    • 乐观锁、悲观锁定义及其应用?

      (参考:https://blog.csdn.net/fhy569039351/article/details/83040384

      • 乐观锁:
        • 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。
        • 乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
      • 悲观锁:
        • 顾名思义,就是很悲观,总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。
      • 附CAS简介:
        • CAS是由CPU硬件实现,所以执行相当快.CAS有三个操作参数:内存地址,期望值,要修改的新值,当期望值和内存当中的值进行比较不相等的时候,表示内存中的值已经被别线程改动过,这时候失败返回,当相等的时候,将内存中的值改为新的值,并返回成功。
      • 为什么重写equals一定要重写hashcode

        (参考:https://blog.csdn.net/xl_1803/article/details/80445481 讲的很清楚)

      • CurrentHashMap 1.7和1.8的区别?

        (参考:https://blog.csdn.net/qq296398300/article/details/79074239 https://www.cnblogs.com/softidea/p/10261414.html

        • 1、JDK1.8的实现降低锁的粒度,JDK1.7版本锁的粒度是基于Segment的,包含多个HashEntry,而JDK1.8锁的粒度就是HashEntry(首节点)

        • 2、JDK1.8版本的数据结构变得更加简单,使得操作也更加清晰流畅,因为已经使用synchronized来进行同步,所以不需要分段锁的概念,也就不需要Segment这种数据结构了,由于粒度的降低,实现的复杂度也增加了

        • 3、JDK1.8使用红黑树来优化链表,基于长度很长的链表的遍历是一个很漫长的过程,而红黑树的遍历效率是很快的,代替一定阈值的链表,这样形成一个最佳拍档

        • 总结:JDK1.7版本:ReentrantLock + Segment + HashEntry
          JDK1.8版本:synchronized + CAS + HashEntry + 红黑树

      • JDK1.8为什么使用内置锁synchronized来代替重入锁ReentrantLock?
        • 1、因为粒度降低了,在相对而言的低粒度加锁方式,synchronized并不比ReentrantLock差,在粗粒度加锁中ReentrantLock可能通过Condition来控制各个低粒度的边界,更加的灵活,而在低粒度中,Condition的优势就没有了

        • 2、JVM的开发团队从来都没有放弃synchronized,而且基于JVM的synchronized优化空间更大,使用内嵌的关键字比使用API更加自然

        • 3、在大量的数据操作下,对于JVM的内存压力,基于API的ReentrantLock会开销更多的内存,虽然不是瓶颈,但是也是一个选择依据

  • Spring

    • 说说AOP(面向切面编程)、IOC(控制反转)、DI(依赖注入)?

      (参考:https://blog.csdn.net/a745233700/article/details/80959716

      • AOP,一般称为面向切面,其实现的关键在于代理模型(JDK动态代理和CGLib动态代理),作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。
      • IOC就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。
      • DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。最直观的表达就是,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入。
  • 数据结构:

    • 为什么有了平衡树还需要红黑树?
      • 平衡树太严格,插入很容易打破平衡,经常需要调整,影响插入效率,而红黑树是一种折中方案。
      • 1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。
      • 2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。
    • 项目用到redis,知道跳跃表吗?说说他是怎么实现的,查找时间复杂度?
      • 时间复杂度log(n)
    • 手撕排序算法

      (参考:https://blog.csdn.net/fhy569039351/article/details/91050130)

      • 快速排序
      • 归并排序
      • 插入排序
      • 堆排序
  • 操作系统

    • 什么是进程?进程包括什么?
      • 进程是资源分配和调度的基本单位。进程是系统中正在运行的一个程序,程序一旦运行就是进程。进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。一个进程可以拥有多个线程,同一进程内的多个线程共享进程的资源。

      • 包括三部分:
        • ①程序 作用:描述进程要完成的功能。
        • ②数据 作用:程序在执行时所需要的数据和工作区。
        • ③ PCB 作用:包含进程的描述信息和控制信息。它是进程存在的唯一标志。
  • 其他方面

    • Docker与VM虚拟机的不同点在这里插入图片描述
      • 1、虚拟化技术依赖物理CPU和内存,是硬件级别的;而docker构建在操作系统上,利用操作系统的containerization容器技术,所以docker甚至可以在虚拟机上运行。
      • 2、启动速度快,比VM快太多了,启动、停止、开始、重启都是秒级甚至毫秒级。
      • 3、轻量级虚拟化,在一台服务器上可以部署100~1000个Container容器。而VM一台服务器能部署10到20就很不错了。
      • 4、Docker是单线程,Docker设计者极力推崇“一个容器一个进程的方式”。无法很好地模拟一个完整的环境。
      • 5、当停止一个虚拟机时,可能除了一些临时文件,没有文件会被删除(业务产生的文件);但当停止一个Docker容器,对初始状态(创建容器所用的镜像的状态)做的所有变化都会丢失。这是使用Docker时必须做出的最大思维变化之一:容器是短暂和一次性的。所以有种说法,例如mysql这样的数据库还是不要用Docker的好,因为数据库在使用过程中会有很多业务数据。
      • 6、Docker的安全性目前比VM要差。VM做到资源完全隔离,而Docker会共享资源,这就带来了安全的风险。
    • hash一致性算法?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章