zoukankan      html  css  js  c++  java
  • 面经中的题目整理

    Java基础

    • 面向对象特性介绍、与C++区别      链接
    • 多态实现原理
    • 抽象类和接口区别,以及各自的使用场景
    • 泛型以及泛型擦除。List<A>类型的list,可以加入无继承关系的B类型对象吗?如何加入?
    • Java异常体系
    • 反射原理以及使用场景
    • ThreadLocal原理,如何使用?
    • 内存泄漏的场景
    • static关键字和final关键字使用情况,一个类不能被继承,除了final关键字之外,还有什么方法(从构造函数考虑)?
    • 序列化和反序列化。反序列化失败的场景。
    • 正则表达式会写吗
    • ArrayList和LinkedList的区别和底层实现?如何实现线程安全?
    • List遍历时如何删除元素?fail—fast是什么?fail—safe是什么?
    • 详细介绍HashMap。角度:数据结构+扩容情况+put查找的详细过程+哈希函数+容量为什么始终都是2^N  +   JDK1.7与JDK1.8的区别。
    • 注意1.7和1.8区别
    • Java集合(List、set、HashMap、HashTable、ConcurrentHashMap等)(Java集合框架源码
    • HashMap如何实现线程安全?ConcurrentHashMap的底层实现?JDK1.7与JDK1.8的区别
    • HashMap实现原理(put、resize)
    • HashMap和HashTable区别
    • HashMap和ArrayList默认容量分别是多少?
    • HashMap什么时候扩容,几倍?
    • ArrayList什么时候扩容,几倍?
    • StringBuffer和StringBuilder区别
    • socket编程及NIO
    • 如何用线程打印abab问题,传送门
    • 异常(检测异常和未检测异常、继承关系等)
    • 反射、动态***
    • Spring的IOC、AOP
    • Java并发相关的知识
    • Spring mvc作为后端,讲述从前端请求到后端返回的全部流程,从dns解析到tcp建立连接,再到arp解析,再到反向***,再到DispatchServlet、HandlerAdapter(通过HandlerMapping找到对应的requestmapping方法)、ModelAndView等,这个问题足以将基础和框架全部联系起来。
    • Spring bean的是如何管理的?
    • 在maven中如何出现了循环依赖问题,spring中的bean是如何注入的?

    多线程并发

    • 进程线程区别,线程安全和非线程安全区别
    • 线程状态,start,run,wait,notify,yiled,sleep,join等方法的作用以及区别
    • wait,notify阻塞唤醒确切过程?在哪阻塞,在哪唤醒?为什么要出现在同步代码块中,为什么要处于while循环中?
    • 线程中断,守护线程
    • 线程间通信
    • 怎么避免死锁
    • 怎么开多个线程顺序执行任务。
    • Java乐观锁机制,CAS思想?缺点?是否原子性?如何保证?
    • synchronized使用方法?底层实现?
    • synchronize、final、static理解
    • ReenTrantLock使用方法?底层实现?和synchronized区别?
    • 公平锁和非公平锁区别?为什么公平锁效率低?
    • 锁优化。自旋锁、自适应自旋锁、锁消除、锁粗化、偏向锁、轻量级锁、重量级锁解释
    • Java内存模型
    • volatile作用?底层实现?禁止重排序的场景?单例模式中volatile的作用?
    • AQS思想,以及基于AQS实现的lock, CountDownLatch、CyclicBarrier、Semaphore介绍
    • 线程池构造函数7大参数,线程处理任务过程,线程拒绝策略
    • Execuors类实现的几种线程池类型,阿里为啥不让用?
    • 线程池大小如何设置?
    • 手写简单的线程池,体现线程复用
    • 手写阻塞队列
    • 手写多线程交替打印ABC

    JVM相关

    • JVM内存分配机制、内存模型(JVM, 基本都在《深入理解Java虚拟机》上)
    • JVM运行时内存划分?PC+虚拟机栈+本地方法栈+堆+方法区+JDK1.7与1.8区别
    • 堆内存分配策略
    • GC(minor GC、major GC、触发条件、GC算法等)
    • 什么是垃圾回收,垃圾回收的算法,GC怎么给内存分区的?
    • Full GC触发条件
    • 垃圾回收算法以及垃圾回收器介绍,尤其是G1和CMS的优缺点
    • 如何判断对象是否存活?回收对象的两次标记过程。
    • 创建一个对象的步骤
    • 类加载机制(类隔离和类共享)
    • 详细介绍类加载过程
    • 双亲委派机制,使用这个机制的好处?破坏双亲委派机制的场景?如何破坏?
    • 了解下tomcat的类加载机制
    • JVM性能调优,常用命令,以及工具

    数据库

    • 事务4大特性,一致性具体指什么?这4个特性mysql如何保证实现的?
    • 数据库几大范式,第一、第二、第三范式之间的理解和比较、举例
    • 数据库的事务、ACID及隔离级别
    • 事务隔离级别,4个隔离级别分别有什么并发问题?
    • 隔离级别的单位是数据表还是数据行?如串行化级别,两个事务访问不同的数据行,能并发?
    • Mysql默认隔离级别?如何保证并发安全?
    • RR和RC如何实现的?RR使用场景?对比volatile可见性,为什么RR的事务要设计成不能读另一个事务已经提交的数据?
    • 存储引擎Innodb和Myisam的区别以及使用场景
    • 如何避免幻读
    •  介绍Inodb锁机制,行锁,表锁,意向锁
    • 介绍MVCC.
    • 锁:乐观锁(版本号(mysql通过多版本号来解决幻读问题),cas),悲观锁(AQS,AbstractOwnableSynchronizer是重点)、ReentrantLock、CountDownLatch、CyclicBarrier、读写锁等等,与synchronized的原理对比等。
    • 数据库引擎(Innodb)的事务支持粒度
    • 索引优化(组合索引、最左匹配原则)、优缺点
    • 手动写创建索引的语句
    • 并发访问场景和所有可能出现的结果、锁作用和实现
    • 主主复制、主从复制
    • B-tree的应用
    • 哈希索引是如何实现的?
    • B树索引为什么使用B+树,相对于B树有什么优点?为什么不能红黑树?要提到磁盘预读
    • 聚簇索引和非聚簇索引区别
    • 回表查询和覆盖索引
    • 如何创建索引?
    • 如何使用索引避免全表扫描?
    • Explain语句各字段的意义
    • MySQL中一条SQL语句的执行过程
    • 最左前缀!!联合索引B+树是如何建立的?是如何查询的?当where子句中出现>时,联合索引命中是如何的? 如 where a > 10 and b = “111”时,联合索引如何创建?mysql优化器会针对得做出优化吗?
    • 数据库基本查询关键字使用,如left join on,where,beteen and,group by,having,limit,聚合函数等。
    • left join,right join,inner join,outer join的含义及区别
    • int和varchar
    • io优化
    • 分表分库设计
    • mysql主从复制过程,binlog记录格式,复制的异步半同步同步模式区别
    • 主从复制或读写分离等数据不一致性问题以及如何解决
    • 银行的话,可以会考mysql数据类型,如余额要用decimal

    操作系统/Linux/集群

    • 内存管理
    • 操作系统内存管理方式,分页分段以及段页式的优缺点
    • 页面置换算法有哪些,FIFO为什么不好?如何改进?LRU思想,手写LRU
    • 进程调度
    • 进程通信
    • 进程和线程的区别
    • 协程呢?
    • 进程间通信方式IPC
    • 用户态和核心态
    • 操作系统分配的进程空间是怎样的?线程能共享哪些?
    • 死锁条件,解决方式
    • Linux常用命令,列举一些       grep,tail,top,lsof,kill,cat之类的,
    • shell脚本、查找文件命令
    • top命令、netstat命令、ifconfig和ipconfig
    • 乐观锁和悲观锁
    • session集群共享
    • Hadoop集群扩容问题
    • 集群负载均衡
    • 虚拟路由
    • Hadoop集群单点故障

    Redis问题

    •  为什么使用Redis
    • 分布式缓存和本地缓存有啥区别?让你自己设计本地缓存怎么设计?如何解决缓存过期问题?如何解决内存溢出问题?
    • redis和mem***d的区别
    • redis常用数据结构和使用场景
    • Zset底层实现?跳表搜索插入删除过程?
    • redis过期淘汰策略
    • redis持久化机制?都有什么优缺点?持久化的时候还能接受请求吗?
    • redis事务
    • 缓存雪崩和缓存穿透,以及解决方法
    • 如何保证缓存和数据库的数据一致性?
    • redis是单线程还是多线程?为什么那么快?
    • 五种IO模型的区别
    • select、poll、epoll的区别?
    • redis热key问题?如何发现以及如何解决?
    • redis数据分布方式?有什么优点?一致性hash呢?
    • redis主从复制,主从切换,集群

    Spring

    • Spring IOC
    • Spring AOP,动态***
    • Bean生命周期
    • Bean作用域?默认什么级别?是否线程安全?Spring如何保障线程安全的?
    • Spring事务隔离级别和事务传播属性
    • Spring以及Spring MVC常见注解
    • @autowired和@resource的区别,当UserDao存在不止一个bean或没有存在时,会怎样?怎么解决?
    • mybatis如何防止sql注入?$#的区别是什么?传入表明用哪个?
    • Spring MVC工作原理
    • SpringBoot自动配置的原理是什么?介绍SpringBootApplication注解.
    • Mybatis和Hibernate的区别
    • spring中的注解原理?例如事务注解,spring如何根据注解实现事务功能的
    • Spring中用到了哪些设计模式?单例、***、工厂、适配、观察者之类的说一说就行

    计算机网络

    • 传输层协议TCP和UDP,区别和应用场景,TCP/IP五层协议,基于TCP的协议有哪些,基于UDP的有哪些  答案传送链接
    • OSI七层模型以及对应什么协议、干嘛的  答案传送链接
    • 常见应用层协议和传输层、网络层协议,以及硬件如路由器之类的在哪一层。 答案传送链接
    • TCP三次握手四次挥手等(建议把谢希仁的《计算机网络》传输层那一章好好看看,比如tcp的三次握手,四次挥手,流量控制,拥塞控制)
    • TCP三次握手过程以及每次握手后的状态改变,为什么三次?为什么两次不行?如果你的答案是防止已失效的请求报文又传送到了服务端,建立了多余的链接,浪费资源,但这个答案被否定了,你还能给出什么答案?
    • TCP四次挥手过程以及状态改变,为什么四次?CLOSE-WAIT和TIME-WAIT存在的意义?如何查看TIME-WAIT状态的链接数量?为什么会TIME-WAIT过多?解决方法是怎样的?
    • TCP可靠传输的保证,拥塞控制目的和过程
    • TCP粘包现象原因和解决方法
    • TCP、UDP、IP、以太网报文格式以及重要字段,报文从一端到另一端传递的过程。
    • HTTP1.0、1.1、2.0之间的区别
    • http和https(对称加密、非对称加密)
    • HTTP与HTTPS之间的区别,HTTPS链接建立的过程,了解对称加密算法和非对称加密算法不?
    • HTTP请求有哪些,多说点。Post和get区别。
    • HTTP常见响应状态码,从1xx到5xx都要说。如304,301,302,504,
    • http报文都有什么
    • ftp和sftp
    • 重定向和转发区别
    • cookie和session区别。
    • 从访问一个网址到页面出现,描述中间发生的所有事情。
    • 浏览器输入URL并回车的过程以及相关协议,DNS查询过程。

    数据结构&算法(要能手写)

    • 基础数据结构(链表、二叉树、队列、栈)以及排序查找算法
    • 链表(头插法、尾插法、删除、双链表、带头结点与不带、循环链表等)、栈、队列
    • 哈弗曼树、二叉树、二叉排序树(删除、增加)、b树、b-树、b+树、b*树、红黑树、字典树、树的三种遍历(代码实现,递归与非递归)
    • 图的遍历(dfs、bfs、递归与非递归)、拓扑排序、最小生成树(Dijkstra、Foyd、Prim、kruskal)
    • 排序:冒泡、插入(常用)、选择(常用)、快速(常用)、堆(常用)、归并(常用),希尔(不常用)、基数(不常用)
    • Hash及冲突解决
    • 二叉搜索树
    • 手写快速排序算法、单链表反转、字符串部分逆序(如moc.anis.www转为www.sina.com)
    • 手写二叉树层序遍历、二分查找、递归算法实现
    • 超大文件寻找top K算法设计(单机1M内存、Hadoop集群、外部排序+uniq命令)
    • 算法设计:给定函数a可以等概率产生1-5这5个数,仅调用a实现等概率产生1-7这7个数
    • 用栈实现队列
    • 订单超大并发访问-队列批量处理
    • KMP算法及改进BM算法
    • 并查集,用于求朋友的朋友问题(最小生成树个数)
    • 三路快速排序(快排优化)
    • 海量数据问题:归并排序思想,传送门
    • 洗牌算法
    • 刷题:leetcode
    • 代码题一般分为几类:排序、二分查找、数据结构、数组、字符串、链表、树、回溯、动态规划、贪心、数学。首先三大排序算法快排、归并、堆排序一定特别熟练,时间复杂度一定要特别熟悉。
      • 快排如何写,什么思想?用快排思想求无序数组中第K小的值如何写?时间复杂度多少?
      • 归并如何写?什么思想?用归并思想给链表排序如何写?用归并思想求数组中逆序对数如何写?M个长度为N的数组如何排序?时间复杂度多少?M个长度为N的链表如何排序?
      • 堆排序如何写,什么思想?时间复杂度怎么算的?符合堆的结构,插入和删除函数如何实现?
    • 链表,掌握好链表逆序,快慢指针,保留pre节点和当前cur删除符合条件的节点,把这些掌握了,基本能解决八成的链表问题
    • 树,掌握层序遍历+size+flag、非递归中序遍历、非递归前序遍历、二叉搜索树特点、完全二叉树特点及善用递归解决树深度,树是否平衡,树节点最大距离,树节点最长带权路径,最近公共父节点等问题,基本解决八成树问题
    • 回溯,两大类排列和组合,总结排列组合类型的各自特点,以及考虑去重!
    • 动态规划,多做多总结,不过一般出现在笔试中,面试很少有特别难的动态规划,即使出也很并不难。
    • 贪心,少见,做几道就好。
    • 数学,挺难的,没做过类似的真未必想起来,主要就是位运算,其中&和异或最常见,还有就是0-n顺排,求第K位的数字是多少,以及0-N,数字7或者1出现的次数,利用random5实现random7等。

    设计模式

    • 六大原则:
      单一职责原则(Single Responsibility Principle SRP)
      开闭原则(Open Close Principle OCP)
      里氏替换原则(Liskov Substitution Principle LSP)
      依赖倒转原则(Dependence Inversion Principle DIP)
      接口隔离原则(Interface Segregation Principle ISP)
      迪米特原则 (Least Knowledge Principle LKP)
    • 手写单例模式
    • 观察者模式(消息发布订阅、dubbo)、工厂模式、适配器模式
    • Spring中常用的设计模式有哪些?
    • 手写消费者生产者模式
    • 单例、工厂是被问的最多的,需重点关注,包括懒汉饿汉双检锁
    • 了解一下另外几种较常见的策略、门面、桥接、观察者模式

    智力题

    • 估算武汉市需要多少个消防站。
    • 有两根粗细不均匀的香(烧香拜佛的香),每一根烧完都花一个小时,怎么样能够得到15min?
    • 下一场雨,估算武汉市总降雨量吨数。
    • 盒子里放水果,猜哪个盒子放什么水果。
    • 一个篮球可以装多个乒乓球?

    项目

    • 每个项目从整体架构设计、扩展性、后续优化到任何实现细节都有可能会问。对做过的事情需要多总结和优化思考。项目这块是需要花大量心思准备的。
    • 你在项目上写过什么技术,面试的时候就更容易被问到,而且往往会侧重原理
    • 怎么排查问题,都遇到哪些难题
    • 学习方法
    • 如何解决超卖?mysql锁+redis预减库存+redis缓存卖完标记
    • 如何解决重复下单?mysql唯一索引+分布式锁
    • 如何防刷?IP限流+验证码
    • 热key问题如何解决?redis集群+本地缓存+限流+key加随机值分布在多个实例中
    • 消息队列的作用?如何保证消息的不丢失?异步削峰;发送方开启confirm+消息队列持久化+消费方关闭自动ACK,确保消费成功之后自动调用API进行确认。
    • 缓存和数据库数据一致性如何保证?秒杀项目不用保证,其他项目就用延时双删或者先更新数据再是缓存失效,为防缓存失效这一信息丢失,可用消息队***保。
    • 压测没有?用什么压测?什么情况?
    • 系统瓶颈在哪?如何查找,如何再优化?

    参考牛客:

    和你一样我也拿到了offer-我的校招总结

    震惊!文科生如何三个月转行成为Java工程师?

    秋招总结&Java心得(双非硕士,已拿11+5家Offer)

    秋招之路:个人历程以及面经总结

    非科班本科菜鸡投的337家(Java后台) 

  • 相关阅读:
    Web_0002:关于MongoDB的操作
    JN_0008:win下通过cmd进入指定目录
    H5_0008:链接分享图片和判断平台
    H5_0007:使用base64做为背景图片
    JN_0007:微信昵称设置小数字
    H5_0006:JS判断PC,平板,手机平台的方法
    H5_0002:微信分享设置
    Web_0001:关于阿里云防盗链Referer,CDN加速,OSS自定义域名的操作
    H5_0001:localStorage本地存储
    JN_0006:MongoDB未授权访问漏洞处理
  • 原文地址:https://www.cnblogs.com/l999q/p/12179989.html
Copyright © 2011-2022 走看看