个人情况

楼主一年经验的Java后端,2021年初毕业,3月份入职某互联网大厂,2022年5月份不幸毕业,之后面试了一些公司,也拿到了还算能接受的offer,近期趁着有空,将面经回馈大家,大家一起交流学习。

1、核心考察点

总体和外企篇区别也不大,可能对于技术基础的考察更深一点,不考察英语

1)、技术基础

国内互联网大厂对于技术的考察比较深入和详细,考察的点包括数据库原理、Java基础、JVM垃圾回收机制、多线程和高并发,这方面考察的比较多。对于校招时候重点准备的计算机网络很少提及,操作系统被问过几次,但是不多。我的技术栈写了Redis,所以这一部分也被问的比较多,包括缓存雪崩、缓存击穿、缓存穿透以及Redis的底层存储结构都被问过。

2)、项目经历

面试官一般会关注自己比较熟悉的或者和面试岗位关系密切的项目。另外据我观察高并发场景是大家都比较喜欢问的,如果有相关的项目可以着重准备。
简历书写方面建议在项目经历中突出一些技术点,这样可以让面试官顺着我们的技术点来考察,避免无差别攻击。

3)、算法题

mid为主

2、拼多多

这家通过了但是没有去,给钱很大方,不过不太适合我

1)、一面

问项目细节
写算法题:一个二叉树的最长路径,路径返回来(LeetCode上有很类似的一个题,是求最长路径的长度,这里的题目是要把路径返回来,所以相当于是一个变式)
场景题:跟我之前从事的业务相关的一个题

2)、二面

业务题:对于X(面试部门的业务)的理解,与Y(其他几家相似的业务)有什么区别
算法题:
一个字符串,只包含小写字母。对字母进行去重之后会产生一系列的子序列,返回字典序最小的子序列的第一个字母。
解法:用一个Set存储已经遍历了的字母,用一个字符变量tmp存储当前已遍历到的最小的字母。从后往前遍历,如果当前字母小于tmp,tmp替换成当前字母,并且将当前字母塞入Set,如果当前字母大于tmp,判断是否已经在Set中,如果已经在了说明后面有可以替换的,如果不在Set中,tmp替换成当前字母,并且将当前字母塞入Set。最后的结果就是tmp。

3)、三面

主要问项目,没有考察算法题

3、字节跳动

面了两个部门,都挂了以后还是有别的部门捞,但是没有再面了

3.1、A部门(偏技术中台)

1)、一面:

(1)问项目
项目难点。
问中间件的细节。HSF的细节。生产者的IP变了怎样让消费者感知到。
项目中某个消息的QPS大概多大,存在哪里,数据库的QPS多大
(2)算法题
连续出了三道题。。。
带过期时间的LRU缓存(LeetCode146)。写了一半说思路。
给定一个数组,找出这个数组的和为奇数且和最大的子序列。说了思路
给定一堆字符串,找出在所有字符串中都出现了的字符。说了思路
(3)基础
TCP三次握手
数据库连接池的作用
还有别的,有点忘记了
(4)程序设计
如果让你设计一个RPC框架,你要怎样设计(针对增加机器和减少机器的情况)

2)、二面

