记录美团腾讯阿里网易面经,文末有彩蛋

美团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

*******************

#面经#
全部评论
学姐带带
点赞 回复 分享
发布于 03-25 14:24 浙江
大神求内推
点赞 回复 分享
发布于 03-25 14:25 浙江
已经投递,麻烦内推一下
点赞 回复 分享
发布于 03-25 14:25 浙江
大佬捞捞我,俺也想进阿里
点赞 回复 分享
发布于 03-25 14:29 浙江
简历已发邮箱
点赞 回复 分享
发布于 03-25 14:34 浙江
友友真是个人新人,这个分析真的能帮助很多人。24届pdd春招完全放开了,海量的hc哦。友友有需要的话欢迎投递哦(私聊)。
点赞 回复 分享
发布于 03-25 14:35 上海
大佬求内推
点赞 回复 分享
发布于 04-08 12:30 四川

相关推荐

评论
7
20
分享
牛客网
牛客企业服务