Java 高频面试题

本文主要是为了总结记录下我的秋招之路,毕竟现在才发面经,也太特么晚了吧。当然,如果能为他人提供哪怕微微的帮助,我也会非常高兴。先做自我介绍,研究生,方向Java开发,无实习,无项目,无获奖,无竞赛,成绩差,基础差,准备时间晚,真菜得一笔,仅有的优势就是学历还行,起码不会被卡学历。另外,心态好,学习能力强,面经看得多,个人总结到位了。最后的结果超出预期的好,毕竟我的预期只是年薪三十万,达到街薪即可。行文主要分为三个部分:个人历程、基础面经总结以及手撕代码总结。

个人历程

首先,我犯了一个极其严重的错误,那就是准备的太晚,没敢参加提前批,好多公司提前批都已经招得差不多了,正式批hc太少了。其次,实验室不让实习,没有实习经历,也没有可深谈的项目,太不利于秋招了。室友都是微软实习转正,太羡慕嫉妒了。我时常在想,如果我曾实习过,是不是会顺利很多?

我正式参加简历投递已经是九月初了。简历投了三四十,笔试做了二三十。印象深刻的有两天,其中一天堆了7个笔试,我做了5个。还有一天,4个笔试加一个面试,而且其中两个笔试是并行的。并行的意思是,贝壳宣讲会和华为笔试都是晚上7点,所以我带着笔记本去参加宣讲会, 华为笔试40分钟提前交卷,然后接着写贝壳的现场笔试。我自认为笔试做得还行,但面试真的没几个,也就京东(三面加一块不到一小时)、猿辅导(二面代码写得慢挂)、美团(二面莫名其妙挂)、bigo(一面挂, 女面试官下手太狠了)、cvte(面试自我感觉良好,然后反手被挂)、滴滴(三面因为一个非常简单的问题被挂,太特么丢人了,就不说了)。这是我国庆之前的情况,非常的失落以及慌张,感觉大厂都不怎么招人了,小厂只笔试不面试,有面试也是刷KPI的。最让我烦的是快手,我笔试全对,然后挂了。哥们听我遭遇之后,笔试干脆不做,然后快手邀他去面试,这特么跟谁说理去?这时,我甚至已经做好了春招再战的准备。

 

我真的非常感谢字节跳动。大家都说头条早已招满,所以即使头条连续给我发两次笔试链接,我都选择了其他家的笔试。然而他们依然打电话约面试。我将我秋招最后也是最大的希望都放在了头条上。国庆期间,我在牛客网上刷了很多头条的面经,把基础题和代码题全部总结了下, 不会的全记录下来慢慢解决。其实,国庆七天也就努力了三天,后四天全玩了……国庆之后的那周,是我最努力的一周。因为,一起抱团取暖、同样苦比的哥们被头条收了,只剩我一人继续苦比了。老哥回头望,笑我还不快跟上。好吧,努力去跟上。那周,我就憋着一股气去学习,去面试,就为了通过下周一的头条面试。那周,我依次面了拼多多一面,招行三面,度小满三面,自我感觉都挺好的。在此我感谢度小满,他给了我很大的信心。度小满三面都是技术面,难度都不低,面试官人都很好。二面面试官在肯定了我之后,告诫我要注意表达,虽然技术面不怎么看注重表达能力,但第三面会考察,要注意一下。同时又指点了我个人学习要注意的一些事项。第三面面试官,嚯~~~~~~,特别漂亮的女面试官。漂亮且气质,用一个词来形容就是精致,精致的面孔,精致的发型,优雅的谈吐。而且还是个技术大拿。她给我讲了10多分钟的金融知识,在得知我无offer的慌张后,她肯定了我的水平,说我的情况拿五个完全没问题,根本不用慌。并劝告我,以后在选择offer的时候,要注重个人的发展,一定要先搞清楚自己感兴趣的方向是什么,不要什么都没弄明白就一股脑扎进去。然后就是字节跳动抖音部门的面试,三面下来,又褪了层皮,感觉再也不想面试了,心累了。度小满加抖音这两天六面,真的耗光了我所有的精力。幸运的是,第二天抖音hr就微信偷偷告诉我面试通过了,慢慢等oc吧。然后我就傲娇得拒绝了云从、奇安信、小米、贝壳的面试。抱着爱咋咋地得悠然心态,走完了拼多多、华为、有道的面试流程。

嗯,最后我选择了拼多多。

基础总结