(当天进行了很多面试,具体问题记不太清了,可能有一些不是字节问的)
(1)基础相关
数据库的分页管理
64M的内存,数据每条1k,可以存多少
13层的B+树最多可以存多少数据
数据库一页可以存多少数据,是由什么决定的
(补充一个别家面试:数据库的某一页剩下一些零散的内存,怎么把它们迁移出去得到一个完整的页
B+树和B树的区别
B+树的存储结构
(别家面试:红黑树的底层实现、左旋右旋构建
Redis为什么这么快
IO复用、底层存储结构
线程同步的方式
(别家面试:synchronized的底层实现原理
(别家面试:spring和springBoot的区别
spring的线程同步。
AOP的底层实现原理
(2)算法题:
1~n共n个数,找到按字典序排序的第k个(LeetCode440),是一个hard,没做出来挂了。

3.2 B部门

这次是一个业务部门
1)项目相关
用的什么垃圾回收机制
新生代是ParNew,老年代是cms
业务数据指标还了解哪些
Tair(某个公司自研中间件)锁用的哪种数据结构
2)技术基础
JVM垃圾回收机制
数据库的索引失效
设计模式:发布订阅模式
3)算法题
LRU缓存(LeetCode164)这个题被问了好几次了,在不同的公司被问了好几次

4、滴滴

这家是我面的第一家互联网公司,面的特别惨,很多都没答上来。一面结束觉得自己凉了,不过隔了一周又被捞了,但是最后还是挂了,可能是综合评价不够好吧。
下面记录的是一面的面试题,因为面的太差面完了把答案也整理进来了,二面主要就问了一些项目相关的内容,和我之前的工作经历相关性比较大,不太具有普适性,就不写了。

1、volatile关键字

可见性:
可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
volatile关键字 和 synchronized关键字都实现了可见性。
如果不限制可见性,多个线程读取数据时,可能直接读取各自缓存中的数据,当同时修改的时候可能会读到脏数据,加入可见性之后要求只能在内存中读取数据,这样一个线程改动了数据,其他的线程马上就可以知道。
原子性:
即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
命令的不可拆分
有序性:
即程序执行的顺序按照代码的先后顺序执行。禁止指令重排序
volatile关键字 和 synchronized关键字保证了有序性。
多个指令在执行的过程中,Java会按照耗时等指标进行重新排序,有序性限制使得该指令之前的指令一定在该指令之前,该指令之后的一定会在该指令之后。

2、atomic包

在java 1.5的java.util.concurrent.atomic包下提供了一些原子操作类,即对基本数据类型的 自增(加1操作),自减(减1操作)、以及加法操作(加一个数),减法操作(减一个数)进行了封装,保证这些操作是原子性操作。atomic是利用CAS来实现原子性操作的(Compare And Swap),CAS实际上是利用处理器提供的CMPXCHG指令实现的,而处理器执行CMPXCHG指令是一个原子性操作。

3、JMM

计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。
也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。
如果一个变量在多个CPU中都存在缓存(一般在多线程编程时才会出现),那么就可能存在缓存不一致的问题。
为了解决缓存不一致性问题,通常来说有以下2种解决方法:
1)通过在总线加LOCK#锁的方式
2)通过缓存一致性协议
这2种方式都是硬件层面上提供的方式。
JAVA内存模型:
在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽各个硬件平台和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。
Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。
(1)在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。 如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现。
(2)对于可见性,Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。 另外,通过synchronized和Lock也能够保证可见性 。
(3) 可以通过volatile关键字来保证一定的“有序性”(具体原理在下一节讲述)。另外可以通过synchronized和Lock来保证有序性,很显然,synchronized和Lock保证每个时刻是有一个线程执行同步代码,相当于是让线程顺序执行同步代码,自然就保证了有序性。

4、Java中是否有析构函数

java中有析构函数,但我们一般用不到它,因为java有自动内存回收机制,无需程序员来释放,也就不要担心内存泄露,只不过java中析构函数所采用的方式不是C++中的那样前加~号,在java中 对象析构时会调用void finalize()方法,因此你如果确实需要析构的话就可以为你写的类添加一个void finalize(){}方法,来完成你所需要的工作。

5、finalize()方法

在Object类中的源代码:protected void finalize() throws Throwable{ }
GC负责调用finalize()方法。
finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。
这个方法不需要程序员手动调用。JVM的垃圾回收期负责调用这个方法。
finalize()只需要重写,重写完将来自动有人来调用。
finalize()方法的执行时期:
当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法。
finalize()方法实际上市SUN公司为java程序员准备的一个时机,垃圾销毁时机。
如果希望在对象销毁时机执行一段代码的话,这段代码要写在finalize()方法当中。

6、try catch finally

1、不管有没有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

7、Redis相关

8、手写单例模式

