前言

今年的面试比往年要难得多,各个互联网企业对于Java岗位的要求越来越多,也越来越高,主要是初级岗位已经趋近饱和,但高级岗位又相对来说缺乏,这类的人才偏少,因此作为Java开发人员,我们应该思考的是怎么去往高级人才发展,而不是转学其他语言,要懂得去成为金字塔顶端的人,而不是逃避一直做基层的人。

本文主要记录了我面试字节跳动的一个经历以及我在面试前个人的一个准备,当然能够拿到字节的offer,也得益于我拿到一本“Alibaba通关面试手册”,这本手册349页我整整读了28天,收获颇多。

这篇文章主体分为两个部分吧,前半部分主要来描述这份Alibaba面试通关手册里的内容,后半部分则记录了我这次整个面试的一个完整经历,包括面试题和面试心得。

这份Alibaba面试通关手册,共分为上下两个篇章,上篇主要是“面试经验技巧篇”,下篇则是“面试技术攻克篇”,下文我会一一对这两个部分进行阐述。

文章内的这份“Alibaba面试通关手册”以及我的学习笔记+电子书籍+面试真题资料均可以免费分享,需要的朋友请一键三连+评论,然后添加VX(tkzl6666)即可免费领取

 

一、(上篇)面试经验技巧篇

1.面试官箴言

本章节主要是收录了现在一线互联网大厂的面试官对于面试者的一些建议和箴言,包括阿里、字节跳动、腾讯、美团等公司均有话要说,这部分内容稍偏概念性一点,但确实对于面试者来说,看完之后受益是颇多的。

建议要点如下:

  • 有道无术,术可求;有术无道,止于术
  • 求精不求全
  • 脚踏实地,培养多种技能
  • 保持空怀心态
  • 职场是能者的舞台
  • 学会“纸上谈兵”

 

2.面试心得交流

该篇则主要是收录了一线互联网公司在职工程师的一个面试心得分享,“前车之鉴,后事之师”在这一篇章里体现得淋漓尽致。本篇章对当前程序员面试、笔试相关准备工作、时间计划、书籍阅读、面试技巧、offer选择等多个方面的内容进行了独到的分析,对于即将面试或正准备面试的朋友来说有者非常好的指引作用。

 

3.企业面试攻略

这部分内容,则是对现在互联网企业、网络设备供应商(电信运营商、银行等)、创业公司等IT企业的面试进行了一对一的强力分析,包括了它们之间的流程不同、面试内容不同、侧重点以及应需注意事项等等,均有详细的解析,能够非常直观了解到企业要求。

 

由于篇幅有限,下篇的面试技术攻克篇只能够展示出部分的面试题,详细完整版以及答案解析,有需要的可添加VX:tkzl6666 免费领取。

二、(下篇)面试技术攻克篇

1.Java基础知识

  • Java语言有哪些优点?
  • Java与C/C+++有什么异同?
  • 为什么需要public static void main(String[]args)这个方法?
  • 如何实现在main()方法执行前输出“Hello World”?
  • Java程序初始化的顺序是怎样的?
  • Java中的作用域有哪些?
  • 一个Java文件中是否可以定义多个类?
  • 什么是构造函数?
  • 为什么Java中有些接口没有任何方法?
  • Java中的clone方法有什么作用?
  • 什么是反射机制?
  • package有什么作用?
  • 如何实现类似于C语言中函数指针的功能?
  • 面向对象技术?
  • 面向对象与面向过程有什么区别?
  • 面向对象有哪些特征?
  • 面向对象的开发方式有什么优点?
  • 什么是继承?
  • 组合和继承有什么区别?
  • 多态的实现机制是什么?
  • 重载和覆盖有什么区别?
  • 抽象类(abstract class)与接( interface)有什么异同?
  • 内部类有哪些?
  • 如何获取父类的类名?
  • this与super有什么区别?
  • 变量命名有哪些规则?
  • break. continue以及return有什么区别?
  • final、 finally和finalize有什么区别?
  • assert有什么作用?
  • static关键字有哪些作用?
  • 使用switch时有哪些注意事项?
  • volatile有什么作用?
  • instanceof有什么作用?
  • strictfp有什么作用?
  • 基本类型与运算?
  • Java提供了哪些基本数据类型?
  • 什么是不可变类?
  • 值传递与引用传递有哪些区别?
  • ......
  • Collection和Collections有什么区别?
  • 什么是线程?它与进程有什么区别?为什么要使用多线程?
  • 同步和异步有什么区别?
  • 如何实现Java多线程?
  • run()方法与start()方法有什么区别?
  • 多线程同步的实现方法有哪些?
  • sleep()方法与wait()方法有什么区别?
  • 终止线程的方法有哪些?
  • synchronized与Lock有什么异同?
  • 什么是守护线程?
  • join ()方法的作用是什么?
  • 如何通过JDBC访问数据库?
  • JDBC处理事务采用什么方法?
  • Class.forName的作用是什么?
  • Statement、PreparedStatement和CallableStatement有什么区别?
  • getString ()方法与getObject ()方法有什么区别?
  • 使用JDBC时需要注意哪些问题?
  • 什么是JDO?
  • JDBC与Hibernate有什么区别?
  • ......

 

