面试范围

Created at 2020-04-01 Updated at 2021-02-01 Category 面试 Tag 知识点

1. 计算机基础

基础

  • 正码反码补码的概念;二进制的相关操作:异或左移右移关键字等;

    • 正码:正数是其二进制本身,负数是符号位为1,数值部分取 x 绝对值的二进制
    • 反码:正数的正码和反码相同,其他位于原码相反
    • 补码:正数的补码与正码相同,负数的符号位为 1,其他位是原码取反,末位加1
  • GB,MB,KB,BYTE,BIT的换算关系

    1GB = 1024MB
    1MB = 1024KB
    1KB = 1024BYTE
    1BYTE = 8BIT
  • 二进制十进制十六进制的描述方式和转换方式

  • 常用的字符集介绍和可能带来的乱码问题

进阶

  • 最快计算2的N次方的方式;最快判断一个数字是奇数的方式;

    double res = 1;
      for (long i = N; i > 0; i /= 2) {
          if (i % 2 == 1) {
          res = res * x;
          }
          x *= x;
      }
      return res;
  • 判断奇数:位运算,(x&1)==1 是奇数

  • 浮点数float的长度为多少?不同位数区域代表的含义?为什么会产生精度丢失的问题?

  • 1MB内存空间能存下100万个8位数吗?如果能,怎么存储?如果不能,那么最少需要多大的内存空间?

    • 1000000*4/1024/1024=3.8M

2. JAVA语言基础

基础

  • 8种基本数据类型的介绍;各自的长度范围和使用场景;8种基本类型对应的包装类和作用;

    • POJO 必须用包装类,比如有个属性是 score,用int,一次考试,学生可能没考,值是null,也可能考了,但考了0分,值是0,这两个表达的状态明显不一样。
    • 强制转换 Object 时要用Integer不能用int
    • 基本数据类型的特点:直接存储在栈(stack)中的数据
    • 引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里
  • Object类下的常用方法介绍和相应作用

    • clone() 是 native 方法
    • equals()
    • finalize()
    • getClass()
    • hashCode()
    • notify()
    • notifyAll()
    • toString()
    • wait()
  • String类下的常用方法介绍和相应作用;StringBuffer,StringBuilderString三者的比较;

    • 常用方法:toCharArray(),charAt(),length(),indexOf(),trim(),substring(),split(),toLowerCase(),toUpperCase(),replace(),concat(),compareTo()
    • String 是不可变的,用 final 修饰字符数组来保存字符串 private final char value[]
    • StringBuilder 与 StringBuffer 是可变的,都继承自 AbstractStringBuilder
    • StringBuffer 是线程安全的,对方法加了同步锁
  • 关键词static,final的作用和使用方式;

  • 关键词public,protected,private,default的作用;可以用来修饰哪些对象(类,方法,属性,构造器),修饰不同对象的不同作用;

    • protected 用于修饰成员,表示继承体系中对于子类可见,这个修饰符对于类没有意义。
  • 接口抽象类的比较;方法重写重载的比较;多接口实现多类继承的可行性;

    • 接口不能有有任何方法的实现,是完全抽象的类,但是从 Java 8开始,接口也可以拥有默认的方法实现
    • 接口的成员默认都是 public 的,不允许定义为 private 和 protected,抽象类没有这种限制
    • 接口的字段默认都是 static 和 final 的,抽象类没有这种限制
    • 从设计层面上看,抽象类提供了一种 IS-A 关系,需要满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
    • 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
  • 函数的形参实参的比较;值传递引用传递的比较;

    • Java 的参数是以值传递的形式传入方法中,而不是引用传递

    • 作者:Intopass
      链接:https://www.zhihu.com/question/31203609/answer/50992895
      来源:知乎
      著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
      
      第一个例子:基本类型
      void foo(int value) {
          value = 100;
      }
      foo(num); // num 没有被改变
      
      第二个例子:没有提供改变自身方法的引用类型
      void foo(String text) {
          text = "windows";
      }
      foo(str); // str 也没有被改变
      
      第三个例子:提供了改变自身方法的引用类型
      StringBuilder sb = new StringBuilder("iphone");
      void foo(StringBuilder builder) {
          builder.append("4");
      }
      foo(sb); // sb 被改变了,变成了"iphone4"。
      
      第四个例子:提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符。
      StringBuilder sb = new StringBuilder("iphone");
      void foo(StringBuilder builder) {
          builder = new StringBuilder("ipad");
      }
      foo(sb); // sb 没有被改变,还是 "iphone"。
  • 如何实现一个对象的拷贝深拷贝浅拷贝的比较;

  • 介绍常用的代码逻辑的控制方式;foreach的底层实现原理;switch判断条件的类型限制;

    • foreach 转换为迭代器
    • switch 判断条件类型可以是 int 或者 char,不支持 long,从7开始支持 String
  • 异常的类型Error,Throwable,Exception的关系;常见的RuntimeException;try-catch-finally结构中try中的return与finally中的return的执行顺序;

    • Error 和 Exception 继承自 Throwable
    • Exception 分为
      • RuntimeException(运行时/非受检异常):这类异常由程序员逻辑错误导致,Java编译器不要求强制处理,可以捕获或抛出,也可以不捕获或抛出(ArithmeticException,NullPointerException,ClassCastException,ArrayIndexsOutOfBoundsException)
      • IOException(受检异常):由于外部因素引起,编译器要求强制处理,必须捕获或抛出(SQLException,FileNotFoundException)
    • finally 是在 return 之后执行的,不管有没有return ,finally 都会执行
    • Java中try-catch-finally-return的执行顺序
  • 序列化的作用和实现方式;关键属性serialVersionUID的作用;关键修饰词transient的作用;

    • 让类实现Serializable接口,该接口是一个标志性接口,标注该类对象是可被序列
    • 字段面前加上 transient 就不会序列化
    • 在完成序列化操作后,由于项目的升级或修改,可能我们会对序列化对象进行修改,比如增加某个字段,那么我们在进行反序列化就会报错,在 JavaBean 对象中增加一个 serialVersionUID 字段,用来固定这个版本,无论我们怎么修改,版本都是一致的,就能进行反序列化了
  • 泛型的定义和作用;

  • 反射的作用和常用方法;静态代理和动态代理的对比和实现方式;

  • JAVA IO中常见的类和方法,分别在哪些场景中使用;