线程不安全的懒汉式:
public class Singleton {
private static final Singleton instance;

private Singleton () {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;
}

}
双重锁检测:
//正确的双重检测锁
public class Singleton {
private volatile static final Singleton instance;

private Singleton () {}public static Singleton getInstance() {if (instance == null) {  //第一次空检测synchronized (Singleton.class) {if (instance == null) {  //第二次空检测instance = new Singleton();  //实例化对象}}}return instance;
}

}
线程安全的懒汉式:
public class Singleton {
private static final Singleton instance;

private Singleton () {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;
}

}
饿汉式:
public class Singleton {
private static final Singleton instance = new Singleton();

private Singleton () {}public static Singleton getInstance() {return instance;
}

}
静态内部类实现:
public class Singleton {
private Singleton () {}

public static Singleton getInstance() {return SingletonInner.instance;
}private static class SingletonInner {private static final Singleton instance = new Singleton();
}

}
枚举类实现
public enum Singleton {
INSTANCE;
}

9、Git合并几次commi成为一个commit

10、c++的库函数

因为我在自己的技术栈里面写了了解C++,我是在上学的时候用C++,而且用的都是OpenCV相关的库,所以属于是给自己挖坑了

11、List、Map、Set、Array介绍一下

12、List和Array的扩容

13、Map的几个实现:HashMap,TreeMap,扩容

14、B+树

15、算法题

根据树的前序、中序遍历结果重构二叉树(剑指offer07)

5、快手

面了两个部门,第一个部门面完了HR反馈面的还不错,但是经历跟部门不太匹配。所以又换了个部门,但是还是挂了

5.1 A部门

1)、一面

(1)Java基础
volitale关键字
synchronized关键字
JVM垃圾回收
栈、堆
JVM哪些数据存在堆
JVM哪些数据存在栈
分布式锁怎么用
(2)项目相关
MySQL
隔离级别
索引用什么存储
B+树结构、特点
查询一个id > 100 and id < 200,查询的过程
索引相关
(3)算法题
Excel的列的转换,类似于A是第一列,B是第二列,AA是第27列,以此类推(LeetCode168)
(4)反问

5.2 部门B

一面忘记了

1)二面

(1)项目
(2)技术基础:
JVM的内存分区、垃圾回收机制
CMS算法什么时候会发生stop the world
g1算法为什么这么快
mysql的事务隔离级别
mysql为什么不用哈希表,为什么不用二叉树
mq如何避免消息丢失
Redis的主从复制
synchronized 和 ReentrantLock的区别
Redis的持久化方法
(3)算法题:
一个二维矩阵,每行从左到右递增,每列从上到下递增,找出其中是否存在某个数(特别经典的题,剑指offer和LeetCode都有)
(4)反问:

6、华为

华为社招的正编岗位非常非常少,而且流程巨慢。我这个一直到我入职都没有等来面试。但是也有一起找工作的同学,一年经验社招进了华为正编。
面试之前要先参加笔试,参加之前建议在牛客网练习一下,因为华为的机考要自己处理输入输出
笔试题:
(1)两个字符串数组,去重并排序
(2)某个瑕疵度(以元音字母开头和结尾、字符串中的辅音的个数叫做瑕疵度)的最长子字符串。

7、最右

1)、写算法题
判断一棵树是否是二叉搜索树(LeetCode98)
2)、项目
3)、系统设计
如何获取关注和粉丝列表
24小时热帖
延迟队列(比如下单15分钟之后看一下有没有结算)

8、XTransfer

1)、一面

(1)项目:项目亮点(需要提前想好怎么说),针对性的问了一些问题
(2)技术基础
数据库
如何优化慢sql 回答建立索引
索引什么条件下会失效
数据库连接池的作用
数据库的事务,如何保证事务 加锁
数据库的索引是用什么结构存储的 B+树的时间复杂度是多少,为什么是这样
多线程
wait()和sleep()
Java基础
ArrayList LinkedList HashMap HashSet之间的区别和联系
了解几种排序,时间复杂度分别是多少
其他
一致性哈希
(3)算法题
删除链表中的倒数第n个节点,前面提过的

2)、二面

(1)项目
(2)写算法题:
两个整数做除法,如果结果是循环小数,用()把循环的部分括起来。

9、洋钱罐

技术问题忘了,把记得的算法题写一下
二面:荷兰国旗问题
三面:LRU缓存