2.Java Web

  • Servlet与JSP?
  • 页面请求的工作流程是怎样的?
  • HTTP中GET与POST方法有什么区别?
  • 什么是Servlet?
  • doPost()方法与doGet()方法怎么选择?
  • 什么是Servlet的生命周期?
  • JSP有哪些优点?
  • JSP与Servlet有何异同?
  • 如何使用JSP与Servlet实现MVC模型?
  • Servlet中forward和redirect有什么区别?
  • JSP的内置对象有哪些?
  • request对象主要有哪些方法?JSP有哪些动作?
  • JSP中include指令和include动作有什么区别?
  • 会话跟踪技术有哪些?
  • Web开发中如何指定字符串的编码?
  • 什么是Ajax?
  • cookie和session有什么区别?
  • 什么是J2EE?
  • J2EE中常用的术语有哪些?
  • EJB有哪些不同的类别?
  • EJB与JavaBean有什么异同?
  • EJB有哪些生命周期??
  • EJB的角色有哪几种?
  • EJB的开发流程是怎样的?
  • .......
  • 数据库连接池的工作机制是怎样的?
  • J2EE开发有哪些调优的方法?
  • 什么是Struts框架?
  • Struts框架响应客户请求的工作流程是什么?
  • Struts框架的数据验证可分为几种类型?
  • Form Bean的表单验证流程是什么?
  • 在Struts配置文件中, <action>元素包含哪些属性和子元素?
  • ActionForm Bean的作用有哪些?
  • ActionForm的执行步骤有哪些?
  • forward与global-forward有什么区别?
  • Struts如何实现国际化?
  • Struts 1与Struts 2有哪些区别?
  • 什么是loC?
  • 什么是AOP?
  • 什么是Spring框架?
  • 什么是Hibernate?
  • 什么是Hibernate的二级缓存?
  • Hibernate中session的update ()和saveOrUpdate ( ). load()和get ()有什么区别?
  • Hibernate有哪些主键生成策略?
  • 如何实现分页机制?
  • 什么是SSH?

 

3.数据库原理

  • SQL语言的功能有哪些?
  • 内连接与外连接有什么区别?
  • 什么是事务?
  • 什么是存储过程?
  • 它与函数有什么区别与联系?
  • 各种范式有什么区别?
  • 什么是触发器?
  • 什么是游标?
  • 如果数据库日志满了,会出现什么情况?
  • union和union all有什么区别?
  • 什么是视图?
  • ......

 

4.设计模式

  • 什么是单例模式?
  • 什么是工厂模式?
  • 什么是适配器模式?
  • 什么是观察者模式?
  • ......

 

5.数据结构与算法

  • 如何实现单链表的增删操作?
  • 如何从链表中删除重复数据?
  • 如何找出单链表中的倒数第k个元素?
  • 如何实现链表的反转?
  • 如何从尾到头输出单链表?
  • 如何寻找单链表的中间结点?
  • 如何检测一个链表是否有环?
  • 如何在不知道头指针的情况下删除指定结点?
  • 如何判断两个链表是否相交?
  • 栈与队列有哪些区别?
  • 如何实现栈?
  • 如何用O(1)的时间复杂度求栈中最小元素?
  • 如何实现队列?
  • 如何用两个栈模拟队列操作?
  • 如何进行选择排序?
  • 如何进行插入排序?如何进行冒泡排序?
  • 如何进行归并排序?
  • 如何进行快速排序?
  • 如何进行希尔排序?
  • 如何进行堆排序?
  • 各种排序算法有什么优劣?
  • ......
  • 如何求指定数字在数组中第一次出现的位置?
  • 如何对数组的两个子有序段进行合并?
  • 如何计算两个有序整型数组的交集?
  • 如何判断—个数组中数值是否连续相邻?
  • 如何求解数组中反序对的个数?
  • 如何求解最小三元组距离8.6字符串?
  • 如何实现字符串的反转?
  • 如何判断两个字符串是否由相同的字符组成?
  • 如何删除字符串中重复的字符?
  • 如何统计一行字符中有多少个单词?
  • 如何按要求打印数组的排列情况?
  • 如何输出字符串的所有组合?
  • 二叉树的基本概念
  • 如何实现二叉排序树?
  • 如何层序遍历二叉树?
  • 已知先序遍历和中序遍历,如何求后序遍历?
  • 如何求二叉树中结点的最大距离?
  • 如何消除嵌套的括号?
  • 如何不使用比较运算就可以求出两个数的最大值与最小值?
  • ......

 