进阶

  • String类为什么要定义为final不可变更和继承?
    • 可以缓存 hash 值
    • String Poll(字符串常量值) 的需要
    • 线程安全
  • String类中的intern()方法的作用和原理;int常量池的取值范围;
    • 当一个字符串调用 intern() 方法时,如果 String Pool 中已经存在一个字符串和该字符串值相等(使用 equals() 方法进行确定),那么就会返回 String Pool 中字符串的引用;否则,就会在 String Pool 中添加一个新的字符串,并返回这个新字符串的引用。
    • int 常量池范围是 -128~127
  • JDK1.8中函数式接口定义的方式和规范;
  • JDK1.8中stream的中的foreach与普通for循环,原生foreach的效率对比;
  • JDK1.8是如何做到改变已经发布的接口而不破坏已有的实现?这种方式的弊端及如何解决此种弊端?
  • 序列化是如何破坏单例模式的?
  • JDK1.9中定义的响应式编程方式的模型设计;
  • 泛型中声明类A<? extend C>和类B<? super C>的含义是什么?如此定义分别适用于何种场景;
  • 如何计算一个对象所占内存空间的大小;
  • 加密算法的分类介绍;有哪些对称加密算法;有哪些非对称加密算法;加签和加密的比较;
  • System.gc()方法的作用和使用不当带来的问题;
  • Thread.sleep(0)和Thread.sleep(1)的含义;Thread.currentThread().interrupt()和Thread.interrupt()的比较及使用时的注意事项;

3. 数据结构与集合

基础

  • List,Map,Set,Queue所抽象的数据结构和对应的使用场景;

  • 对象比较的两种实现方式:comparablecompartor

  • ArrayList,LinkedList,CopyOnWriteArrayList各自的特点和比较;

  • HashSet,TreeSet,LinkedHashSet各自的特点和比较;

  • HashMap,HashTable,TreeMap,ConcurrentHashMap各自的特点和比较;

  • ArrayBlockingQueue,LinkedBlockingQueue各自的特点和比较;

进阶

  • JAVA集合类中的fail-fast机制的介绍;

  • Array和ArrayList是否可以互相转化?Arrays.asList(T…t)方法返回的ArrayList能否往其中添加或删除元素,原因是什么?

  • 二叉树,平衡二叉树,红黑树的特点和比较;

  • HashMap与ArrayList扩容的步骤和比较;

  • SkipList的介绍和使用场景;

