字节跳动是全球第一家将人工智能应用到主产品的科技公司。全系产品矩阵包括今日头条、抖音、西瓜视频、火山小视频、TopBuzz、Faceu激萌、图虫、懂车帝等多款产品。截止2019年1月,字节跳动旗下全线产品日活超过6亿,月活超过10亿。字节跳动也在积极进行国际化部署,产品覆盖150多个国家和地区,75个语种,在40多个国家和地区排在应用商店总榜前列。
我们主要考察通用型的业务问题和过往的项目经历
价值观和软性技能也是我们选择人才的重要因素
Java程序执行的流程
Java源代码文件(.java)会被Java编译器编译为字节码文件(.class),由Java虚拟机中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。
在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。
根据JVM规范,JVM内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
名称 | 特征 | 作用 |
---|---|---|
程序计数器 | 占用内存小,线程私有,生命周期于线程相同 | 字节码行号指示器 |
虚拟机栈 | 线程私有,生命周期与线程相同,使用连续的内存空间 | Java方法执行的内存模型,存储局部变量表、操作栈、动态链接、方法出口等信息 |
堆 | 线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址 | 保存对象实例,所有对象实例(包括数组)都要在堆上分配 |
方法区 | 线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址 | 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译的代码 |
运行时常量池 | 方法区的一部分,具有动态性 | 存放字面量及符号引用 |
HTTP:超文本传输协议,定义了客户端与服务器端通信时,发送数据的格式
HTTP的特点
版本区别:
HTTP状态码:
当用户访问一个网页时,浏览器会向服务器发出请求。当浏览器接收并显示网页前,网页所在服务器会返回包含HTTP状态码的信息头,用以响应浏览器的请求。
分类 | 描述 |
---|---|
1** | 信息,服务器收到请求,需要继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
编号 | 名称 | 描述 | 协议 |
---|---|---|---|
4 | 应用层 | 提供应用程序之间的通信 | HTTP,FTP,SMTP |
3 | 传输层 | 建立主机之间端到端的连接 | TCP,UDP |
2 | 网络层 | 寻址和路由选择 | IP,ICMPARP |
1 | 网络接口层 | 提供介质访问、链路管理 | 各种物理通信接口 |
区别项 | TCP | UDP |
---|---|---|
协议 | 面向字节流传输协议 | 面向报文传输协议 |
可靠性 | 可靠 | 不可靠 |
连接性 | 面向连接 | 无连接 |
报文 | 面向字节流 | 面向报文 |
双工性 | 全双工 | 一对一、一对多、多对一、多对多 |
流量控制 | 滑动窗口 | 无 |
拥塞控制 | 满开始,拥塞避免;快重传,快恢复 | 无 |
数据库存储引擎是数据库底层软件组织,数据库管理系统使用数据引擎进行创建、更新、查询、删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等。
InnoDB存储引擎
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是默认的MySQL引擎。
InnoDB主要特性有:
InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合.
InnoDB是为处理大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的.
InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上
InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
InnoDB被用在众多需要高性能的大型数据库站点上.InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件
MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。
MyISAM主要特性有:
使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:
MEMORY存储引擎
MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。
MEMORY主要特性有:
给出一个链表,每 N 个独立做翻转
案例输入:a->b->c->d->e->f->g 3
案例输出:c->b->a->f->e->d->g
有一个广告板,可以同时展示2个不同的广告,现有4个广告素材,要求展示的频率是1:2:3:4,设计该展示算法
给定一组进程的起始结束时间,求同时在运行的最大进程数
start []int64
end []int64
1-10 5-15 16-20
有一个暗箱 里面有手感相同的黑白球,分别为M个白球 N个黑球。每次不放回的方式摸一个 摸到白球+1 摸到黑球-1。中途可以选择停止,问最大期望得分是多少
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,31,1,5 → 1,5,1
1,4,3,2
/**
* 线程轮流打印1,2,3,4和a,b,c,d
*/
public class MultiThreadTest {
public static void main(String[] args) {
Object o = new Object();
new Thread(new NumberRunnable(o)).start();
new Thread(new CharRunnable(o)).start();
}
}
class NumberRunnable implements Runnable {
private Object obj;//声明一个类的引用
//通过构造器将共享资源传进来
public NumberRunnable(Object obj) {
this.obj = obj;
}
public void run() {
synchronized (obj) {
for (int i = 0; i < 4; i++) {
System.out.println(i + 1);
obj.notifyAll();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class CharRunnable implements Runnable {
private Object obj;//声明一个类的引用
//通过构造器将共享资源传进来
public CharRunnable(Object obj) {
this.obj = obj;
}
public void run() {
synchronized (obj) {
for (int i = 0; i < 4; i++) {
char ch = (char) ('a' + i);
System.out.println(ch);
obj.notifyAll();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
与C/C++相比,Java不需要程序员直接控制垃圾回收,内存分配与回收都是JVM自动进行的,JVM不定时回收不在使用的对象的内存空间
随着程序的运行内存中存在的实例对象、变量等信息占据的内存越来越多,如果不及时进行垃圾回收,必然会带来程序性能的下降,甚至会因为可用的内存不足造成一些不必要的系统异常。
如果某个对象不在引用,那么它可以被回收
每个对象添加一个引用计数器,每被引用一次,计数器加一,失去引用,计数器减一。
当计数器在一段时间保持0时,该对象可以被回收。
缺点:当两个对象A,B相互引用时,当两个对象相互引用的时候,当其他所有的引用都消失后,A和B还有一个相互引用,计数器各为1,而实际上两个对象已没有额外的相互引用,却不会被回收
该算法从离散数学的图论中引入,程序把所有的引用关系看作一张图,从一个结点GC Root开始,寻找对应的引用结点,找到这个结点后,继续寻找这个结点的引用结点,当所有的引用结点寻找完毕后,剩余的结点被认为没有被引用的结点,即无用的结点。
引用的分类
强引用
被New出来的对象所加的引用,它的特点就是永远不会被GC,除非被设置为NULL
软引用
非必须的引用,内存溢出之前进行回收。如果JVM内存并不紧张,这类对象可以不被回收,如果内存紧张,则会被回收。此处有一个问题,既然被引用为软引用的对象可以回收,为什么不去回收呢?其实我们知道,Java中是存在缓存机制的,就拿字面量缓存来说,有些时候,缓存的对象就是当前可有可无的,只是留在内存中如果还有需要,则不需要重新分配内存即可使用,因此,这些对象即可被引用为软引用,方便使用,提高程序性能。
弱引用
第二次垃圾回收时回收。弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。
弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器。
虚引用
垃圾回收时回收,无法通过引用取到对象值。虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。虚引用主要用于检测对象是否已经从内存中删除。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WER7AsM1-1589884283199)(20181217150802215.png)]
HashMap底层基于数组+链表组成
当哈希冲突严重时,在桶上形成的链表会变得越来月长,查询的时候效率就会越来越低,Java1.7的实现原理
Java1.8重点优化了查询效率问题
String为什么设计成Final不可变?
自己能实现一个不可变的类吗?
equals 和 hashcode 为什么要一起重写?如果不重写hashcode会出现什么问题?
hashmap插入的时候,哈希冲突解决? 查找的时候,哈希冲突怎么解决?
hashset是怎么实现的? hashmap是怎么实现hashset的?
多线程:并发和并行,原子类,CAS操作
CopyOnWriteArrayList的相关特性?
ArrayList遍历的时候能删除元素吗? 删除的时候会报什么异常?
多态讲一下
线程间通信
自旋锁是什么,怎么实现的
volatile有什么用
堆和栈的区别
问我对多线程和JUC熟悉吗,我说了AQS、ReentrantLock、线程池、CountDownLatch、CyclicBarrier,然后问了我AQS是什么,介绍了AQS的一部分内容,和具体实现。
问我对jvm的垃圾回收了解吗,说了从新生代到老年代的整体的过程,用什么垃圾回收算法,举了几个垃圾回收器的例子,说来空间分配担保和可能产生full gc的原因,反正尽可能细的去说自己知道的,越细越好。
问了java线程池的具体参数,问了最长空闲等待时间的具体情况,释放线程的过程,什么时候什么情况释放,释放时队列的情况是怎么样的。然后给了一个具体的场景分配服务器和设置线程池参数。单次任务的cpu时间是100ms,要达到一秒钟1000次任务量,服务器是4核8g,问要多少服务器,每个服务器具体的线程池参数配置是多少。
自旋锁的原理,什么时候用自旋锁,什么时候用互斥锁
详细讲解项目中用到的线程池,线程数应该设置为多大
重载和重写的区别
ThreadLocal的内部实现。怎么确定一个线程使用的是哪一个threadlocal?
重写的实现
Integer和int的区别
说一下面向对象
垃圾回收机制
讲讲乐观锁和悲观锁
SQL语句怎么执行的知道吗,底层原理是什么?
你对数据库的事务是怎么理解的
四种隔离级别知道吗?
悲观锁和乐观锁呢?悲观和乐观锁的具体实现原理呢?
索引的种类知道吗?组合索引的最左匹配原则?
索引的底层原理呢?
MySQL索引的实现方式?为什么用B+树不用二叉树?
如何优化一条sql的查询语句
msyql有哪些索引
联合索引,最左匹配的原理
redis有哪些淘汰策略
mysql的索引有哪些,区别是什么,特点
数据库隔离级别,innodb和myisam的区别。
innodb的隔离级别,我自己说了如何实现的
redis数据结构
mysql的索引:B+树底层实现?B树的底层实现?为什么要用B+树而不用B树?
最左前缀匹配具体是怎么实现查找的?最左前缀匹配用了B+树的哪些特性?
(a,b,c)联合索引,为什么不能单用(b),而一定要用(a,b)?B+树是怎么实现的?
什么是幻读,不可重复读?这些概念是在事务内还是事务外? 事务内
mysql怎么实现可重复读?设置了可重复读隔离级别底层是怎么实现的? (MVCC)
了解MVCC吗?怎么实现的?什么是快照读?快照读能读取到最新的吗?快照读和当前读的区别?
synchronized和reentrentlock哪个效率高?
为啥B+树最后叶子节点需要用链表相连接? 便于区间查找
手写SQL,join
说一下数据库索引,然后说一下索引的优缺点
redis都有哪些数据类型(本来以为会展开问数据类型底层实现)
索引(讲的比一面更详细了一些)索引的使用条件 优化 最左原则
Redis的使用场景
基于Redis实现的分布式锁,问的比较细,比如线程阻塞导致,导致锁过期,其他线程获取了锁然后前一个线程又释放了第二个线程的锁这种,还问了一个线程等待Redis的分布式锁,整体等待时间的是怎么样的
说一下mysql的事务隔离级别,然后讲了四个隔离级别,以及对应产生的问题(脏读不可重复读幻读),以及InnoDB对应的2 3级别的实现,MVVC的实现,两个隔离级别产生Review的时间点和次数的区别,还有Next-Key Lock ,行锁加间隙锁。
问了mysql的引擎,索引,有哪些索引,然后问了主键索引和非主键索引的区别,讲了聚集索引,然后问了索引访问的过程,问了用聚集索引和不用的磁盘io访问次数的不同。
给了一个数据库表
Student
year | first_name | name
怎么建索引
数据库第一范式,第二范式,第三范式
数据库索引、事务
数据库查询10-20行内容
创建数据库查找135开头的电话
MYSQL的索引
MYSQL 为什么用B 树不用红黑树
比如1234的下一个比他大的数是1243,再下一个是1324,如何给出下一个数找到比他大的数
两个文件a和b,找出里面相同的url
手写快排
堆排,TOP K问题:小顶堆
手写代码:单向链表,对折成1 ->n->2->n-1->3……
海量IP,给定IP,输出IP出现的次数,分析时间复杂度和空间复杂度,答了字典树,哈希,位图
二叉树,技术层从左向右,偶数层从右向左进行输出
一个单链表,奇数位递增,偶数位递减,最终实现一个整体递增链表
将二叉树用数组存储
判断二叉树是否是镜像
输入“aaaaabbbbccc”,输出“a5b4c3”
实现一个缓存队列 ,二叉树的镜像
树的节点最大距离
二叉搜索树找到第k小的节点
有一个日志文件,里面每一行都有ip、time、context等信息,怎么查询某个ip有多少个
给定a=1,b=2,不给定其他变量,怎么交换它们俩的值
给定一个数组,有若干个数,找到a+b+c=99,找到所有abc的组合
基于比较的查找,最好的性能上logn,还有什么查找能突破这个限制
排序算法里面最好的性能上nlogn,能突破这个限制吗
根据前序遍历序列和中序遍历序列求出后续遍历序列
反转链表,topk问题说思路、时间复杂度
二叉树Z字打印
一个从1开始的有序数组,找字典序第k大的数,说思路(leetcode440 没做过 提示了一下树,想出来了)
手撕算法,LeetCode原题 23. Merge k Sorted Lists,有一点点不一样就是要求后面没满k个的也转置。
讲一讲一致性哈希
手撕算法,链表快排,用快排的思想实现对链表的数据结构的数据做快排。
在中文页面解析、中文数据处理中,常常遇到用中文表示的数字,例如:五千三百万零五百零一。
我们一般需要把它转化成int型整数,进行实际存储和使用。
请完成一亿(不含)以内的中文数字到int整数的转换。
int ParseInt(string input){
}
给了一个树结构,节点的定义里有parent字段,可以直接找到它的父节点。
现在要寻找整个树中序遍历时,某一个节点的下一个节点是哪个,怎么找。
面试官说你可以弄个纸画一画,我画了一会儿,然后说了一下思路,就过了。
有序数组找到第一个小于0的数和第一个大于0的数
矩阵左上角到右下角的最短路径和
合并两个排序数组并去重
最长无重复子串
两个排序数组找中位数
合并k个有序数组,写代码
一个整数分解为多个不同的数之和,有几种分法,写代码
求数组中第K大的值
树的路径和
写一个归并排序
讲一下LRU算法原理
在字符串中找出不重复字符的个数
找出两个只出现一次的数字,其余的数字都出现了两次
一个数组,除了某个数字只出现一次,其它都只出现两次,做法说了 HashMap 记录和异或操作,然后让我手写了异或的做法
给 N 个 32 位无符号整数,有重复,找出重复率最高的前 K 条
两条链表交叉求交叉点
算法题:生成全排列,非递归中序遍历二叉树
把汉字表示的数字转化成阿拉伯数字
树存数据库里有什么办法
最小编辑距离
查找二叉树最大深度
二叉树遍历
写代码判断IP地址
如何计算完全二叉树的总节点数
一个数组a,判断是否存在i
找到一个字符串中不重复子串的最大长度
一个二叉搜索树,找出小于m的最大数
最小生成树
a,b是两个矩阵,判断a在b中出现了几次?a的大小小于b
一维01数组中,求最长的区间,其中0和1数量相等
两个栈模拟双端队列
链表判环
手写单例
给定一颗二叉树,求其中root的最长路径。所谓路径是指,联通两个结点的最小边数
int 4字节整数的海量数据,如何给出一个数,判断是否在这堆数据里?
平衡二叉树查找复杂度
快速排序复杂度,实现,什么时候复杂度最大
红黑树和平衡二叉树
给n元钱,m个人,写个随机分钱的函数
两个栈实现一个队列
给个数组求连续子序列最大和
滑动窗口的最大值
找出一颗完全二叉树最后一个节点,时间复杂度要求 logN的平方
设计模式
SSM
分布式
系统设计
项目
特殊题:
作者:EternityY
链接:https://www.nowcoder.com/discuss/192224
算法题:把一个包含n个正整数的序列划分成m个连续的子序列。设第i个序列的各数之和为S(i),求所有S(i)的最大值最小是多少?
例子:
序列1 2 3 2 5 4划分为3个子序列的最优方案为 1 2 3 | 2 5 | 4,其中S(1),S(2),S(3)分别为6,7,4,那么最大值为7;
如果划分为 1 2 | 3 2 | 5 4,则最大值为9,不是最小
时间线很有参考价值:https://www.nowcoder.com/discuss/190665
mybatis实现原理、springmvc实现原理