6.海量数据处理

  • 问题分析
  • 基本方法
  • 经典实例分析
  • top K问题
  • 重复问题
  • 排序问题

 

三、字节跳动面试题还原(技术题)

这次字节跳动的整个过程我就不去还原了,只将面试题分享出来吧,面试题以技术面为主,Hr面基本上大同小异我就省略掉了,可以参考一下今年字节跳动会问一些什么样的问题,热乎乎的新鲜面试题,希望能够给你带来一些帮助吧。

  • Session存在哪里?怎么把session_id返回个客户端?
  • Redis的数据结构,它有哪些复杂数据结构?
  • Http与Https的区别,详细描述加密非对称加密的过程?
  • 线程与进程的区别?
  • IO多路复用
  • redis服务端是多进程还是单进程,多线程还是单线程?
  • top loadaverage怎么计算的?
  • hashmap解决冲突的方式?
  • 数据库的事务,什么是幻读?事务是怎么实现的?
  • linux的命令,如何查看服务器负载?
  • 如何查看端口占用情况?
  • 如何查看远程服务器某一个端口被占用?
  • 可以ping通,当时客户端连接不上服务端,什么原因?
  • 操作系统包括哪些部分?
  • 如何进行内存分配?
  • 进程切换发生哪些事情?
  • fork函数
  • 项目:分布式如何扩容缩容?
  • 讲讲B树和B+树区别
  • 三次握手,四次挥手
  • 为什么要time-wait?
  • java多线程同步
  • 项目:如何避免超卖?
  • redis主从同步
  • 操作系统内存为何要分页?
  • B+树叶子满了,要添加新枝怎么办?
  • 5G数据,1G内存如何实现排序?
  • 操作系统加锁的原理
  • volatile关键字
  • 单例
  • Spring AOP
  • 注解的原理
  • OOM的情况
  • Jvm内存模型
  • 算法部分:(1)一个长度为n的数组,元素在1到n之间,找到一个重复的元素,空间复杂度越低越好;(2) 最长不重复子串;(3)找比当前数大的下一个数,如1243,结果是1324;(4)给定一个升序数组,一个target值,找比target小的最大数字(类似于升序插入排序的一个步骤);(5)链表循环;(6)O时间取出栈最小元素;(7)升序数组找绝对值最小的那个值

字节跳动面试题答案

四、面试心得

字节跳动的面试相对其他大厂而言,整体的氛围还是比较轻松的,可能面试官都比较年轻的缘故吧,实际上它给外界的印象也一贯如此,年轻活力。所以,在前期做好了相关的准备,面试官基本上是不会太为难你。

面试字节跳动,有几个需要提前准备的点:

①复习基础和原理,看一些技术笔记。面试的时候,这部分是一定会问的,但是大部分的就是忽略了基础部分,影响了面试结果,所以在面试字节跳动之前,我在这部分也算是下足了功夫,把基础与原理巩固了,也拜读了一些技术大牛的博客及手写的笔记内容。

 

②算法。现在很多互联网公司都喜欢在面试时问算法相关的,字节跳动喜欢问算法相信大家也都有耳闻,从我上述的面试题也能够看出,基本上算法问的比重还是较多的。至于很多小伙伴问算法怎么准备,其实很容易的,最快捷有效的办法就是刷题,我这边也准备了三套“算法宝典”奉上:

三套“算法宝典”

算法刷题LeetCode中文版(为例)

总结

人与人存在很大的不同,我们都拥有各自的目标,在一线城市漂泊的我偶尔也会羡慕在老家踏踏实实开开心心养老的人,但是我深刻知道自己想要的是一年比一年有进步。

最后,我想说的是,无论你现在什么年龄,位于什么城市,拥有什么背景或学历,跟你比较的人永远都是你自己,所以明年的你看看与今年的你是否有差距,不想做咸鱼的人,只能用尽全力去跳跃。祝愿,明年的你会更好!