记录美团腾讯阿里网易面经,文末有彩蛋
美团1面
1.说一下自己的项目
2.说一下自己印象最深的项目
3.一般用什么语言:java吧,项目需要也用了python
4.两种语言的区别:
python是脚本语言,解释型语言,交互性很好,开发效率高,代码巨简洁,很适合做算法。类库丰富,numpy的库特别好用,做起运算来十分方便。(类库多开发起来感觉天天在查字典......各种库各种调...其实也记不住)
java是强类型的语言,采用严格的面向对象编程,健壮性强,因为有很多大型的开发框架,很适合做企业级应用,做服务端的开发。并且比起c++它有自己的一套gc机制。
5.说一说java的面向对象、jvm内存模型和gc。
java的面向对象可以用抽象、继承、多态、封装四方面来说。
抽象是指将事物的共同因素抽象出来,构成事物的本质,比如抽象出公告属性和方法形成类。
继承是指子类可以继承父类的所有非私有的成员和方法,子类也可以拥有自己新的特性。
多态就是指事物的多种形态,比如一个接口的多种实现。多态的条件就是父类引用指向子类对象,继承和重写。
封装的思想是,将类的一些属性,方法怎么实现的封闭起来,仅提供调用的接口,调用的人不必关心如何实现的。
jvm内存模型(运行时数据区)分为线程共享的和线程私有的数据区。
程序计数器、java虚拟机栈、本地方法栈是线程私有的,java堆和方法区是线程共享的。
程序计数器存储当前线程执行字节码的行号,记录正在执行的字节码指令地址,没有oom错误。
java虚拟机栈描述的是java方法执行时的内存模型,方法执行时创建一个栈帧,存储局部变量、操作数栈、动态链接、方法出口等信息,局部变量存储着各种基本类型、对象引用、返回地址。
本地方法栈与java虚拟机栈类似,只是对应的是native方法。
java堆的唯一目的就是存放对象实例,当对象无法在堆上完成实例分配时,会oom。
方法区主要存储被虚拟机加载的类信息(class文件)、常量、静态变量等数据,运行时常量池是它的一部分,用于存放编译期生成的字面量和符号引用。
java的垃圾回收算法有主要有标记清除算法、复制算法、标记整理算法和分代收集算法。
标记清除算法:先标记出需要回收的对象,然后回收所有被标记的对象。不足是:效率不高,且会产生大量的内存碎片。
复制算法:将可用内存进行划分,每次只使用其中的一块,当该块内存不足时,将存活对象都复制到另一块,然后对正在使用的这一块进行整体的内存回收。它没有内存碎片的问题,但是一次只能用一半或一部分内存,很浪费;并且如果对象存活率很高,会造成大量的复制,效率会很低。
标记整理算法:先标记出需要回收的对象,然后对空间进行整理:将存活对象往一端移动,然后清理掉端边界外的内存。它很适合存活率比较高的老年代。
分代回收算法:将java堆分为新生代和老年代,根据年代特点对不同的年代采用不同的gc算法,比如新生代一般进行8:1:1的内存划分来采用复制算法回收,而老年代多采用标记整理算法。
6.说一下了解的集合,arraylist满了会发生什么?
java集合主要分为List和Set。
List是线性表,保存元素插入的顺序,并且允许重复元素,它的实现类主要有arraylist,vector和linkedlist。arraylist和vector底层都是数组实现,适合随机访问,区别是vector是线程安全的;linkedlist底层是链表实现的,适合进行插入和删除操作。
Set就类似一个桶,元素进去是不保存插入顺序的,且不允许重复元素,它的实现类主要有hashset,treeset,LinkedHashSet。其中hashset根据元素的hashcode值及equals方法去重,treeset继承了SortedSet接口,能实现元素自动排序,linkedhashset在hashset的基础上还使用链表维护元素的插入次序。
arraylist满了会自动扩容,新建一个原来容量1.5倍大小的数组,然后将原来的复制过去。
7.hashmap和hashtable的区别
hashmap是非线程安全的,hashtable是线程安全的,它的大部分方法都是sychronized的。
hashmap允许键值为空,而hashtable不允许键值为空的。
8.hashmap在jdk1.7和1.8的区别
jdk1.7中采用的是数组+链表的结构,哈希冲突时将它们以链表形式存放在相同位置,而jdk1.8中采用数组+链表+红黑树的结构,当链表长度达到8的时候,会将改位置的键值对转换为用红黑树的结构存放。
还有jdk1.7中,hashmap扩容是采用rehash和头插法进行的,而jdk1.8中,是采用根据hashcode值在新增位上是1还是0来决定索引位置是加上原来的容量值还是不变,并且不会倒置节点。
所以jdk1.8在结构上改变,提高了hashmap的操作效率;在扩容机制上改变,解决了多线程可能导致的死循环问题,并且能很好的均匀冲突节点。
9.hashmap里面的红黑树会不会变成链表
会,删除的时候也会判断一个阈值,有一个untreeify方法。
10.看没看过这些源码
看过一点,但可能不是特别仔细。
11.多线程用过吗,有什么锁聊一聊?用过sychronized吗,聊一聊?
可重入锁、可中断锁、公平锁这些吧。
sychronized、reentrantlock都能实现锁。
sychronzed是一个关键字,jvm层面的,然后它是非公平的,不可中断等待的。
reentrantlock是一个类,可以使用trylock方法,设置等待可中断,还可以通过构造方法实现公平锁。但是它必须手动释放锁。
他们都是可重入的,可重入的实现应该都是用一个进入数计数器来实现的。
jdk1.6之后,sychronized的锁有一个锁升级的过程。一开始同步对象时没有锁定的,也就是无锁的状态,然后进入同步块,判断对象是不是第一次被线程获取,如果是,就设为偏向锁(表现在将对象头中锁标志设为01,采用cas操作将线程id记录在对象头中,成功后,该线程还能反复重偏向,就是进入该块不用同步),但如果存在竞争情况,有其他线程尝试获取该锁,那么就要结束偏向锁,进而升级成轻量级锁。升级轻量级锁要先在当前线程的栈帧中开辟一个叫锁记录的空间,然后将对象的markword拷贝到锁记录中,并使用CAS将对象头的Mark Word替换为锁记录指针,成功则转换为轻量级锁,如果失败,代表有两个以上的线程竞争锁,那么就要膨胀成重量级锁,其他线程阻塞。
sychronizde的底层实现主要是一个monitor对象,对应两个monitorenter和moniterexit两个指令。monitorenter指令插入到同步块的开始,然后线程会尝试获取对象的monitor的所有权,如果monitor的进入数为0,那么可以获取锁,可重入就是对于同一个线程再次进入这个同步块,这个进入数就直接+1。monitorexit指令插入到代码块的结束位置,执行到这里将monitor进入数-1。
12.线程池用过吗?
需要频繁的创建和结束线程时,为了节省开销,可以使用线程池,就是创建一些线程放在线程池中,需要用的时候就拿一个出来,用完放回去。java中是用Executors类来实现线程池的,通过Executors可以生成各种类型的线程池实例,如newCachedThreadPool、newFixedThreadPool、newSingleThreadPool分别指创建不限制线程数、固定线程数和单线程数的线程池。
一般向线程池提交任务采用的是excutor方法,在这个方法中要判断worker数量是否小于线程池大小,如果小于就新建一个worker,把任务分给它并返回,如果已经达到上限,那么要把新来的任务放入一个任务队列阻塞,如果任务队列也满了,就需要调用拒绝策略来拒绝任务。
13.用过spring哪些模块?
用过核心模块,还有aop模块和spring mvc模块。
核心模块主要是用Ioc容器来管理类的依赖关系,如引用、注入这些bean的关系,可以将代码中这些繁琐的关系转移到配置文件中,既降低耦合,也方便管理。
aop模块主要可以消除许多重复的方法调用,有一类功能,比如日志记录啊、安全检查等会分散在项目的很多地方,那么核心业务的代码很容易被这些重复化非业务性的代码包围,aop的思想就是把这些重复的公共的方法抽出来,在另一个地方定义它们,通过声明切点来定义这个功能要以何种方式在何处应用。在我的项目中权限的验证就是用这种方式做的,声明一个切面类(@Aspect),将一些只有管理员能操作的方法作为切点(@Pointcut),用@Before注解来设置在这些方法执行之前需要进行的权限验证操作。
spring mvc模块,emmm,就是基于mvc设计模式的spring的一个mvc框架。
spring MVC处理请求的过程是首先通过一个前端控制器DipatcherServlet,向处理器映射查询该请求对应的controller,然后将请求发送给对应的controller,controller会处理该请求,将产生的数据model+对应的视图名返回给dispatcherServlet,然后dispatcherServlet会去向对应的视图解析器匹配一个特定的视图view,然后进行视图的实现,将model展示在视图上,响应用户请求。
我们使用该模块时,除了一些配置,业务逻辑上主要就是编写控制器,获取对应的数据进行处理,并映射对应的视图。
14.数据库用的什么,为什么用它?
mysql,简单经济实惠....
15.mysql存储引擎?区别?
存储引擎,理解为数据具体的存储、索引技巧和锁定水平的一种方案。
MyISAM不支持事务、不支持外键、默认的加锁机制是表级锁;
MyISAM是非聚集索引,索引保存的是数据文件的指针;MyISAM支持全文索引;
MyISAM适合以SELECT、INSERT为主的,对事务完整性和并发性要求不高的应用。
InnoDB是一个健壮的事务型存储引擎,它支持事务、支持外键、默认的加锁机制是行级锁;
InnoDB支持的是聚集索引,数据和索引是在一个节点中的;以前不支持全文索引;
InnoDB适合处理需要事务支持和处理多重并发、对健壮性有要求的应用。
16.怎么修改mysql默认的存储引擎?
(1)在配置文件my.cnf中的 [mysqld] 下面加入default-storage-engine=INNODB
(2)重启mysql服务器:service mysqld restart
17.myisam特性?
MyISAM不支持事务、不支持外键、默认的加锁机制是表级锁;
MyISAM是非聚集索引,索引保存的是数据文件的指针;MyISAM支持全文索引;
MyISAM适合以SELECT、INSERT为主的,对事务完整性和并发性要求不高的应用。
18.平时怎么学习的?有维护github或者博客吗?
看书,看博客。有用github,也有买域名然后用githubpage做的博客,但是维护不多,未来有时间还是想好好弄一下,多写一些技术博客或笔记。
腾讯现场面
1.自我介绍
2.做过有意思的项目
3.mysql索引数据结构
mysql支持的一些不同的存储引擎支持的索引结构也各不相同,如b树索引,哈希所以,全文索引等。索引是帮助高效查询数据的数据结构。
myisam和innodb存储引擎用的都是b树/b+树的数据结构。
b树又称为平衡多路查找树,b树的性质使得它能在尽可能矮的树中存储尽可能多的节点。一个m阶的b树规定除根节点的每个节点至少拥有m/2棵子树,至多拥有m棵子树,根节点至少拥有2棵子树;并且有k棵子树的节点具有k-1个关键码,关键码按递增排序;且关键字数量必须在ceil(m/2)-1 <= n <= m-1的范围内。由于索引一般被保存在磁盘中,在进行索引查找时就必然会产生磁盘i/o的消耗,而磁盘每次读取都会预读一页的数据,数据库索引设计者利用这种原理,将b树一个节点的大小设为一个页面大小,这样一次磁盘i/o可以载入一整个节点;除此以外,b树的查询时间和高度直接相关,并且一次检索最多是h-1次的io,说明b树作为索引结构,效率很高,并且十分平衡。
但是b+树比起b树有一些新的性质:最重要的是除了叶子节点以外的节点不存储数据本身,只存储关键码,叶子节点不存储指针,只存储关键码和数据。并且数据库中用b+树做索引时,还会对叶子节点增加顺序指针,将所有的数据顺序连接。b+树由于非叶节点不存数据,每个节点的磁盘占用空间比较小,所以每页能容纳的节点更多,也是为了进一步降低i/o消耗;并且由于所有的数据都在叶子节点上,那么所有的查询都会查到叶子节点,查询时间是非常稳定的;再就是叶子节点所形成的有序链表,对范围查询十分有利。
myisam的非聚集索引在这里指的是叶子节点不包含数据本身,而包含的是指向数据的指针,也可以认为是数据的索引逻辑顺序和物理存储顺序不同;而innodb所用的聚集索引在这里指叶子节点包含数据本身,数据的索引逻辑顺序和物理存储顺序相同。
4.输入url到页面显示的全部过程
(1)DNS 域名解析:将url解析为ip地址。
(2)请求TCP连接:浏览器根据解析到的ip地址,向对应服务器发起TCP连接,进行三次握手。
(3)发送HTTP请求:连接成功后,浏览器向服务器发送http请求
(4)返回HTTP响应
(5)页面渲染
5.使用过的linux命令
linux命令不算很熟,常用的可能就是一些操作目录和文件的,vim编辑,查找文件内容比较简单的命令。边敲边查是常事.......
比如ls,mkdir,rm,touch,vim,mv,cp,cat,tail,awk,top这样的。
6.top命令和awk命令
7.了解哪些加密算法
非对称加密?MD5、RSA、DES?
8.字节序概念
面向多字节类型定义,网络字节序一般是指大端传输。
字节序:指的是多字节数据的存储顺序。根据字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前,分为大端序和小端序。
大端序:高位字节放在低位地址
小端序:低位字节放在低位地址
9.30万表记录占用的磁盘空间
10.视频通话用tcp还是udp?为啥用udp?
用udp,虽然tcp是可靠传输,但是tcp为了可靠所做了很多控制,比如重发控制。视频通话的时候数据如果丢失部分影响并不会很大的,但是如果数据丢失而重发会导致无法正常的交流,大规模的延迟到达会使得整个通话很恐怖吧。
11.视频一般的格式内部编码是什么样的?
不太了解这个
12.如果重新做那个系统,怎么优化?
13.https?
通过在http和tcp中间加了一个ssl协议(在传输层和网络层中间加了个安全层),能解决http所可能发生的报文窃听、身份伪装和报文篡改等不安全的情况,主要是通过报文加密或通信加密、数字证书和数字签名来解决的。
14.除了java还用过什么语言?
用过python,做过一个相关项目,了解不算深入。python的库特别强大,特别适合做算法、数学运算之类的,并且脚本语言用起来交互性很强,感受很好。
15.有什么兴趣爱好
看书、看电影、练琴。
阿里一面
1.自我介绍
2.项目相关
3.进程和线程的区别
进程是程序基于某些数据的一次运行,线程是进程中的一个执行路径;
进程是资源分配和调度的基本单元,线程是cpu调度的基本单元;
进程拥有自己的独立地址空间,独立的内存单元,一个进程的多个线程共享进程的数据、资源和地址空间;线程独有自己的栈、程序计数器等。
进程是一段可以独立执行的程序,线程必须依附于应用程序,不能独立执行。
打个比方,打开qq应用或迅雷可以看做开启进程,在qq中开启多个窗口聊天、视频看做开启多线程。
4.线程的状态
创建、就绪、运行、阻塞、死亡
java线程:
创建、就绪、运行、阻塞、等待、锁池、死亡
5.线程间通信
http://www.importnew.com/26850.html
共享变量,共享内存。
6.数据库事务
7.悲观锁乐观锁
8.100w个数的排序输出
9.如何启动一个线程
网易面试
一面:30min
1.自我介绍
2 .多线程排序,使用什么方法
3.实现线程安全方法,threadlocal实现原理
4.强弱软虚引用区别
5.手写分页语句
6.大数据分页存在问题,如何解决
7.hashmap底层原理,重点 put / get
8.讲一下dubbo
二面:25min
1.手写mysql乐观锁,悲观锁语句,并解释原理
2.解释下为什么建立索引能提高查询分页语句效率,建立索引查速度有区别吗?
3.复合索引的使用情景
4.反射获得FIELD
5.反射能获取父类的字段吗?
6.反射构造对象出现异常原因
7.解释下nio
8.Spring AOP失效原因
三面:hr 15~20min
自我介绍,家庭状况,有木有女朋友,实习经历,什么时候能开始实习,为什么选择网易
美团另一个
一面:
1.项目描述:选择一个最擅长的项目进行描述。
重点:并发,查询优化
java并发的几种方式,重点介绍sychronized的源码实现(底层实现)
什么叫java并发的几种方式......
mysql索引优化:什么索引,怎么样使用索引,索引的底层数据结构(B+树)的实现方式。
2.操作系统:
进程与线程的区别?越多越好
进程之间的通信方式。
3.计算机网络
点击一个url发生了什么?具体描述整个细节。
TCP连接是什么样的一个过程?
三次握手的意义在哪?不这样做会怎么样
4.JVM
你知道JVM有哪些东西?
重点描述垃圾回收机制的细节原理。
5.数据库
数据库引擎你知道哪些?
MyISAM与Innodb的区别在哪?越多越好
数据库索引的字段应该符合哪些特征。
6.jdk源码
有没有了解过jdk源码
说一说courrentHashMap与HashMap的区别
HashMap为什么put()函数和get()函数会降低系统运行效率
仔细描述下这两个函数的具体实现
7.分布式数据库你了解多少,说说如何让你的系统实现多服务器分布式部署。
8.设计模式知道哪些,具体描述对应的场景。
9.算法测试
数字翻转:12345--54321
-12345---54321
mysql查询
10.有没有什么问题问我?
二面
1.跟一面一样介绍项目
2.Http请求的整个过程详细描述
具体描述四次挥手的过程
为什么需要四次挥手
3.get请求与post请求的区别?越多越好
4.DNS解析的具体过程
5.synchronized的实现细节。
6.springIOC是什么,具体底层实现是什么样子的。
7.线程池是什么,说说你如何设计一个线程池,应该注意哪些参数,知道java中有哪些现有的线程池类。
8.线程的实现方法,三种,具体描述Callable接口与futureTask的实现方式,get方法如何获得参数
9.mybatis框架的实现过程。
10.算法测试
数组子序列长度
数组中连续几个数之和是5的倍数,请问最小几个数?
11.有没有什么问题问我?
一面:
1.自我介绍
2.ArrayList,LinkedList区别,适用场景。
3.HashMap为什么重新计算hash值
4.谈谈乐观锁
5.说说CountDownLatch
6.谈一下Spring IoC,IoC怎么创建的单例对象
7.Spring AOP
8.说一下Mybatis的事务...MySQL的事务
9.怎么进行索引调优的
10.MySQL索引的数据结构,使用B 树的原因
11.创建线程在内存模型中分配的位置
12.讲一下Full GC
13.垃圾回收算法
14.Cookie、Session
15.URL的请求流程
二面:
1.自我介绍
2.熟悉内存模型,说一下内存划分
3.堆怎么划分
4.新生代怎么划分
5.创建对象怎么保证线程安全
6.创建对象怎么分配内存
7.说说STW
8.Minor GC会STW吗
9.CMS垃圾回收器、G1垃圾回收器
10.虚拟机在加载类静态变量的时候是线程安全的吗,为什么、怎么实现的
11.HashMap和HashTable的区别
12.HashMap初始数组长度为16(为2的倍数)的原因
13.sleep和wait方法的区别
14.Java线程池
15.IoC的实现原理
16.IoC生成实例用的技术
17.AOP的实现原理
18.Mybatis的一二级缓存
19.git操作指令
20.MyISAM和InnoDB的区别
21.InnoDB的索引
22.redo log和undo log,redo log怎么保证持久性和原子性
!如果你愿意简历给我,我会全程跟进辅导,靠谱的内推人是上岸重要元素之一!
在线等有缘同学,本人阿里四年半JAVA开发,位于阿里总部,淘天核心部门:营销&交易技术-营销基础平台,阿里搞电商,电商搞营销,营销技术就是我们团队!
xiyou.yyj@taobao.com
*******************
#面经#