面试范围
Created at 2020-04-01 Updated at 2021-02-01 Category 面试 views
1. 计算机基础
基础
正码,反码和补码的概念;二进制的相关操作:与,或,非,异或,左移,右移关键字等;- 正码:正数是其二进制本身,负数是符号位为1,数值部分取 x 绝对值的二进制
- 反码:正数的正码和反码相同,其他位于原码相反
- 补码:正数的补码与正码相同,负数的符号位为 1,其他位是原码取反,末位加1
GB,MB,KB,BYTE,BIT的换算关系1GB = 1024MB 1MB = 1024KB 1KB = 1024BYTE 1BYTE = 8BIT二进制,十进制,十六进制的描述方式和转换方式常用的
字符集介绍和可能带来的乱码问题- 编码解码概述
- 作为2019的程序员,你还在为编码问题困惑?
- Java 语言中一个字符占几个字节? - RednaxelaFX的回答 - 知乎 https://www.zhihu.com/question/27562173/answer/37188642
ASCII码:规定了 128 个字符的编码Unicode:容纳所有字符的编码UTF-8:是一种Unicode的实现方式,是一种变长的编码方式,使用 1-4 字节表示一个符号。- 乱码:编码方式不对、解码方式不对、缺少字体
进阶
最快计算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的长度为多少?不同位数区域代表的含义?为什么会产生精度丢失的问题?
- IEEE754标准: 一 , 浮点数在内存中的存储方式
- float 是32位的,符号部分 1bit,指数部分 8bit,尾数部分23bit
- double 64位,符号部分1bit,指数部分11bit,尾数部分52bit
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,StringBuilder和String三者的比较;- 常用方法:
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"。
如何实现一个对象的
拷贝;深拷贝与浅拷贝的比较;- 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
- Java提高篇——对象克隆(复制)
- java 浅拷贝,深度拷贝与属性复制
介绍常用的
代码逻辑的控制方式;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所抽象的数据结构和对应的使用场景;对象比较的两种实现方式:
comparable和compartor;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的工作原理;独占锁,共享锁,可重入锁类
Synchronized,ReentrantLock,ReentrantReadWriteLock,AbstractSynchronizedQueue的实现方式JAVA有哪些
线程池的实现;创建线程池的参数的含义和作用;阻塞与非阻塞的比较;同步与异步的比较;并发和并行的比较;TPS和QPS的比较;如何计算一个系统的吞吐量;原子操作类
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框架中的
FactoryBean和BeanFactory的定义和比较;框架是如何进行类的加载和管理;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. 网络协议
基础
tcp和udp的比较http和https的比较GET与POST的比较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的含义;
进阶
基础
git常用指令及其作用;master,branch,tag的作用;多分支合并冲突解决;代码合并后如何回滚;回滚后的合并操作;maven是什么;如何用maven新建多模块工程;如何排除有冲突的jar包;maven常用指令及其作用;maven坐标的定义;镜像仓库;本地仓库,中央仓库的作用;
常用的标签比较例如和 ;maven插件的作用;坐标中 的意义;snapshot和release的比较;如何指定不同路劲的配置文件打包进classpath; tomcat中如何查看配置JVM参数和容器参数;如何调优相关参数;
进阶
git的架构设计和实现原理;
tomcat容器的模块设计;
docker和k8s相关知识;
15. 系统设计
进阶
如何设计一个抢红包或者秒杀系统;
如何理解接口的幂等,如何实现;
如何处理不同场景下请求超时的情况;
应用从一种数据库迁移到另一种数据库方式方法;
新老接口协议不同时的兼容方式;
灰度发布或者白名单发布的实现方式;
系统从单机向分布式演进所要引进的组件及其作用;
A转账给B可以分为多少个原子操作,每步操作有什么风险?如何保证转账操作的完整性,可靠性和一致性;
下游系统结果只能异步返回,但上游面向用户的系统需要同步返回结果,如何设计;
订单系统,支付系统的状态设计和补偿策略设计;
系统负载评估的方式,如何判断优化系统的时机,有哪些指标可以判断;
日志收集系统的设计方式;
监控报警系统的设计方式;
16. 项目管理
进阶
你所在的团队目前的需求管理流程是什么? (主要关键回复关键的流程节点,以反应对现项目流程的熟悉度);
技术方案的设计模版里面需要关注的设计内容哪些;
个人认为项目管理流程在实际工作中对你的帮助是什么?
如果近期个人工作已经排满,产品经理找到你,要求修改已经评审通过的需求,如何处理?
你觉得你所在的团队的项目流程有哪些问题?