4. 并发与多线程

基础

  • 悲观锁乐观锁的特点和使用场景;

  • 介绍创建线程的方式;Thread.run(),Thread.start(),Runnable.run()的比较;

  • 哪些集合类线程安全的;分别是使用什么方式保证线程安全的;

  • 线程可见性与线程安全的区别;JAVA中是如何实现线程可见性的;

  • 线程副本ThreadLocal的实现方式;

  • 多线程并发变量控制类CountLatchDown,CylicBarrier,Semaphore的工作原理;

  • 独占锁,共享锁,可重入锁类SynchronizedReentrantLockReentrantReadWriteLockAbstractSynchronizedQueue的实现方式

  • JAVA有哪些线程池的实现;创建线程池的参数的含义和作用;

  • 阻塞非阻塞的比较;同步异步的比较;并发并行的比较;TPSQPS的比较;如何计算一个系统的吞吐量;

  • 原子操作类AtomicXXX的介绍;CAS原理介绍;

进阶

  • JAVA指令重排序的原则和应用,带来的好处和问题;

  • Thread,ThreadLocal,ThreadLocalMap的关系;

  • HashMap在多线程环境下使用带来的死链问题;

  • JDK1.8的fork/join使用方式和作用;

  • 如何合理的设置JAVA线程池的参数;

  • JDK1.5后对Synchronized的优化,如何最小化Synchronized的锁颗粒度;

  • 读写锁如何降级;

  • 比较一下Object的wait()和notify() 和Condition的await()和signal()的使用,并介绍Condition的实现原理;

5. 设计模式

基础

  • 几种实现单例模式的方式:饿汉式加载,懒汉式加载,枚举;

  • 模板模式的使用方式和应用场景;

  • 责任链模式的使用方式和应用场景;

  • 代理模式的使用方式和应用场景;

  • 装饰器模式的使用方式和应用场景;

  • 观察者模式的使用方式和应用场景;

  • 工厂模式的使用方式和应用场景;

  • 访问者模式的使用方式和应用场景;

  • 设计模式的6大基本原则

进阶

  • 懒汉式加载在多线程并发环境下的问题,如何解决?

  • 列举你所阅读过得源码中使用的设计模式和其设计思想;

6. 常用三方框架和工具类

基础

  • Spring框架中的IOC,DI,AOP的意义和作用;

  • Spring框架中的FactoryBeanBeanFactory的定义和比较;框架是如何进行类的加载和管理;

  • Spring框架中的XML配置和注解配置实现的原理和比较;常用的注解标签介绍;@Autowire和@Resource的对比;

  • Spring框架如何加载外部的properties配置;

  • Spring框架是如何管理事务的;不同的事务传播控制等级及其对应的事务加入机制;

  • SpringMVC是如何处理一次页面请求并返回内容给使用者的;如何处理前端页面输入的特殊数据类型,例如时间类型;

  • SpringMVC中的Filter与Spring中的Interceptor的作用和比较;

  • Mybatis框架中书写动态sql中的#和$的比较;在使用if标签进行条件判断时需要注意哪些问题;标签属性中ResultMap和ResultType的作用;

  • Mybatis框架中接口声明如何映射到对应的动态sql并执行;

  • Mybatis框架中如何进行多数据源的配置和动态切换;

  • Springboot框架如何通过JAVA代码的方式实现配置的注入;

进阶

  • Spring框架在加载类的过程中如何解决2个类互相依赖的问题;

  • Spring框架常用的模块和工具类介绍;

  • Mybatis框架的整体架构设计;一级缓存和二级缓存的作用;

  • 数据库连接池的作用;了解哪些数据库连接池;如何合理的配置数据库连接池的相关参数;

  • Netty框架的网络模型;ByteBuf与ByteBuffer的比较;IO线程池和工作线程池的设计;ChannelPipeline的相关设计;ChannelHandler的作用和常用的实现;

7. JVM与内存管理

基础

  • JAVA内存模型的划分及其作用;哪些是线程共用的;哪些是线程私有的;

  • 有哪些内存区域会发生OOM异常;不同的OOM异常的含义;

  • 垃圾回收器回收时的三种回收方式:标记清除复制标记整理

  • JAVA对象能够被垃圾回收器回收的标准

  • JVM中的垃圾回收器的种类,主要特点和使用场景;

  • 描述一个对象如果在经历多次垃圾回收后仍未销毁在堆内存各区域的转移过程;

  • 介绍对JDK自带的一些JVM检测和问题排查工具的使用心得;