关于一面二面的基础部分,只要准备的足够充分,百分之九十的问题都能完全答对。这里面真的丝毫技术含量都没有,全靠背。在我所有的面试里,只有头条二面是靠背解决不了的,因为他总能精准找到你的知识盲区,明明这块我自认为复习的足够全面,但依然被他怼得说不出话来。即使再给我两星期时间准备,我也很难复习到他所问的那些点。但比较好的是,准备得多了,即使被抓着盲点怼,也能够现场尝试给出猜测,不管对不对,起码能体现出相关知识储备以及思考能力。关于基础知识的总结,网上有很多,最好的就是github上JavaGuide那老哥。我的建议是,将他整理的PDF打印出来,好好看好好学。最后,再按照知识点用自己的语言习惯总结一下,务必简洁扼要有序,面试的时候直接按照总结的背起就行。他总结的并不能完全覆盖所有面试点,这就需要自己去不断的看别人的面经,整理一下他人被提问的问题,对于那些不会的、说不清的又很重要的问题,去网上搜答案,看懂之后再自我总结。不断的在面试和面经中,迭代自己的知识点总结。下面我分类将我认为比较重要的问题列出来。

 

 

网络:

1、OSI七层模型与TCP/IP 五层模型,

2、常见应用层协议和运输层、网络层协议,以及硬件如路由器之类在哪一层

路由器在网络层,交换机在链路层

3、TCP与UDP区别和应用场景,基于TCP的协议有哪些,基于UDP的有哪些

4、TCP可靠传输的保证,拥塞控制目和过程

序列号,确认号,确认机制,超时重传

5、TCP粘包现象原因和解决方法

6、TCP三次握手过程以及每次握手后的状态改变,为什么三次?为什么两次不行?如果你的答案是防止已失效的请求报文又传送到了服务端,建立了多余的链接,浪费资源,但这个答案被否定了,你还能给出什么答案?

TCP是全双工连接

7、TCP四次挥手过程以及状态改变,为什么四次?CLOSE-WAIT和TIME-WAIT存在的意义?如何查看TIME-WAIT状态的链接数量?为什么会TIME-WAIT过多?解决方法是怎样的?

8、TCP、UDP、IP、以太网报文格式以及重要字段,报文从一端到另一端传递的过程。

9、浏览器输入URL并回车的过程以及相关协议,DNS查询过程。

递归查询和迭代查询

10、HTTP1.0、1.1、2.0之间的区别

11、HTTP与HTTPS之间的区别,HTTPS链接建立的过程,了解对称加密算法和非对称加密算法不?

 

12、HTTP请求有哪些,多说点。Post和get区别。

主要回答post和get

13、HTTP常见响应状态码,从1xx到5xx都要说。如304,301,302,504,

14、重定向和转发区别

15、cookie和session区别。


 

操作系统:

1、进程和线程的区别

进程是系统资源分配的最小单位

线程是系统运行调度的最小单位

一个进程中可以有多个线程,至少有一个线程

线程必须依赖于进程存在

2、协程呢?

协程是用户级线程,没有线程的上下文切换

3、进程间通信方式IPC

4、用户态和核心态

5、操作系统分配的进程空间是怎样的?线程能共享哪些?

6、操作系统内存管理方式,分页分段以及段页式的优缺点

7、页面置换算法有哪些,FIFO为什么不好?如何改进?LRU思想,手写LRU8、死锁条件,解决方式。

 

Java基础

1、面向对象特性介绍、与C++区别

2、多态实现原理

3、抽象类和接口区别,以及各自的使用场景

4、泛型以及泛型擦除。List<A>类型的list,可以加入无继承关系的B类型对象吗?如何加入?

5、Java异常体系

6、反射原理以及使用场景

7、ThreadLocal原理,如何使用?

8、内存泄漏的场景

9、static关键字和final关键字使用情况,一个类不能被继承,除了final关键字之外,还有什么方法(从构造函数考虑)?

10、序列化和反序列化。反序列化失败的场景。

11、ArrayList和LinkedList的区别和底层实现?如何实现线程安全?

数组和链表

使用CopyOnWriteArrayList

12、List遍历时如何删除元素?fail—fast是什么?fail—safe是什么?

使用迭代器

13、详细介绍HashMap。角度:数据结构+扩容情况+put查找的详细过程+哈希函数+容量为什么始终都是2^N+JDK1.7与JDK1.8的区别。

在扩容时,位置发生变化,只需要判一下,不需要重新计算

