前言
写在最前面:目前接了字节的offer,校招想来字节的可以私信我
以下面经均是以时间线排列,最好每次面试完都自我总结一下
有些问题比较少的或者没列出来的基本都是在聊项目
腾讯一面(未知部门)
- mysql varchar和char
- char是固定长,初始长度是多少,赋值之后就是多长
- varchar是可变长,赋值长度与初始长度无关
- mysql建表规则
- hashmap和treemap
- hashmap不会排序,treemap会根据comparator进行排序
- ArrayList和linkedlist
- linkedlist是双向链表非循环
- java基本类型
- byte 1
- short 2
- int 4
- long 8
- float 4
- double 8
- char 2
- boolean 1
- jvm
- jvm是java虚拟机,用来运行java编译后的字节码文件(.class),做到一次编译多次运行(跨平台)
- collection的方法
- add remove contains iterator size isEmpty
- static方法访问非static变量
- 类的静态成员(变量和方法)都属于类本身,在类加载的时候就会分配内存,可以通过类名直接访问
- java多继承
1、若子类继承的父类中拥有相同的成员变量,子类在引用该变量时将无法判别使用哪个父类的成员变量
2、若一个子类继承的多个父类拥有相同方法,同时子类并未覆盖该方法(若覆盖,则直接使用子类中该方法),那么调用该* 方法时将无法确定调用哪个父类的方法。 - 乐观锁 悲观锁
- 悲观:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。
乐观:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现 - StringBuilder StringBuffer
- 单例
- 懒汉和饿汉
腾讯一面(IEG)
- 算法:删除倒数第k节点
- tcp/udp的区别 视频/语音为什么使用udp
- 4次挥手时的timewait
- tcp中的流量控制和拥塞控制
- 进程和线程
- 进程的调度
- 进程的通信方式
- 大端和小端系统
- 队列能否不使用锁进行并发
- 队列要用多少个堆实现
- 静态链接和动态链接
- C++的多态(Java)
- 僵尸进程
字节一面
- 算法:链表反转(m到n)
- mysql索引 最左索引
- visitor模式
- 进程和线程
- 进程通信
- 线程同步
- java锁
- synchronize方法和代码块
- synchronize怎么做到可重入
- CAS 以及哪些领域同样用到cas
- tcp4次挥手 为什么
阿里二面(几乎都是开放性问题)
-
进程切换
-
进程切换分两步:
-
切换页目录以使用新的地址空间
-
切换内核栈和硬件上下文
-
对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。
-
(中断/异常等触发)正向模式切换并压入PSW/PC 。 (Program Status Word 程序状态字。program counter 程序计数器。指向下一条要执行的指令)
-
保存被中断进程的现场信息。
-
处理具体中断、异常。
-
把被中断进程的系统堆栈指针SP值保存到PCB。(Stack Pointer 栈指针。Process Control Block 进程控制块。)
-
调整被中断进程的PCB信息,如进程状态)。
-
把被中断进程的PCB加入相关队列。
-
选择下一个占用CPU运行的进程。
-
修改被选中进程的PCB信息,如进程状态。
-
设置被选中进程的地址空间,恢复存储管理信息。
-
恢复被选中进程的SP值到处理器寄存器SP。
-
恢复被选中进程的现场信息进入处理器。
-
(中断返回指令触发)逆向模式转换并弹出PSW/PC。
-
页表
-
tcp如何保证可靠
-
tcp如何保证正确性 校验和原理?
-
把伪首部添加到UDP上;
-
计算初始时是需要将检验和字段添零的;
-
把所有位划分为16位(2字节)的字
-
把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C
-
将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和checksum。
-
10亿订单,每个区间取topk
-
10亿订单存在哪里可以取出来
-
java能否多进程(多进程编程)
-
使用Process和Runtime进行多进程编程
-
java内存管理
-
回收机制
-
堆的内存泄漏
-
输入http之后的流程
-
java多线程(自己的看法)
-
线程池设置多少合理
-
如何让udp可靠
字节二面(几乎都是为什么)
-
http输入之后的过程
-
dns的解析过程
-
ip传输的过程
-
整个请求传输的过程
-
什么时候用tcp udp,什么场景下,为什么
-
html响应解析渲染的过程
-
html head里有什么元素
-
什么时候要多线程,什么时候要多进程
-
如登陆,如何保证安全性
-
后端如何保证
-
加密算法
-
算法:k个一组地翻转链表
美团一面
-
HashMap的实现原理,插入如果冲突,是插入头部还是尾部
-
是否线程安全,哪些是线程安全的
-
ConcurrentHashMap如何做到线程安全
-
ConcurrentHashMap的size()如何实现
-
LinkedHashMap的区别
-
多线程都用什么来开发
-
ThreadPoolExcutor的参数,队列使用的是哪种,是否设置初始值,无界队列是否可以
-
ThreadPoolExcutor如何操作,原理
-
Excutors.newFixed()的缺点
-
其他的线程池方法
-
线程如何做到交替运行
-
多线程如何做到顺序执行
-
线程如何做到等待其他线程完成后执行
-
synchronized和lock的区别
-
mysql的隔离级别
-
mysql的默认隔离级别
-
幻读是什么
-
mysql的可重复读是否可以防止幻读
-
b树和b+树的区别
-
b+树用作索引的数据结构优势在哪
-
平衡二叉树与红黑树的区别
-
算法:用stack实现queue
美团二面
-
网络协议有哪些
-
ThreadLocal的作用,是否线程安全
-
进程间的通信,java进程间的通信
-
Socket 这个方式可以实现,需要在父子进程间进行socket通信
-
队列机制 这种方式也可以实现,需要父/子进程往队列里面写数据,子/父进程进行读取。不太好的地方是需要在父子进程之间加一层队列实现,队列实现有ActiveMQ,FQueue等
-
通过JNI方式,父/子进程通过JNI对共享进程读写
-
基于信号方式,但该方式只能在执行kill -12或者在cmd下执行ctrl+c 才会触发信息发生。
-
TreeMap讲解,里面有什么属性,entry里有什么属性
-
java里有哪些是不需要加锁的同步方法
-
行锁和表锁的区别、场景
-
组合索引的使用,eg. (a, b, c)索引,where a=x; where b=x; where a=x and b=x;哪个能使用索引
-
ArrayList和linkedlist的区别
-
有哪些集合类是线程安全的
-
blockingqueue什么场景下使用
-
java有哪些锁
-
算法:排好序的数组,找2个数的和为M的所有组合
-
算法:大数据下,找出出现频率topK的ip
-
在Hadoop/Spark下如何实现
-
看过哪些书
字节三面
-
最近的项目(我应该说最熟悉的那个。。)
-
写懒加载单例 为什么里外层null判断 为什么加volatile 如何做到复用(泛型)
-
算法:(login, logout),算出在线人数峰值
-
算法:一组边,做成树结构(左点为父,右点为子)
-
mysql:每个班级中某科目前10,如何建立索引优化
-
吃鸡用tcp还是udp?
-
客户端发起10次服务调用,udp和tcp场景下,服务端调用的次数?
-
多态的描述
-
抽象和接口
-
浅克隆和深克隆
-
线程和进程的区别
-
进程的同步
-
死锁的条件,如何解决死锁
-
进程句柄在内存中的结构
-
http中keep-alive的作用
-
301 302 404 502的意义
-
CAS的原理,缺点,如何解决ABA问题
-
静态内部类和非静态内部类
总结
最后我为大家准备了java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书一起免费分享给大家!
有需要的朋友点击这里备注csdn自行下载就好了