进阶

  • JDK1.8 perm升级为metaspace的原因和解决的问题;

  • 哪些对象会被看做GCRoots;

  • JAVA四种引用类型;每种引用的垃圾回收策略;

  • 如何查看当前JVM的垃圾回收器类型,堆内存大小;默认的堆内存大小是多少;

  • 堆内存中的eden,survive和old区域的大小比例是多少?设置该比例的原因?为何要将survive区域划分为相同大小的2块区域?

  • 是否有JVM调试经验?如果有,举一个例子描述下调试过程;

  • 是否了解JAVA动态追踪技术(Instrumnetation,Attach等),是否了解相关框架,分别可以使用在哪些场景;

8. 网络协议

基础

  • tcpudp的比较

  • httphttps的比较

  • GETPOST的比较

  • tcp三次握手四次挥手的过程描述;为何需要三次握手和四次挥手;分别描述在握手和挥手过程中客户端和服务端连接的状态;各状态代表的含义和作用;

  • 如何处理网络通信中的粘包拆包

  • tcp/ip网络模型的分层描述介绍;各层级的协议举例和对应使用场景;

  • 使用域名访问服务器时如何通过DNS解析找到最终的目标服务器,描述其过程;

  • http状态码举例说明其代表的含义;

  • DDOS攻击的含义和防范方法;

进阶

  • tcp连接参数配置解释:9.tcp_tw_reuse, tcp_tw_recycle,tcp_syncookie, tcp_max_syn_backlog,tcp_nodelay

  • https协议认证加密的过程;

  • tcp协议中的syn攻击的含义和影响;

  • 如何实现一个可靠的UDP协议;

  • tcp协议保证通信可靠性的方式有哪些;如何实现;

9. 服务器与操作系统

基础

  • 常用linux指令的使用方式,例如top,netstat,grep,awk,vim,cat,sh,less;

  • linux文件系统权限的设计和设置;

  • 针对服务器上产生的负载问题(CPU和内存使用过高),网络问题,磁盘问题和应用进程问题,如何分析和解决;

  • 操作系统进程的状态转换过程;进程与线程之间的关系;

进阶

  • 多种IO模型的比较;IO多路复用中系统函数select(),poll(),epoll()的机制比较;

  • IO零拷贝的技术实现和解决的问题;

10. 算法

基础

  • 算法复杂度的定义;算法复杂度排序列举;map,list,array,tree查找数据的算法复杂度分别是多少;

  • 用代码实现堆,栈,双向链表,二叉树等常见数据结构;

  • 用代码实现常见的排序算法;

  • TOP N问题的解决思路与实现;

  • 大整数问题的解决思路与实现;

  • 单链表反转的解决思路与实现

11. 数据库

基础

  • 数据库事务的ACID特性的说明和解读;

  • 数据库事务的隔离级别和低隔离级别带来的数据读取问题列举;

  • mysql数据库存储引擎的作用;innodb和myisam的比较;

  • mysql索引种类分类比较:主键索引,唯一索引,普通索引,联合索引;聚簇索引,非聚簇索引;索引所采用的数据结构;使用此数据结构的原因;

  • mysql基本sql语法考核;

  • mysql索引的使用场景;设计自增主键的作用;某些特殊场景索引是否生效;

  • mysql锁种类分类比较:行锁,表锁,共享锁,排他锁,间隙锁;mysql如何解决死锁问题;

  • 如何查看和分析mysql的执行计划

  • 数据库分库分表的作用和原则;分表时表设计的一些原则;

进阶

  • mysql中如何计算一张表的主键索引在指定的度下的数据存储量;

  • mysql中如何分析一个sql语句触发了哪种锁;

  • mysql中innodb引擎的mvcc机制解决了什么问题,是如何工作的;

  • mysql如何使用binlog和redolog进行数据的备份和恢复;

12. 分布式系统与中间件

