背景

现在是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的滑动窗口机制
  • 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开始计数),最后剩下哪个数
  • 一个系统在注册账号的时候需要完成若干操作,比如创建账号、验证身份信息、发送欢迎邮件等等,又希望这些操作尽量快的完成,你怎么设计

代码题

  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压缩-》字典树-》数组存储-》按手机号号段

需要文章面试题答案解析的朋友,以及Java面试资料,面经资料,视频笔记的;可以一键三连后:“加我VX小助理”即可免费获取到!