14、HashMap如何实现线程安全?ConcurrentHashMap的底层实现?JDK1.7与JDK1.8的区别

15、正则表达式会写吗?

16、设计模式了解吗?

单例模式,工厂模式

17、linux指令知道哪些?

文件操作,top,free,df,netstart,、
 

JVM相关

1、JVM运行时内存划分?

PC+虚拟机栈+本地方法栈+堆+方法区+JDK1.7与1.8区别

2、堆内存分配策略

内存分配策略
内存分配策略主要有以下几点:

对象优先分配在Eden区,如果Eden区没有足够的空间进行分配时,虚拟机执行一次MinorGC。
大对象直接进入老年代(需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。
长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄(Age Count)计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,直到达到阀值(默认15次),对象进入老年区。
动态判断对象的年龄。如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。
空间分配担保。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,如果小于检查HandlePromotionFailure设置,如果true则只进行Monitor GC,如果false则进行Full GC。

3、Full GC触发条件

  • 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC;
  • 对老年代GC称为Major GC;
  • 而Full GC是对整个堆来说的;

4、如何判断对象是否存活?回收对象的两次标记过程。

5、垃圾回收算法以及垃圾回收器介绍,尤其是G1和CMS的优缺点

6、创建一个对象的步骤

7、详细介绍类加载过程

8、双亲委派机制,使用这个机制的好处?破坏双亲委派机制的场景?如何破坏?

9、了解下tomcat的类加载机制

10、JVM性能调优,常用命令,以及工具

 

 

多线程并发

1、进程线程区别,线程安全和非线程安全区别

2、线程状态,start,run,wait,notify,yiled,sleep,join等方法的作用以及区别

public enum State {
    //线程刚创建
    NEW,
 
    //在JVM中正在运行的线程
    RUNNABLE,
 
    //线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行
    BLOCKED,
 
    //等待状态
    WAITING,
 
    //调用sleep() join() wait()方法可能导致线程处于等待状态
    TIMED_WAITING,
 
    //线程执行完毕,已经退出
    TERMINATED;
}

3、wait,notify阻塞唤醒确切过程?在哪阻塞,在哪唤醒?为什么要出现在同步代码块中,为什么要处于while循环中?

 

4、线程中断,守护线程

 

5、Java乐观锁机制,CAS思想?缺点?是否原子性?如何保证?

CAS机制,缺点存在ABA问题,是原子性,通过compare and swap机制实现

6、synchronized使用方法?底层实现?

同步关键字,修饰代码块,修饰方法

7、ReenTrantLock使用方法?底层实现?和synchronized区别?

锁机制,要手动解锁

8、公平锁和非公平锁区别?为什么公平锁效率低?

非公平锁就是不管尝试开锁的顺序,所有锁获取到的锁的几率都一样。

公平锁就是先到先回去锁。

公平锁要记录下开锁的顺序。

9、锁优化。自旋锁、自适应自旋锁、锁消除、锁粗化、偏向锁、轻量级锁、重量级锁解释

 

10、Java内存模型

主内存,每个线程有各自的工作内存,将主内存拷贝到工作内存

11、volatile作用?底层实现?禁止重排序的场景?单例模式中volatile的作用?

保持内存可见性,禁止指令重排

 

12、AQS思想,以及基于AQS实现的lock, CountDownLatch、CyclicBarrier、Semaphore介绍

 

13、线程池构造函数7大参数,线程处理任务过程,线程拒绝策略

核心线程数,最大线程数,任务队列,最大空闲时间,线程工厂,拒绝策略

14、Execuors类实现的几种线程池类型,阿里为啥不让用?

固定大小线程池

无界线程池

缓存线程池

15、线程池大小如何设置?

分为CPU密集型和IO密集型

16、手写简单的线程池,体现线程复用

 

17、手写消费者生产者模式

 

18、手写阻塞队列

 

19、手写多线程交替打印ABC

 

MySQL

1、事务4大特性,一致性具体指什么?这4个特性mysql如何保证实现的?

原子性,一致性,隔离性,持久性

2、事务隔离级别,4个隔离级别分别有什么并发问题?

读未提交,读提交,可重复读,串行化

读提交解决脏读,可重读读解决不可重复读,串行化全部都能解决

3、Mysql默认隔离级别?如何保证并发安全?

MySQL默认可重复读 

4、RR和RC如何实现的?RR使用场景?对比volatile可见性,为什么RR的事务要设计成不能读另一个事务已经提交的数据?

行锁和表锁

5、隔离级别的单位是数据表还是数据行?如串行化级别,两个事务访问不同的数据行,能并发?

数据表

6、存储引擎Innodb和Myisam的区别以及使用场景

7、 介绍Inodb锁机制,行锁,表锁,意向锁

8、介绍MVCC.

分布式版本控制协议

9、哈希索引是如何实现的?

10、B树索引为什么使用B+树,相对于B树有什么优点?为什么不能红黑树?要提到磁盘预读

多叉树IO次数少

11、聚簇索引和非聚簇索引区别

聚集索引索引和数据存放在一起

12、回表查询和覆盖索引

13、如何创建索引?

14、如何使用索引避免全表扫描?

15、Explain语句各字段的意义

16、最左前缀!!联合索引B+树是如何建立的?是如何查询的?当where子句中出现>时,联合索引命中是如何的? 如 where a > 10 and b = “111”时,联合索引如何创建?mysql优化器会针对得做出优化吗?

17、MySQL中一条SQL语句的执行过程

18、数据库几大范式

19、数据库基本查询关键字使用,如left join on,where,beteen and,group by,having,limit,聚合函数等。

20、left join,right join,inner join,outer join的含义及区别

21、mysql主从复制过程,binlog记录格式,复制的异步半同步同步模式区别

22、主从复制或读写分离等数据不一致性问题以及如何解决

23、银行的话,可以会考mysql数据类型,如余额要用decimal

Redis问题:

1、为什么使用Redis

速度块,缓存

2、分布式缓存和本地缓存有啥区别?让你自己设计本地缓存怎么设计?如何解决缓存过期问题?如何解决内存溢出问题?

3、redis和memcached的区别

4、redis常用数据结构和使用场景

5、Zset底层实现?跳表搜索插入删除过程?

6、redis过期淘汰策略

7、redis持久化机制?都有什么优缺点?持久化的时候还能接受请求吗?

8、redis事务

9、缓存雪崩和缓存穿透,以及解决方法

10、如何保证缓存和数据库的数据一致性?

11、redis是单线程还是多线程?为什么那么快?

12、五种IO模型的区别

13、select、poll、epoll的区别?

14、redis热key问题?如何发现以及如何解决?

15、redis数据分布方式?有什么优点?一致性hash呢?

16、redis主从复制,主从切换,集群

Spring

1、Spring IOC

2、Spring AOP,动态代理

3、Bean生命周期

4、Bean作用域?默认什么级别?是否线程安全?Spring如何保障线程安全的?

5、Spring事务隔离级别和事务传播属性

6、Spring以及Spring MVC常见注解

7、@autowired和@resource的区别,当UserDao存在不止一个bean或没有存在时,会怎样?怎么解决?

8、mybatis如何防止sql注入?$#的区别是什么?传入表明用哪个?

9、Spring MVC工作原理

10、SpringBoot自动配置的原理是什么?介绍SpringBootApplication注解.

11、Mybatis和Hibernate的区别

12、spring中的注解原理?例如事务注解,spring如何根据注解实现事务功能的

13、Spring中用到了哪些设计模式?单例、代理、工厂、适配、观察者之类的说一说就行

大数据和空间限制与系统设计

1、100亿黑名单URL,每个64B,判断一个URL是否在黑名单中

2、2GB内存在20亿整数中找到出现次数最多的数

3、40亿个非负整数中找到没有出现的数

4、40亿个非负整数中找到一个没有出现的数,内存限制10MB

5、找到100亿个URL中重复的URL

6、海量搜索词汇,找到最热TOP100词汇的方法

7、40亿个无符号整数,1GB内存,找到所有出现两次的数

8、10MB内存,找到40亿整数的中位数

9、设计短域名系统,将长URL转化成短的URL.(知乎老哥给出了答案,博客有人根据他的总结了一下,很好)

10、让你系统的设计一个高并发的架构,你会从哪几个方面考虑?

11、一个千万级的APP,你要搞定关注和粉丝列表,你用什么来做。要求最后一个关注的在最前面。新增和取关都要比较快的反馈你怎么做?如果一个人关注了之后,服务器宕机了怎么办?

12、OOD design:计费停车场

13、假设有这么一个场景,有一条新闻,新闻的评论量可能很大,如何设计评论的读和写

14、显示网站的用户在线数的解决思路


 

项目

如果个人没有好的项目,就用高并发秒杀。B站搜高并发秒杀,有慕课网视频,讲的很好。Github搜秒杀,有代码,跑一遍。有时间自己写一遍,没时间就看懂就好。然后准备问题,不要求每个功能都实现的特别好,但一定要多考虑系统可能出现的问题,因为很多人都是这个项目,你考虑的多,自然就显得稍微那么好了点。

1、如何解决超卖?

mysql锁+redis预减库存+redis缓存卖完标记

2、如何解决重复下单?

mysql唯一索引+分布式锁

3、如何防刷?

IP限流+验证码

4、热key问题如何解决?

redis集群+本地缓存+限流+key加随机值分布在多个实例中

5、消息队列的作用?如何保证消息的不丢失?

异步削峰;发送方开启confirm+消息队列持久化+消费方关闭自动ACK,确保消费成功之后自动调用API进行确认。

6、缓存和数据库数据一致性如何保证?

秒杀项目不用保证,其他项目就用延时双删或者先更新数据再是缓存失效,为防缓存失效这一信息丢失,可用消息队列保证。

7、压测没有?用什么压测?什么情况?

8、系统瓶颈在哪?如何查找,如何再优化?

面经之手撕代码

但凡好点的互联网公司,必然要求手撕代码。如果代码都不让你写,要么这公司根本不行,要么这公司压根就不想要你,例如京东(三面加一块面我不到一个小时,果然没给做兄弟的机会)。就连华为都开始手撕代码了,想想吧——其实现场面试的手撕代码远比视频面试的在线答题好得多,因为在线可能需要调试运行,一点错都不能出,而现场手撕,只要思路没问题,时间复杂度和空间复杂度没问题,大致写出来就行,即使错了一点点,面试官可能也发现不了。

对很多大厂而言,手撕代码是万万不能出错的,大多题目都是LeetCode里面的,题一抛出,必须马上给出思路,然后直接写出来。如果需要面试官提示才能勉强答出,就已经落入下乘了(猿辅导可能就挂在二面代码题写得太慢了)。所以多刷题,这一环节的结果好坏其实就是取决于面试官的题目自己是否曾经刷到过,是否能够顺利答出。刷题的基本要求是完成剑指offer那70道题左右,加上自刷LeetCode130道中等难度的。然后将所面试公司的他人面经提到的代码题整理一下,查漏补缺,就没问题了。

代码题一般分为几类:排序、二分查找、数据结构、数组、字符串、链表、树、回溯、动态规划、贪心、数学。首先三大排序算法快排、归并、堆排序一定特别熟练,时间复杂度一定要特别熟悉。如果这三个都没有掌握,面试就先放放吧。快排如何写,什么思想?用快排思想求无序数组中第K小的值如何写?时间复杂度多少?归并如何写?什么思想?用归并思想给链表排序如何写?用归并思想求数组中逆序对数如何写?M个长度为N的数组如何排序?时间复杂度多少?M个长度为N的链表如何排序?堆排序如何写,什么思想?时间复杂度怎么算的?符合堆的结构,插入和删除函数如何实现?把这几个问题弄会,三大排序问题基本就没问题了。二分查找,有序数组直接考虑二分查找,如旋转有序数组的最小值、旋转有序数组查找目标值、有序数组目标值的最左和最右位置、二分查找寻找峰值,二分查找问题,要考虑while(left <= right)是否可以等于,right = mid还是right = mid +1,返回值是left还是right,反正多考虑考虑边界问题。数据结构,也就是栈、队列、双向队列之类的,问题不大。数组和字符串,简单的时候很简单,难的时候很伤脑子,这类题一出基本都是要求你使用最低时间复杂度和空间复杂度计算的,多背背题目,多看看面经总结总结吧。链表,掌握好链表逆序,快慢指针,保留pre节点和当前cur删除符合条件的节点,把这些掌握了,基本能解决八成的链表问题。树,掌握层序遍历+size+flag、非递归中序遍历、非递归前序遍历、二叉搜索树特点、完全二叉树特点及善用递归解决树深度,树是否平衡,树节点最大距离,树节点最长带权路径,最近公共父节点等问题,基本解决八成树问题。回溯,两大类排列和组合,总结排列组合类型的各自特点,以及考虑去重!动态规划,多做多总结,不过一般出现在笔试中,面试很少有特别难的动态规划,即使出也很并不难。贪心,少见,做几道就好。数学,挺难的,没做过类似的真未必想起来,主要就是位运算,其中&和异或最常见,还有就是0-n顺排,求第K位的数字是多少,以及0-N,数字7或者1出现的次数,利用random5实现random7等。

 

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值