背景
现在是2020年的黄金跳槽季,不光是很多在职人员跃跃欲试,也有很多大学生积极地加入到应聘行列。作为技术出身的我们,找工作的一大前提就是技术是否能过关。而对于java程序员来说,至少是两关的面试,这首个关卡就是笔试,今天我总结了一些关于java的面试题和面试经验,希望能帮助到正在求职的你!老司机看看自己有没有不会的哦!
java基础
- java八大类型和对应字节数
- Integer缓冲池?
- 抽象类和接口区别,从设计模式层面的理解,为什么要有这么2个东西
- String/StringBuilder
- string几种拼接方式区别,+和append底层有没有区别
- ==和equals区别
- 泛型
- 泛型 List<Integer> 与 List<String> 这两个的getClass是否相对?
- <? extends String> 有什么作用?
- 多态
- 反射
- 重载和重写,底层如何实现的
- equals 和 ==区别
- final的作用和用法
- 深拷贝浅拷贝,参数传递,值传递和引用传递的关系,String和char数组作为入参,结果会改变吗
- 类修饰词default和protected关系
- 异常都有几大类?运行时的空指针会抛异常吗?IO Exception异常发生需要自己去捕获?
- 编译期间需要捕获,运行时不需要捕获
- 静态变量线程安全
- Object的基本方法
- Java序列化,如何不让某个成员序列化
- comparator排序,对于一个容器,比如set,你想实现自定义排序规则的话怎么做
- 说一下byte a = 127; byte b = 127; a+=b和a = a+b的区别分别会出现什么问题。
- Class.forName和ClassLoader的区别
- lambda表达式,每个用户有个黑名单标识位,如何用lamda表达式来实现把黑名单标识位为true的过滤出来并得出String的形式
数据结构
- 说一种我最熟悉的数据结构,具体到每种api操作,除了链表数组之外的数据结构
- 讲讲知道哪些数据结构
- AVL和红黑树有什么区别?
- 二三树转变成红黑树的过程
- 集合框架源码,concurrenthashmap,hashmap,linkedhashmap
- 实现LRU
- hashmap(ConcurrentHashMap已成必问)
- resize死循环
- hashtable和hahsmap区别
- 说说copyOnwriteArrayList以及他们分别采用的并发修改(fast-fail,fast-safe)
- 为什么使用红黑树
- HashMap的数据结构是什么?
- HashMap当在扩容时候进行put操作时||JDK1.7头插法的缺陷||JDK1.8有那些变化
- HashMap get/put过程
- 为什么链表是8次以后就转换为红黑树,什么时候转回链表
- HashMap的put操作是怎么实现的?
- HashMap是线程安全的吗,为什么?(引出线程安全的解决方法,hashtable或ConcurrentHashMap)
- ConcurrentHashMap是怎么保证线程安全的?
- HashMap如何解决哈希冲突,还有什么方法(开放寻址法,线性探查,二次探查;布谷鸟哈希)
- HashMap和ConcurrentHashMap的put/get操作
- ArrayList
- ArrayList和LinkedList有什么区别,底层怎么实现?
- ArrayList扩容时做了什么操作?
- 扩容时是在数组的后面加的吗还是?
- 数组怎么实现对象排序
- LinkedhashMap
- 数据结构
- 红黑树的细节,有什么特点
操作系统
- 进程调度,进程状态生命周期图
- 操作系统组成
- 进程给线程划分了什么资源
- 操作系统内存模型不连续空间分配,说说分段,分页,虚拟内存,页淘汰算法
- fork子进程在linux里时两倍的进程开销吗
- 操作系统的虚拟内存机制,操作系统的内存管理(伙伴系统,slab缓存)===由锁慢引出的知识点。
- 线程和进程的区别==肯定不是一句话就能回答这么简单的哈
并发
- 为什么要线程安全
- 为什么要同步,同步的方式有哪些
- Java有哪些锁同步机制
- 死锁的条件,你是如何排查死锁的(重点在于你)
- 介绍线程池
- 为什么使用线程池(如果服务器性能足够好下)
- 怎么实现一个线程池
- 线程池怎么调度(看看源码)
- 进程和线程,区别哪个效率高,为什么
- 为什么需要锁
- 说说AQS
- 说说CAS
- Unsafe类实现CAS?
- 直接使用Unsafe会有什么问题吗?
- 锁为什么慢,操作系统调度为什么慢
- volatile关键字,(x86CPU层面解读==要有时间能说出CPU协议更牛逼了)
- Atomic Integer和Integer区别,Atomic Integer原理
- 讨论各种同步锁的性能,i++操作用Synchronize锁吗?
- 列举常用的并发工具,指JUC包里面的类
- synchronized实现原理
- synchronized怎么保证可见性,在占有锁这个线程占有锁之前,有其他线程复制了变量到工作内存中,那么占有锁的线程改完的结果其他线程能立即可见吗
- final修饰什么的时候能够保证可见性
- Reentranlock底层实现
- 优化方案,采用reentranlock的condition实现
- 多线程画出状态图
- ThreadLocal原理
- ThreadLocal模式出现内存泄露吗?
- ThreadLocal怎么用的
- 可以反过来项目的时候自爆知识点
- 各种锁 悲观锁和乐观锁
- 线程池阻塞队列满了怎么办:详细说了拒绝策略和FixedCachePool的无界队列造成的OOm(当到了最大线程数时如何处理)==很喜欢问线程池爆了怎么办(你通常用哪个策略?)
JVM
- 内存泄漏如何发现,举例子(你自己遇到过吗?),怎么排查,OOM异常||内存溢出和泄露有区别吗?日志->jconsole->jmap->jvisuavm
- CMS和G1垃圾回收算法 G1解决了CMS的缺点吗
- 让我自己实现垃圾回收算法的标记过程。我说BFS,他让我描述算法的细节。然后让我用DFS做一遍。
- 优缺点
- 哪个版本的JDK用哪个收集器
- 年轻代存活的对象为啥不直接放老年代
- JVM内存区域,每个部分都要详细说说
- 堆和栈的区别
- 堆外内存
- 垃圾回收原理,全流程要掌握
- 类加载过程
- 讲讲JVM创建对象过程
- 双亲委派机制
- 怎么自己写一个java.lang.Object
- 如何打破
- 为什么要引入双亲委派机制
- 静态内部类会被编译成几个class?为什么内部类可以访问外部类的private的方法
- 我在jvm上运行一段java程序输出一条语句,它是怎么输出到屏幕上的
- 线程的生命周期
- JVM有哪些优化配置参数,JVM还是要考参数,尤其你拿JVM作为项目更会考了
- 如何避免full gc
数据库
- 数据库范式,数据库为什么要有范式(可能很多时候都是答题的中心思想)
- 数据库设计,你会怎么设计数据库表(回到范式题)
- 数据库各种锁+使用场景
- 我们的数据库当中如何做的优化?举案例。==引索引
- MyISAM和InnoDB区别
- 为什么不支持行锁,myisam的优点
- 如果是存储日志,用什么存储引擎比较合适
- mysql底层是什么,为什么效率高,主键能不能太大,为什么,如果太大,底层数据结构会不会变化,为什么
- mysql join的底层原理是什么,有哪几种(不是左右连接这种)
- MySQL 索引原理
- 聚簇索引和非聚集索引
- auto_increment有什么好处
- 数据结构,为什么要这样使用,B+树历史必问的啦,B+为什么不用B-
- 索引失效情况,什么情况下会放弃使用索引
- 用过的InnoDB索引?优势何在?(应该先问是按逻辑方面还是物理方面...)
- 联合索引怎么使用
- “like”查询在什么时候能够用上索引
- 一个表十几个字段,怎么建立索引==真实情况下如何考虑整个表的构建==性别这种索引放在前面还是后面
- SQL语句(基本数据库语句,通常是考连接语句join,groupby)
- 写sql 学生成绩教师三个表、 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩和对应的老师
- 写sql 找出语文成绩及格平均成绩不及格的学生姓名语文成绩
- SQL各种连接的概念,区别。连接后的行数和列数
- 交换性别值;交换职务值(学生,老师,教授)性别反转 表中有个字段性别 = 'm' 代表男性 'f'代表女性,一句sql反转过来
- 事务===极其重要,因为实际业务事务回滚的常见,所有面试官都对这个了如指掌
- 特性/概念,具体介绍
- 事务隔离级别
- 场景题@Transaction的原理,还有比如在一个类中两个方法,一个是B方法,一个是C方法,B上没有注解,C上有那么在外面调用B方有事务,为什么,根据底层原理能不能推断出来(给提示问你能不能推断出来)
- 脏读,幻读,不可重复读
- 试验RR级别下出现幻读
- MVCC
- mysql有什么优化策略
- mysql连接池的作用
- mysql调优?==explain,如何分析一条SQL的索引使用情况(细问到Explain 中的字段)
- MySQL的主从复制原理,如何实现
- 数据库中一行记录大小10K,一个表只有主键索引,可以存多少条数据?你有没有试过数据库一个表中最多可以插入多少数据
- 什么样的查询会有回表查询
Redis
- redis高并发
- 如果有10w请求插入Redis,如何优化?
- 1w条的插入和更新有什么区别
- 怎么保证redis的时效性(双写)
- redis数据类型源码级别
- zset底层实现,为什么,效率是多少
- 存验证码的话用的哪个数据类型
- redis持久化方式,aof文件比较大怎么办
- Redis缓存怎么解决数据一致性
- redis原理
- redis场景题
- 说说redis和mysql区别,从而引出redis和mysql的使用场景
- 缓存击穿,雪崩,穿透
SM
- 代理模式怎么实现
- 静态代理,jdk动态代理和cglib动态代理 问的很细(jdk为什么一定要实现接口,如果不实现接口会出现什么问题
- MyBatis的原理分析,Mybatis执行流程
- Mybatis问你觉得从哪体现的优缺点
- Mybaits里面参数#和$有什么区别,要举一个sql注入攻击的例子
- spring常用的注解,有没有扩展过spring自己的功能
- Spring底层问题
- spring bean生命周期
- spring aop,ioc实现原理==请举生活中aop/ioc的一个例子
- 循环依赖,动态代理
- spring 拦截器知识
- 什么样的bean你会设置为延迟加载
- Spring的事务传播机制
- SpringMVC执行原理
- springboot启动流程
- springboot启动类放置目录在哪里
- spring boot加载bean过程springboot特点
网络
- http原理
- http缓存,http完整流程 Cookie的传输过程?Cookie失效
- HTTP报文格式什么样
- HTTP请求头中表示请求数据格式的是哪个
- HTTP返回码有哪些
- HTTP返回码206什么意思
- https原理,HTTPS怎么建立的连接,其中用到对称加密还是非对称加密;
- tcp原理
- tcp连接三次握手,释放四次挥手,为什么是三次而不是四次或是两次
- 每次握手发送的参数,timewait和closewait状态含义
- TCP中有哪些涉及到超时的
- TCP的滑动窗口机制
- tcp连接三次握手,释放四次挥手,为什么是三次而不是四次或是两次
- http tcp联系和区别
- NIO了解吗,说了buffer、channel,还有Seletor(浅)然后说如果客户端线程被系统释放了,丢失的这个上下文怎么办,提到了BIO,知识盲区,很尴尬墨迹了半天说不会(阿里好像很喜欢问这个地方,然而我并不会netty)
- poll 和 epoll 的区别
Linux
- Linux查看文件第n行
- Linux文件系统原理/inode和datablock那一块的知识点
- linux查询tcp连接处理CLOSE_WAIT的状态的数目
- Linux查看进程,删除过期文件
- 平时怎么用linux做定时任务的
- 进程fork的过程还是要了解一下
- 介绍一下你用过的Linux命令
- linux五种io模型
设计模式
- 说说你知道的设计模式(你要结合spring具体场景讲,追问spring为什么要使用这个设计模式)
- 工厂模式、适配器模式
- 单例模式那几种实现和优缺点都要知道
- 手写双重检查锁单例模式
- 五大设计原则也要记住,在答别的题不会时就扯这五个原则
项目
- 项目你觉得最大的难点
- 项目你学到了什么
- 项目你是如何优化的
手写系列
- 手写jdk中的优先级队列 PriorityQueue
- 手写代码 实现阻塞队列,ArrayBlocking源码
- 手撕一个阻塞队列,生产者生产0~100的随机数,消费者消费后将其存储到一个list,需要保持list中元素保持递增。(信号量+线程安全)
- 两个栈实现一个队列
- 实现一个Java栈结构 ==话说这种一般能用的数据结构是什么?
- leetcode155 最小栈
- 快排和堆排的区别,手写快排,堆排。泛型快排学到了装杯的东西
- 手写算法求最长子序列
- 求下一个大的数
- 62:圆圈剩下的数字
- twoSum
- 如何查询一个文件内的重复最多的次数的数字,如何高效实现,时间复杂度,空间复杂度、
- 镜像二叉树
- 矩阵顺时针转90度
- 判断回文字符串
- [1,2,3,2,3]找出其中只出现一次的数(让用位操作去实现)
- 1亿个int short类型的数据进行排序
- 10w个手机号找一个
- 合并链表
- 海量集合A和B求交集
- leetcode1247
- 美团外卖有100台服务器,美团财务只有2台,美团财务要对每笔订单记账???怎么做,我实在不会,bala了一下消息队列,说先存着,慢慢处理。。。。。面试官说消息队列是搞存储的吗?我说只存个编号。
- 线上一台MySQL服务,随着时间增加SQL性能越来越差,排查思路
- 如果说有一个操作需要创建一个对象,这个对象很大,需要消耗很多资源,如果说每调用一次方法就创建一个对象的话,开销太大,如果把它定义成一个静态变量,又会产生并发问题,那么多线程并发操作的时候就需要加锁,降低效率。怎么优化才能既不用加锁又能提高并发访问的效率
- (1)利用“资源池”的思想,,用一个资源池,存放10个该对象,每次创建的时候从池中获取,降低并发度
- (2)ThreadLocal:看倒是看过,就是没想到。知识还是要融会贯通呀
- 存储了0-100的数据,如何删除其中小于10的数字(其实问的是list中如何删除元素——迭代器)
- 为什么不能在遍历list的时候删除其中的元素呢
- 如果现在有8G内存,一个程序很大,由于还要留下一部分内存供其他程序使用,那么如何控制这个程序使其占用的内存不能超过6G呢?考JVM参数
- 基于B+树索引的特点,更新操作慢,现在有这样的需求,就是存储日志文件(一般来说日志文件只有在出错的时候才会去看它,平时基本上不会去查)应该如何设计索引的数据结构?》》就还是用树来存储,只是不维护索引顺序
- 环形链表判断有环,环入口节点
- 岛屿数量(leetcode 200) DFS秒解
- 数组实现栈(入栈、出栈、扩容)
- 除了垃圾回收,还有那些工作会造成CPU负载过高(其实这里给出的是一个场景,就是让描述一下除了垃圾回收之外,还有那些工作会让线上CPU占用到百分之90-100,并且给出排查过程。
- 希尔排序、快速排序、归并排序的细节,时间复杂度和空间复杂度;
- aaaaaabbbbbbzzzz.....zzzccccccc这样的字符串有100kb,怎么压缩?记录每个字母出现的开始位置即可
- hashmap实现一个缓存,要求有过期时间
- 初始化的时候有个aliveTime,用两个hashmap一个用来存key~ value,一个用来存key~createTime,然后put的时候两个map都存一下,获取的时候先get一下createTime,判断时间有没有超过aliveTime,超过就返回null,否则返回value就好啦(时间是用Date类来获取的)
- 对链表两个节点一反转:1->2->3->4变成2->1->4->3(编程题)
- 给定一个数组判断是不是二叉搜索树的后序遍历的结果(编程题)
- 求数组中子数组的和的最大值
- 求二维数组中子矩阵和的最大值
- 求二维数组中子矩阵的积的最大值
- Leetcode的430题. Flatten a Multilevel Doubly Linked List
- (编程题)数组中找出最小的k个数,空间复杂度O(1)
- (编程题)二维数组,每一行从左到右递增,从上到下递增,判断给定的数是否存在
- (编程题) 1,0,0,1,1,0,1变成0,0,0,1,1,1,并保证稳定
- (编程题) 给定一个数组,求子数组的最大和
- (智力题)1-1000个数,每次删除奇数位置的数(位置从1开始计数),最后剩下哪个数
- 一个系统在注册账号的时候需要完成若干操作,比如创建账号、验证身份信息、发送欢迎邮件等等,又希望这些操作尽量快的完成,你怎么设计
代码题
- 以下代码题输出什么?(巨坑,输出100,从泛型+向上转型+map+equals原理上想) 因为i-1转integer,所以不会删除
Map<Short, String> map = new HashMap<>(); for(short i = 0; i <100; i++) { map.put(i, String.valueOf(i)); map.remove(i-1);
}
System.out.println(map.size());
2. 这是一个多叉树,Node应该是这样,当时并没有给,这是我觉得是这样的,当时只给了方法和说明是多叉树
Node <T>{
T value;
Node[] children;
}
public Integer getValue(Node<Integer> root, int level, int index){
}
找到第 i 层的第 index 个结点的值,如果没有,返回null,时间复杂度是多少
人生题
- 最近在看什么书,对自己有什么提升
- 最近了解的新技术,怎么了解的,用它做了什么(我当时答得docker,导师项目中用到的)
- 去实习想学到什么东西
- 学的最好的课==引导面试官的机会
反问面试官
- 您觉得我有哪些方面需要提高 如何提高(让他给你建议) ,这个问题可以折射出你这次面试的评价 ,如果面试官对你满意的话 他会直说的 ,同时也可以知道自己的薄弱点 ,通过面试官的建议来针对性的提高。所以如果是正常面试的话我就会问面试官这个问题
- 还可以问面试官部门的业务 ,他们部门主要使用的框架 ,还有就是可以试探一下有没有下一次面试
- 让他给你的建议主要是 思维 基础 方面如何提高 ,或者如何横向扩展/深入扩展知识面 这种问题 。(但是不要问面试中出现的问题,比如面试中有个问题没答上 ,千万别问)
没看懂的考点
- 谈一下Java后端编译优化。
- Java分层编译,0、1、2、3、4是啥?
- 方法内联,分支预测。
- 如果通过JIT日志分析出来没有优化,怎么在代码中体现?
- 什么时候会进行内联优化?
- 介绍一下虚方法表。
- 刚二面完:就三题
- 第一题:一个超大的文件,文件每行是一个数字,找出出现频次最高的5个数字
- 分块->hash->大顶堆
- 第二题:10亿个手机号找一个?
- 10亿个手机号的文件转储,如何压缩,同时要能够计数,就是给出一个手机号,判断出现过没,出现过给出出现次数?
- CIDR压缩-》字典树-》数组存储-》按手机号号段
- 第一题:一个超大的文件,文件每行是一个数字,找出出现频次最高的5个数字
需要文章面试题答案解析的朋友,以及Java面试资料,面经资料,视频笔记的;可以一键三连后:“加我VX小助理”即可免费获取到!