后端Java一年经验面经--国内互联网篇相关推荐

  1. 后端Java一年经验面试记录--外企篇

    个人情况 楼主一年经验的Java后端,2021年初毕业,3月份入职某互联网大厂,2022年5月份不幸毕业,之后面试了一些公司,也拿到了还算能接受的offer,近期趁着有空,将面经回馈大家. 1.核心考 ...

  2. 后端Java一年经验和技术记录

    1.引言 入行已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少东西.这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为系统维护和发布当救火队员的苦恼.遂决定 ...

  3. 后端Java一年经验面经--其他篇

    个人情况 楼主一年经验的Java后端,2021年初毕业,3月份入职某互联网大厂,2022年5月份不幸毕业,之后面试了一些公司,也拿到了还算能接受的offer,近期趁着有空,将面经回馈大家. 这篇介绍国 ...

  4. 可能是国内第一篇全面解读Java现状及趋势的文章

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 InfoQ 发布 2019 中国 Java 发展趋势报告:既不捧杀 ...

  5. 可能是国内第一篇全面解读 Java 现状及趋势的文章

    导读:InfoQ 发布<2019 中国 Java 发展趋势报告>,反映 Java 在中国发展的独特性,同时也希望大家对 Java 有一个正确的认识. 2 个月前,InfoQ 英文站发布了一 ...

  6. Java Web技术经验总结(二)

    该系列的第一篇在此:Java Web技术经验总结一,主要包含我在日常工作中的经验和心得体会(如有不足之处欢迎指出). Maven的使用经验 依赖的scope有test.provided.compile ...

  7. java零项目经验,找工作前该如何准备项目?面试时又该怎么说?

    当下找Java工作时,面试官必问的问题是,你干过多少年的java项目?你最近的项目里,用到了哪些java技术?随会在此基础上进一步确认求职者的能力. 如果求职者之前有做过java项目,这块自然没问题, ...

  8. 「实战篇」开源项目docker化运维部署-后端java部署(七)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「实战篇」开源项目docker化运维部署-后端java部署(七) 本节主要说说后端的部署需要注意的点,本身renren-fas ...

  9. java项目教训_[免费电子书]分析超过600,000个Java项目的经验教训

    java项目教训 建立明智的错误处理工作流程需要什么? 调查和解决生产中的应用程序错误对于维持性能和可靠性至关重要. 但是,这并不意味着要花很多时间. 要理解为什么在生产中的故障排除,可这样的头痛,我 ...

最新文章

  1. LeetCode 399. Evaluate Division--Python-DFS解法
  2. php实现项目的日志记录功能,tp5框架使用composer实现日志记录功能示例
  3. 使用Gensim来实现Word2Vec和FastText
  4. java 线程池原理分析
  5. 描述文件安装失败无法连接到服务器_iOS13 Beta安装失败解决办法
  6. struts 文件下载
  7. python flask安装_python flask安装和命令详解
  8. 2020年, video captioning论文汇总
  9. Puppet 的部署与应用,看这一篇就够了
  10. Scrapy安装报错
  11. mysql column legnth too big for_Column length too big for column 'Flist' (max = 21845);
  12. 平台表单默认按钮的使用及效果展示——JEPLUS软件快速开发平台
  13. opencv-api drawKeypoints drawMatches
  14. SpringMvc+Mybatis +Oracle
  15. 串联电阻分压计算器---实际常用电阻表
  16. 2016年计算机辅助设计试题,cad考试题「附答案」
  17. FFT蝶形算法的verilog实现专题——64点FFT 蝶形算法完整展开
  18. Docker官方文档阅读笔记
  19. python之批量下载抖音视频
  20. Android 用代码查看本机保存的Wifi密码

热门文章

  1. C#网站开发 之 CustomValidator验证控件用法
  2. mysql唯一索引和联合索引的区别_mysql中,索引,主键,唯一索引,联合索引的区别...
  3. TCP 报文格式及TCP Flags
  4. TCP和UDP报文格式
  5. 一文教你看懂什么是电力监控系统
  6. MQ消息队列的使用(邮件的发送)
  7. excel 有多列,分开显示(操作简单,便于理解)
  8. qt在表格中如何画线_Qt如何使用表格?(三)
  9. 忠告∶你见过有医生无偿献血的吗
  10. 面试官:遇到过什么系统故障?怎么解决?看完后能轻松应对