基础

  • 缓存的作用;什么叫缓存穿透,缓存雪崩;缓存失效后合理的更新方式;了解或使用过哪些缓存工具并进行比较(redis,memcache,ecache);

  • redis有哪些数据结构;redis分布式锁的实现,需要注意什么问题;redis过期策略的实现;redis支持高并发的原因;

  • 使用消息队列的优点和缺点;了解或使用过哪些消息队列中间件并比较(rocketmq,rabbitmq,kafka);

  • rocketmq的架构,nameserver的作用,broker的作用,consumer,topic,tag的关系,消息队列的设计,消息持久化的设计,消息存储格式,消费进度判断,客户端获取消息方式;如何避免重复消费;如何顺序消费;因网络原因暂时无法消费消息的推送重试机制;

  • 分布式系统的优点和缺点;了解或使用过哪些SOA治理方式(ESB,dubbo,spring-cloud)并比较;

  • dubbo框架的架构;dubbo服务的注册,治理,暴露,引用过程;一些连接关键参数的含义(threads,iothreads,connections,queues,actives,accepts)及优化方式和原理;dubbo的负载均衡;dubbo的重试机制;dubbo的spi机制;dubbo过滤器机制;dubbo服务信息存储方式;

  • zookeeper的数据一致性如何保证;zab算法简介;持久节点与临时节点的比较;节点数据如何查看;

  • 分布式事务与分布式事务架构介绍;CAP和BASE理论介绍;与数据库事务的比较;分布式事务解决理论的比较(2PC/3PC,TCC,SAGA,TXC);

进阶

  • 如何设计redis集群的扩容与缩容方案;

  • rocketmq线程模型,消息文件读写优化;

  • dubbo是如何与spring框架结合进行服务暴露的;dubbo网络通信模型;

  • 利用zookeeper的特性除了作为服务注册中心还能帮助应用实现哪些功能;更多的一致性算法介绍和实现(raft,zraft,jraft)

  • 分布式事务核心问题解决方式;例如TCC中的请求顺序不一致,confirm请求多次,confirm找不到对应的try请求;分布式事务隔离性问题;流行的开源分布式事务中间件实现原理;

  • 其他分布式系统工具,例如分布式定时任务,日志搜索,全链路跟踪,分布式系统监控,分库分表中间件,分布式ID生成器;

13. 代码风格和规范

基础

  • 包名,类名,方法名,变量名的命名规范;

  • DO,VO,DTO,BO的含义;

进阶

  • 14. 持续集成与发布

基础

  • git常用指令及其作用;master,branch,tag的作用;多分支合并冲突解决;代码合并后如何回滚;回滚后的合并操作;

  • maven是什么;如何用maven新建多模块工程;如何排除有冲突的jar包;maven常用指令及其作用;maven坐标的定义;镜像仓库;本地仓库,中央仓库的作用;
    常用的标签比较例如;maven插件的作用;坐标中的意义;snapshot和release的比较;如何指定不同路劲的配置文件打包进classpath;

  • tomcat中如何查看配置JVM参数和容器参数;如何调优相关参数;

进阶

  • git的架构设计和实现原理;

  • tomcat容器的模块设计;

  • docker和k8s相关知识;

15. 系统设计

进阶

  • 如何设计一个抢红包或者秒杀系统;

  • 如何理解接口的幂等,如何实现;

  • 如何处理不同场景下请求超时的情况;

  • 应用从一种数据库迁移到另一种数据库方式方法;

  • 新老接口协议不同时的兼容方式;

  • 灰度发布或者白名单发布的实现方式;

  • 系统从单机向分布式演进所要引进的组件及其作用;

  • A转账给B可以分为多少个原子操作,每步操作有什么风险?如何保证转账操作的完整性,可靠性和一致性;

  • 下游系统结果只能异步返回,但上游面向用户的系统需要同步返回结果,如何设计;

  • 订单系统,支付系统的状态设计和补偿策略设计;

  • 系统负载评估的方式,如何判断优化系统的时机,有哪些指标可以判断;

  • 日志收集系统的设计方式;

  • 监控报警系统的设计方式;

16. 项目管理

进阶

  • 你所在的团队目前的需求管理流程是什么? (主要关键回复关键的流程节点,以反应对现项目流程的熟悉度);

  • 技术方案的设计模版里面需要关注的设计内容哪些;

  • 个人认为项目管理流程在实际工作中对你的帮助是什么?

  • 如果近期个人工作已经排满,产品经理找到你,要求修改已经评审通过的需求,如何处理?

  • 你觉得你所在的团队的项目流程有哪些问题?

Site by Cellophane using Hexo & Random

Hide