迟到一年的秋招面经【仅供参考】
不啰嗦,以下题目全部为本人在2016年8-10月间参加互联网公司秋招面试题目,以本人参加面试的时间顺序排列。希望能给即将参加17年9月秋招的同学一些帮助。
华为
岗位: IT 应用软件开发
去哪儿网
岗位: Java 研发工程师
一面
1. 面向对象的特性。
(1.特性及概念;2.优点)
多态:指的是不同类对象对同一消息作出相应。即引用变量指向的具体类型在程序运行期间才确定。
多态三个条件:继承重写向上转型。
多态优点:可扩充性。
2. 聚合与组合的区别。
3.JVM 的结构, GC 算法;在 HashMap 对象中不断调用 put 方法,在 JVM 中会发生什么。
4. 简介 JVM 的可达性分析过程。
通过一系列的GC Roots作为起始点,从这些节点开始向下搜索,搜索所走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连,即从GC Root到这个对象不可达,则证明此对象可以被回收。
哪些对象可以作为GC Roots?
(1.JVM stack;2/3.方法区;4.本地方法栈)
5. 简介 String 类和 Integer 类。
Integer是int的封装类;Integer.MAX_VALUE、Integer.MIN_VALUE可以取得int的最大值和最小值;
String不是基本数据类型;数字转字符串:String.valueOf(i);字符串转数字:Integer.parseInt(str);
6. 说明 Class 中方法的执行顺序, static 块与 constructor 。
static{} > {} > className{} > method(){}
静态代码块>匿名方法块>构造方法>普通方法。
参考:Class成员执行顺序
7.ArrayList 是否线程安全。
不是。
8.HashMap 的底层结构。
9. 红黑树, TreeSet 的实现。
10.Collections 中的 sort 方法。手写一个数组的逆序。
11.Collection 接口下有哪些接口; List 与 ArrayList 的关系。
12.Stack 的特点, Stack 与 ArrayList 的区别,与 Queue 的区别。
Stack继承与Vector,特性是:先进后出;
Stack方法:push/pop/peek
Stack和Vertor是线程安全的,ArrayList和LinkedList是非线程安全的;
实现方式:LinkedList-双向链表;ArrayList/Vector/Stack:数组;
Queue是由LinkedList实现,特性是:先进先出。
Queue方法:offer/poll/peek
13.Vector 的内部实现。
相比ArrayList是线程安全的;
14. 线程通信、同步的方法。
没搞懂题目是要问java还是操作系统?
线程通信?
不知。可能讲讲wait()和notify()?
线程同步的方式:互斥量、信号量、事件;
事件:事件机制,则允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。
互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
信号量:允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
15.Lock 比起 Synchronized 的优势在哪里;读写锁的优势。
tryLock(),避免死锁;synchronized是不公平锁,而Lock可以指定锁公平还是不公平;
syn实现wait/notify机制通知的线程是随机的,Lock可以有选择性的通知。
ReentrantReadWriteLock:读写各用一把锁;对于读多写少场景效率高。
读写锁表示两个锁,一个是读操作相关的锁,称为共享锁;另一个是写操作相关的锁,称为排他锁。我把这两个操作理解为三句话:
1、读和读之间不互斥,因为读操作不会有线程安全问题
2、写和写之间互斥,避免一个写操作影响另外一个写操作,引发线程安全问题
3、读和写之间互斥,避免读操作的时候写操作修改了内容,引发线程安全问题
总结起来就是,多个Thread可以同时进行读取操作,但是同一时刻只允许一个Thread进行写入操作。
16.ArrayList 的 add 方法与 addAll 方法的关系, ArrayList 的方法是否线程安全。
17.ping 命令后,返回各参数的意义。
18. 进程与线程的区别、联系。
(概念、资源)
进程是程序运行的实例,是系统分配资源的基本单元;进程无法直接访问另一个进程的资源。如果要访问,就必须使用进程间通信机制。
线程存在于进程中,线程是独立运行和独立调度的基本单元;线程间共享进程的资源。
19. 进程间通信的方法。
(管、信、消、共、信、套)
- 管道及有名管道;
- 信号;
- 消息队列;
- 共享内存;
- 信号量;
- 套接口;
20. 死锁的必要条件、避免、解除方法。
死锁到底问的是数据库还是多线程还是操作系统咧?
产生死锁原因?
1)竞争系统资源;2)进程推进顺序不当;
产生死锁必要条件?
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
死锁的避免?
1)按同一顺序访问对象;2)避免事务的交互(减少持有资源的时间);3)
解决死锁?
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
21. 工作中,与同事在项目解决方案上产生分歧,如何处理。
二面
1.HashMap 底层结构、扩容机制。
扩容机制;
HashMap的参数有容量capacity16、负载系数loadFactor0.75、阈值threshold;当键值对个数>threshold阈值时,扩容;
扩容:
将数组扩容为原来容量的2倍;就数组的所有Entry重新计算索引加入新数组;新数组的引用赋给旧数组;
2. 红黑树的实现。
红黑树本质是二叉搜索树,满足二叉搜索树的基本性质——即树中的任何节点的值大于它的左子节点,且小于它的右子节点。
红黑树节点的基本属性有:颜色、左子节点指针、右子节点指针、父节点指针、节点值;
一颗红黑树必须满足以下几点条件:
1)根节点必须是黑色。
2)任意从根到叶子的路径不包含连续的红色节点。
3)任意从根到叶子的路径的黑色节点总数相同。
这些约束确保了红黑树的关键特性:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。
因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限 允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。
3. 排序的种类、稳定性、时间复杂度,适用场景。
4. 手写线程安全的单例模式。
5. volatile 的含义。
使用volatile关键字修饰变量,线程要访问变量时都是从内存中读取,而不是从缓存当中读取,因此每个线程访问到的变量值都是一样的。
6. 指令重排的含义。
7. 多线程,线程同步,锁。
8. 介绍项目经验。
9. 如何看待加班。
HR 面
自我介绍,家庭情况等。
腾讯
岗位:移动客户端开发 (Android)
一面
1. 自我介绍,项目经验,科研工作。
2. 手写 Java 代码 Hello World( 包引入,完整 main 方法 ) 。
3. 面向对象的 3 个特征。
4. 强引用、软引用、虚引用、弱引用。
强引用:只要引用存在,垃圾回收器永远不会回收;
软引用:内存溢出之前进行回收;软引用主要实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。
弱引用:弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
虚引用:垃圾回收时回收,无法通过引用取到对象值。虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。虚引用主要用于检测对象是否已经从内存中删除。
参考:Java四种引用
5.Collection 框架下接口、类的继承关系。
6.sleep 与 wait 方法的区别。
(1.属性;2.锁;3.范围)
7.Java 中堆的实现类,堆排序的思路。
实现类是什么意思?数组实现?
堆排序包括两个过程,首先是根据元素建堆,然后将堆的根节点与最后一个节点交换,将前面N-1个节点进行堆调整,直到所有节点都取出。
8. 从 1 亿游戏积分数据中,如何选择前 200 名最高积分。
topK;hash统计+维护最小堆;
15. 介绍几种熟悉的设计模式。
单例、工厂、观察者、代理;
16. 画出 TCP 三次握手和四次挥手图,解释握手为何不能用 2 次。
17. 如何预估一个城市的楼房一共有多少块玻璃。
大化小。每个地区来统计。某个地区选一栋,再乘楼树就是该地区的玻璃数。
18. 最困难的经历及如何克服。
二面
1.自我介绍, 项目经验,项目难点及解决方法。
2. 手写冒泡排序。
3. 手写堆排序。
4. 如何测一个云朵的质量。
5. 手写上 n 个台阶总共方法数,(每次上 1 、 2 或 3 阶),递归及非递归实现。
HR 面
1. 自我介绍。
2. 为什么选择开发岗,不是测试岗。
3. 希望以后工作氛围如何。
4. 如何看待竞争。
5. 个人的兴趣爱好。
6. 如何克服遇到的困难。
7. 为何不读博。
8. 性格中存在的缺点。
9. 关注的公众号,阅读的书籍。
10. 能不能接受工作在深圳。
58 同城
岗位: Java 后台开发
一面
1. 手写代码:在一组有序数组中,找出两个数,使得其和为给定和。
算法-Two Sum 解法HashMap;
map(nums[i],i);--key保存值,value保存index;
map.containsKey(tar-nums[i]) ,则保存、返回;
否则map.put;
2. 只用一个变量,如何表示象棋中两方 “ 将 ”“ 帅 ” 的可走位置。
3. 每天用多长时间写代码。
4. 想做开发、算法还是数据工作?
5. 想做移动端开发,还是后台开发?
乐视
岗位: Android 开发
一面
1. 自我介绍,项目经验。
2. 介绍 Android NDK 。
3. 面向对象的几个特性。
4. 数据结构,介绍 Collection 框架。
Collection集合类?
1)List、Set、Queue三个接口;
2)List实现类:ArrayList、LinkedList、Vector;
3)Set实现类:HashSet、SortedSet(i)、EnumSet; TreeSet实现SortedSet;
4)Queeu接口实现类:Deque(i)、PriorityQueue;ArrayDeque和LinkedList实现Deque;
5. 介绍多线程、并发、锁。
6. 熟悉哪些设计模式。
7. 死锁发生的条件。
二面
1. 项目经验。
2. 科研情况。
3. 路由器与交换机的区别。
a.交换机是第二层数据链路层;路由器是第三层网络层;
b.在数据链路层只能识别物理地址,因此当交换机的某个端口收到一个数据帧时,交换机会读取数据帧中相应的目标地址的MAC地址,然后在自己的MAC地址表中查找是否有目标MAC地址的端口信息,如果有,则把数据帧转发到相应的端口;如果没有,则向除源端口外的所有端口进行转发。
c.当路由器的某个接口收到一个包时,路由器会读取包中相应目标的逻辑地址的网络部分,然后在路由表中进行查找。如果在路由表中找到了目标地址的路由条目,则把包转发到路由器的相应接口;如果在路由表中没有找到目标地址的路由条目,那么,如果路由器配置了默认路由,就根据默认路由的配置转发到路由器的相应接口;如果路由器中没有配置默认路由,则将该包丢弃,并返回不可达信息。
4.DNS 含义。
DNS是Domain Name System域名系统,将域名映射为IP地址;
5.ARP 与 RARP 含义。
ARP是Address Resolution Protocol地址解析协议,根据IP地址或获取物理地址(MAC地址);
RARP是Reverse Address Resolution Protocol反向地址转换协议,允许物理机器从ARP列表请求其IP地址。
RARP产生原因:
ARP(地址解析协议)是设备通过自己知道的IP地址来获得自己不知道的物理地址的协议。假如一个设备不知道它自己的IP地址,但是知道自己的物理地址,网络上的无盘工作站就是这种情况,设备知道的只是网络接口卡上的物理地址。这种情况下应该怎么办呢?RARP(逆地址解析协议)正是针对这种情况的一种协议。
6.ICMP 在哪一层。
网络层。ICMP是(Internet Control Message Protocol)Internet控制报文协议。用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
7. 端口的含义。
指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构。
8. 进程与线程的关系。
(概念、资源)
9. 进程间通信方式。
(管、信、消、共、信、套)
10. 死锁的解除方法。
剥夺资源、撤销进程;
11. 堆和栈的关系。
12. 英语能力如何。
13. 如何看待加班。
HR 面
1. 自我介绍
2. 是否愿意到北京工作。
完美世界
岗位: Android 开发
一面
1. 自我介绍,项目经验。
2.static 可以修饰什么。
成员变量、成员方法、静态块;
3.final 可以修饰什么。
成员变量、成员方法、类;
一、final关键字可以用来修饰类、方法、变量。各有不同。
A、修饰类(class)。
1、该类不能被继承。
2、类中的方法不会被覆盖,因此默认都是final的。
3、用途:设计类时,如果该类不需要有子类,不必要被扩展,类的实现细节不允许被改变,那么就设计成final类
B、修饰方法(method)
1、该方法可以被继承,但是不能被覆盖。
2、用途:一个类不允许子类覆盖该方法,则用final来修饰
3、好处:可以防止继承它的子类修改该方法的意义和实现;更为高效,编译器在遇到调用fianal方法转入内嵌机制,提高了执行效率。
4、注意:父类中的private成员方法不能被子类覆盖,因此,private方法默认是final型的(可以查看编译后的class文件)
C、修饰变量(variable)
1、用final修饰后变为常量。包括静态变量、实例变量和局部变量这三种。
2、特点:可以先声明,不给初值,这种叫做final空白。但是使用前必须被初始化。一旦被赋值,将不能再被改变。
D、修饰参数(arguments)
1、用final修饰参数时,可以读取该参数,但是不能对其作出修改
二、final关键字不能用来抽象类和接口。
4.Java 支持多继承吗。
不支持。
5.equals 方法判断两对象 a 、 b 是否相等,判断的是什么。
判断对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象;
6.sleep 与 wait 方法的区别。
(1.属性;2.锁;3.范围;)
7. 在表中插入 10000 条数据,如何提高性能。
1)把所有索引都删除,待插入完毕,再重新建索引,它的意义是:插入时,只写数据,不写索引。全部插入完毕,你再创建索引,索引文件只需创建一次,而不是像你原来那样频繁更新n万次
2)PreparedStatement预处理 + 批处理ps.addBatch
百度
岗位:移动软件研发 (Android)
一面
1.JVM 运行时的结构。
2. 类加载过程。
类从被加载到虚拟机内存中开始,到卸载出内存,整个生命周期包括7个阶段:
加载、验证、准备、解析、初始化、使用和卸载。
其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始。
加载
1.字节流;2.方法区数据结构;3.对象-访问入口;
验证
文件格式的验证、元数据的验证、字节码验证和符号引用验证;
准备
为类变量分配内存并设置类变量初始值;这里所设置的初始值通常情况下是数据类型默认的零值(如0、0L、null、false等),而不是被在Java代码中被显式地赋予的值。
解析
解析阶段是虚拟机将常量池中的符号引用转化为直接引用的过程;
初始化类变量和其他资源;
3. 进程与线程的区别与联系。
4. 线程有哪几种状态。
New、Runnable、Running、Blocked、Dead;(这是错误的,更正!更正!!包括线程之间的状态变换也要更正!)
根据java.lang.Thread.State类,线程包括六个状态:
NEW:线程实例化还未执行start();
RUNNABLE:线程已经在JVM执行。(但还在等待cpu资源?存疑。似乎Running状态是包含在Runnable;Runnable就是线程执行的状态)
BLOCKED:线程阻塞;等待锁,
WAITTING:线程等待;调用Object.wait() 没有timeout 或者 Thread.join() 没有timeout 时进入该状态;
TIMED_WAITTING:线程等待;调用Thread.sleep、Object.wait(timeout) 或者 Thread.join(timeout)是进入该状态;
TERMINATED:线程终止;
(相比较原版本,DEAD更改为TERMINATED,没有Running状态,有WAITTING和TIMED_WAITTING状态;)
状态变化:
(和原版本的区别,没有Running状态;等待不属于阻塞、sleep/join不属于阻塞!)
Runnable:t.start();从new变为Runnable;
Waitting:Runnable执行wait()/join();无限等待唤醒;
Timed_Waitting:Runnable执行sleep()/wait(timeout)/join(timeout); wait释放锁,sleep()不释放锁;等待唤醒,但设置了时限;
Blocked:线程在等待锁;和Waitting/Timed_Waitting是两类概念?可能同时存在?存疑;
5.synchronized 与 volatile 的比较,哪个保证原子性。
原子性:即不可再分了,不能分为多步操作。比如赋值或者return。比如"a = 1;"和 "return a;"这样的操作都具有原子性。类似"a += b"这样的操作不具有原子性,在某些JVM中"a += b"可能要经过这样三个步骤:
① 取出a和b
② 计算a+b
③ 将计算结果写入内存
Synchronized能够实现原子性和可见性;在Java内存模型中,synchronized规定,线程在加锁时,先清空工作内存→在主内存中拷贝最新变量的副本到工作内存→执行完代码→将更改后的共享变量的值刷新到主内存中→释放互斥锁。
Volatile实现内存可见性是通过store和load指令完成的;也就是对volatile变量执行写操作时,会在写操作后加入一条store指令,即强迫线程将最新的值刷新到主内存中;而在读操作时,会加入一条load指令,即强迫从主内存中读入变量的值。但volatile不保证volatile变量的原子性。
6. 方法栈是否是线程私有。
7. 手写多线程下的单例模式。
8.HashMap 的底层结构, hashCode 方法的底层实现。
Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的 字段等)映射成一个数值,这个数值称作为散列值。
9. 线程状态--BLOCKED 与 TIMED_WAITING 的区别。
Blocked是等待一个monitor lock,比如一个线程长期持有lock,另一个线程就会被blocked;
Wait状态是指线程无限等待状态,在执行object.wait()或者thread.join()的时候会出现;
Timed_Waitting是有时限的等待状态,执行o.wait(timeout)/t2.join(timeout)/sleep(time)的时候会出现;
12. 介绍 OSI 七层协议。
(七层+功能+协议)
13 手写单链表反转。
二面
1. 自我介绍,项目经验。
2.Java 多线程机制,锁。
(多线程:1.实现;2.同步;3.优化;)
3.Collection 框架,哪些线程安全,哪些不安全。
Vector、HashTable线程安全;
ArrayList、LinkedList、HashTable等线程不安全;
什么线程安全?
线程安全就是说多线程访问同一代码,不会产生不确定的结果。
4.JVM 中,对象的四种引用。
强引用、软引用、弱引用、虚引用;
a、强引用(Strong Reference)--不会被回收
程序代码中普遍存在的,比如Object obj = new Object(),只要存在强引用,GC收集器永远不会回收被引用的对象。
b、软引用(Soft Reference) --内存紧张的时候被回收
非必须的对象,是否回收,要看当前内存情况,如果紧张,则进行回收,否则不回收。当程序抛出内存溢出异常时,肯定不存在这种类型的对象。
c、弱引用(Weak Reference) --下一次GC回收,即必被回收;
被弱引用关联的对象只能生存到下一次GC发生之前,即每次必被回收。
d、虚引用(Phantom Reference) --GC时回收,无法通过引用取得对象值;用来检测对象是否已经从内存删除。
幽灵引用或者幻影引用,一个对象是否有虚引用的存在不会影响到其生存时间,无法通过虚引用获取对象实例。为一个对象设置虚引用关联的唯一目的是希望能在这个对象被回收时受到一个系统通知。
参考:JVM对象相关
5.JVM 的 GC 机制,分区、算法、对象状态等。
6. 排序算法种类、时间空间复杂度、稳定性。
12. 进程与线程的区别。
15. 内存泄漏的原因、避免。
16. 进程间通信的方式。
(管、信、消、共、信、套)
17.TCP 与 UDP 的比较。
(1.特点:连接、可靠、安全; 2.举例; 3.协议;)
都是传输层的协议;
TCP提供面向连接、可靠的数据流传输,而UDP提供非面向连接、不可靠的数据流传输;
TCP注重数据安全性,UDP数据传输快;比如聊天软件、在线视频等都是UDP;
协议:TCP支持的应用协议有Telnet远程登录、FTP文件传输、HTTP;
UDP对应协议有DNS域名系统;
TCP可靠性?
面向连接、超时重传机制、拥塞控制等;
18.TCP 三次握手。
19.get 与 post 方法的比较。
20. 报文 header 有哪些属性。
(以下为Request的)
Host:请求的主机名;
User-Agent:浏览器类型;
Accept:客户端能够接受的内容类型;
Accept-Language:语言;
Accept-Encoding:压缩编码类型;
Accept-Charset:字符编码集;
Content-Type:提交的内容类型;
Connection:是否持久连接;
Keep-Alive:持久连接时间;
cookie:保存在请求域名下的所有cookie值;
Referer:访问请求的页面;
参考:HTTP的header
示例:
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash, */* Referer: <a href="http://www.google.cn/">http://www.google.cn/</a> Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) Host: <a href="http://www.google.cn">www.google.cn</a> Connection: Keep-Alive Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y- FxlRugatx63JLv7CWMD6UB_O_r
三面
1. 自我介绍,项目经验。
2.PV 操作。
信号量的处理;
参考:PV操作
3. 给出几段代码,说明存在什么问题。
4. 单链表 a 、 b 之间插入 c ,如何实现。
忙过了一段时间,终于有空坐下来写一篇面经,记录一下自己前面一段时间找实习的过程和经验,希望对阅读到这篇面经的你有所帮助。
先介绍一下我的基本情况:
学校专业:本人某普通211通信工程专业本科生(非计算机科班出身)。
面试岗位:Android客户端开发工程师
面试公司:阿里巴巴,华为,CVTE
面试结果:阿里巴巴,华为,CVTE都给了Android客户端开发工程师的实习Offer。
一 阿里巴巴
阿里是内推面试的,不需要笔试。(PS:听说阿里的笔试还是很有难度的,大家找实习时可以先试试内推,只要你简历有让HR觉得有亮点的地方,还是有机会内推成功的。)阿里是我面试的第一家公司,也是最后给我发Offer的公司(PS:可见阿里的流程跑的有多慢,面过阿里的应该都有体会,官网状态卡在“面试中”巨久。。。不过大公司好像都这样,跑流程需要时间,所以大家面试完不要着急,耐心等待,该来的总会来)。阿里面试轮次是最多的,我经历了四轮(三轮技术+一轮HR),听说部分同学还有交叉面,那就更多了。好了,废话不多说,上面经。
阿里实习一面:
阿里一面是电话面试,也是我人生第一次面试,其实还是蛮紧张的。大概在内推简历投出去一个星期后来的电话,当时很多知识还在复习,准备的不是很充分。大部分公司的一面都是技术基础面,主要问的是Java基础+数据结构/算法+计算机网络+操作系统+Android基础。在这里想强调一句,基础真的很重要,很重要,很重要(重要的事说三遍)。因为大公司一般都很看重基础,只有基础扎实,才能在这个基础上深造。
阿里一面问的问题整理如下(因为过去有些时日了,我尽量凭记忆将我被问到的问题记录下来,后面的面经也是一样):
6.强弱软虚四种引用的特点和使用场景
9.进程和线程的区别
10.线程池技术
(1.创建;2.四类线程池;3.参数;)
创建:线程池的顶级接口是Executor,是执行线程的工具;真正的线程接口是ExecutorService;
ThreadPoolExecutor是ExecutorService的默认实现;
示例:
ExecutorService pool=Executors.newFixedThreadPool(2);
四类线程池:
1. newSingleThreadExecutor
创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
2.newFixedThreadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3. newCachedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
4.newScheduledThreadPool
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
线程池ThreadPoolExecutor的参数:
corePoolSize - 池中所保存的线程数,包括空闲线程。
maximumPoolSize-池中允许的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。
threadFactory - 执行程序创建新线程时使用的工厂。
handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
关于corePoolSize和maximumPoolSize:
如果线程数<corePoolSize,有任务时,无论是否有空闲线程,都会创建新线程;
如果corePoolSize<线程数<maximumPoolSize,大于的部分放到任务队列,直到队列满了, 才会创建小于等于maximumPoolSize的线程。
11.死锁的四个必要条件和如何处理死锁
互斥、请求与保持、不剥夺、循环等待;
避免死锁:资源有序分配(避免循环等待)、避免事务交互(减少持有资源的时间)、保持事务剪短并处于一个批处理中(减少持有资源时间)
解决死锁:剥夺资源、撤销进程;
12.线程同步的方法,sychronized和lock的区别等。
有些不太记得了,大概问了十多个问题,层层深入,自己也是尽力回答了。最后面试官问我最近看些什么书啊学些什么啊,简单聊了会儿天。后来面试官问我有什么问题问他,我问了一下他对我的面试过程怎么评价,他直接跟我说基础不错,一面通过了,叫我等二面通知。当时是相当开心啊。
阿里实习二面:
时隔一周之后,阿里二面来了。这次是大中午我在睡午觉,突然一个电话过来了,猝不及防。二面是项目面。二面面试官上来让我简单自我介绍之后就开始问项目。我把自己做过的项目按时间远近顺序跟面试官聊了一遍。面试官对每一个项目几乎都会就其中的一些细节提问。比如项目中使用到的框架,对框架底层源码的理解;还有项目中用到的算法,和对算法的理解和改进等。最后面试官问了我一个Http中get和post的区别,这个我复习过,所以就以为很简单的按照自己记住的几个点回答了。不过面试官貌似对我的回答还不满意,让我进一步解释为什么post比get安全,然后我又答了一通,然后他又说还有些点没有答到,让我再想想。这个问题就这样讨论了好久,到最后我好像还是没能完全让面试官对我的答案满意。然后面试官说那好今天就到这里吧,然后就say拜拜了。当时感觉这一轮面试估计要跪了,面试官甚至连让我问问题的环节都没有了。结束之后我回去搜了一大堆关于讨论get与post区别的博客,好好理解了一番它俩的区别。
阿里实习三面:
然而奇迹还是发生了,大概五天之后三面来了。三面还是项目面,不过侧重点感觉有点不同。三面面试官还是让我自我介绍完后开始聊项目,感觉气氛没有二面那么紧张,相对比较轻松。问的问题大部分也都能回答上来了。主要是聊项目,然后问了些设计模式相关的问题。对了记得还问了个Android里面手机分栏放置若干图片如何让两边总高度相差最小的算法设计题。面试完面试官说后面会有HR联系我,等HR面。到这里,三轮技术面结束了。
阿里实习四面:
HR面主要是问了一些在大学里面做项目的经历和未来规划等之类的问题,这里就不多说啦。
四面结束后过了N久才发的录用意向书,期间经历了华为和CVTE的面试。
【百度、腾讯、阿里等】+【JAVA开发实习生】+春招面试经验
基本情况介绍:
性别:lz萌妹子一枚
学校:本科双非、硕士985
实力:只是女生比,中等偏上一丢丢
面试公司:百度、腾讯、阿里、今日头条、美团、京东、去哪儿、CVTE、神州数码、知道创宇、intel
面试职位:web渗透测试工程师(安全方向)、JAVA开发工程师、测试开发工程师
春招结果:百度(hr通知准备三面,结果被放鸽子)、阿里(测开offer)、今日头条(测开offer)、腾讯(现场面没去)、美团(Java开发offer)、cvte(java开发,hr面挂在城市选择,不愿意去深圳)、知道创宇(web渗透工程师offer)、神州数码(java开发offer)、intel(android内核开发)
lz最后选了美团,如下的面经按照时间顺序,每一块分为面试问题+面试准备+最后总结
阿里巴巴
面试岗位:Java研发工程师(内推)
面试形式:远程电面
面试问题(一面2017.03.08):自我介绍,java数据结构,HashMap原理,自定义类型可以作为Key吗,(10分钟都在说HashMap)
自定义类型作为key需要重写equals()和hashCode()方法;
java内存模型,知道的排序算法,重点问了快排,快排的优化,Java多线程实现方式,Java线程与进程区别。
面试结果:问了29分钟,回答很糟糕,面试官评价中等偏上。
面试问题(二面2017.03.11):自我介绍,java线程与进程差别、JVM内存模型+垃圾回收算法、Java HashMap实现原理
操作系统同步方式、通信方式;
线程同步方式:互斥量、信号量、事件;
互斥量:只有拥有互斥对象的线程才有权限访问公共资源;
信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
进程同步方式(没找到合适说法,就是通信方式?)
计算机网络三次握手四次分手以及wait_time三种差别;
TIME_WAIT
TIME_WAIT 是主动关闭链接时形成的,等待2MSL时间,约4分钟。主要是防止最后一个ACK丢失。 由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接
CLOSE_WAIT
CLOSE_WAIT是被动关闭连接是形成的。根据TCP状态机,服务器端收到客户端发送的FIN,则按照TCP实现发送ACK,因此进入CLOSE_WAIT状态。但如果服务器端不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。
简单说:TIME_WAIT主动关闭方,CLOSE_WAIT被动关闭方,不执行close(),就会无法进入LAST_ACK,此时会return 0;
Http post和get差别,http状态码;
http状态码?
状态码是http响应里的部分,用来描述响应的状态;
2xx:成功处理请求;
3xx:重定向;
4xx:客户端错误;
5xx:服务器错误;
常见状态码:
200:请求被成功接收;
301:永久跳转,完成请求还需进一步操作;
302:临时跳转,完成请求还需进一步操作;
400:客户端请求有语法错误,不能被服务器所理解;
403:没有权限,拒绝访问;
404:访问页面不存在;
500:服务器错误;
503:服务器当前不能处理客户端请求;
在线写了一个判断单链表有没有环;
最后问了个人兴趣爱好、终面可以来杭州吗等私人问题。
面试结果:问了2个小时,但是由于没有听清楚是蚂蚁花呗,以为是杭州别的小公司,最后很傻的挂了面试官电话(当时有点失望,以为是阿里结果不是),很可惜的没有后面了,情商真的很重要很重要,要不然就过了。
面试总结:JVM答得很好,16年年末,看过《深入理解Java虚拟机》;内推刚开始问的问题,真的很简单,答不出来一定会被pass,但是,个人没有认真准备,只是看了网上一些很肤浅的帖子,正确做法是:去看书、去看书、去系统的看书,没有来不及。
面试岗位:测试开发工程师(网上校招)
面试形式:远程视频
面试时间:2017.05.24-2017.06.01
面试内容:一面(05.22)自我介绍+自由发挥:Java内存模型、Java类加载过程、JVM解释编译执行过程、测试方法、还聊了一些个人方面的问题;
二面(05.24)自我介绍+自由发挥,按照简历问,可能是因为测开简单吧,问的问题很简单:平时遇到的App有哪些bug,问题可能出在哪;测试与开发的差别;对测试的理解;瞎扯了一下最近发生的安全问题;看待加班;个人观念三面(05.24)Hr面,阿里hr真的好厉害,而且是个中年大姐,每一问都不知道言外之意是什么,所以回答的很小心谨慎;问题:大学当项目组长如何协调组员关系、分配任务;遇到的学习困难,技术难点怎么解决;家庭情况,家庭地址;职业规划
面试结果:06.01收到offer,比第一次简单很多。但是,如果是java开发估计也会挂,java开发缺乏太多东西,太差劲了。有时候,要及时调整方向,个人对自己开发没有信心,但是测开可以碾压所有的测试女生,lz很自信。
百度
面试岗位:测试开发工程师(内推)
面试形式:电面
面试内容:(一面2017.04.10)说好下午14:00开始,结果一直没打电话,到了晚上问了hr,才想起来给我打电话,(百度真的太不守时了,很失望),自我介绍+结合简历问的,大部分问的是web渗透测试,安全那些问题漏洞利用+sql注入,问了一个算法,剑指offer第一题,我都说了不会c,java可以很快的完成,但是面试官一直让用c做;(二面2017.04.11)时间定于14:00,结果改为16:00,还好是学姐,问了一个算法题目,把一个数再分解为因子,找到因子和最小的分解,java NIO等,具体记不清啦。接着,,hr电话通知14号三面,让好好准备,结果没有音讯。。。
面试结果:不知道百度,怎么想的,为什么要糊弄人,真的很气人。。
腾讯
面试岗位:java开发工程师(内推)
面试形式:电面
面试内容:(一面03.17)自我介绍+建立项目内容,其余的记得不是很清楚了,唯一一个算法,当内存放不下大规模的数据,需要按照什么方法去取,,当时面试官给的答案是并发。,我以为是归并算法。
面试结果:一面以后没有任何信息,虽然面了1h,以为希望很大。
后期,在线网申,得到到现场面试机会,只是填的是qq邮箱,等看到邮件的时候已经过了日期,可惜~~
今日头条
面试岗位:Java研发工程师(内推)
面试时间:2017.03.22
面试形式:远程视频
面试内容:
数据库引擎类型与差别?
数据库索引类型?
普通索引、唯一索引、主键索引、组合索引;
普通索引:没有任何限制;
唯一索引:索引列的值必须唯一,但允许有空值;
主键索引:特殊的唯一索引,不允许有空值;一个表只能有一个主键;
组合索引:多个字段组合作为索引;
参考:索引类型
唯一索引和普通索引差别?
在线算法,找出增序排列中一个数字第一次和最后一次出现的数组下标,数据去重,海量数据去重,找出海量数据中前10个最大的数(数据有重复)。
面试结果:赤果果的挂了,现在看来这些问题都很简单,可惜当时没有答出来,其次,海量数据这里用到了聚类的思想,这次面试含金量特别高,但是没有问道java基础,后来才知道面试官不是做java开发的,不过,面试官说的厚积薄发很中肯。
面试岗位:测试开发工程师(校招)
面试时间:2017.04.12(一下午面完)
面试形式:远程视频
面试内容:(一面)自我介绍+在线编程:单例模式、内推时的相同算法+多线程创建;
java 范围关键public以及其他几个;
成员变量的修饰符:
private:自身可以访问,同包子类不能继承,同包类不能访问;
默认:自身可以访问,同包子类可以继承,同包类可以访问;
protected:自身可以访问,同包子类可以继承,不同包子类可以继承,同包类可以访问,其他类不可以访问;
public:不同包子类可以继承,其他类可以访问;
public > protected > default > private
public 指定该变量为公共的,他可以被任何对象的方法访问。
private 指定该变量只允许自己的类的方法访问,其他任何类(包括子类)中的方法均不能访问。
protected 指定该变量可以被自身和子类访问。在子类中可以覆盖此变量
线程与进程差别;
java抽象类与接口差别
(二面)给定区间[1,3],[2,5],[5,8],[12,55],[3,6],[7,8],最后给出合并后的结果[1,8],[12,15],在线编程,(三面)自我介绍+项目经历,linux查看线程,linux vim 。
面试结果:不得不说今日头条效率高效,从开始面试到offer发放,总共3.5h,效率极其高,今日头条测试开发岗位明显简单了好多好多,和开发不是一个级别的,我同学笔试4个题accept 330%的大牛,最后都挂了。
美团大众点评
面试岗位:java开发工程师(在线网申)
面试形式:电面
面试时间:2017.05.12-2017.05.17
面试内容:(一面05.12)自我介绍+项目经历,算法:数组先升序在降序,找出最大数,jvm内存模型,java线程与进程差别(二面05.17)自我介绍+项目经历,算法:正整数数组,拼出一个最大的正数;java NIO,java 多线程、线程池,java 网络编程解决并发量,java内存模型,数据库的隔离级别,Mysql 存储引擎以及差别。(三面05.17)很快,中午12点,二面1h后,hr电话打来,商量入职时间等。
面试结果:成功拿到offer,可能后期美团面试难度没有那么高,其次准备也比较充分了,看了很多相关的书籍吧。充分准备才是面试取胜的关键。
去哪儿
面试岗位:Java开发工程师
面试形式:现场面试
面试时间:2017.04.21
面试内容:(一面)首先说一下,去哪儿是唯一一个在现场酒店面试的公司,可能是工作人员的失误,时间从14:00一直等到17:00才轮到我,看着其他的面试者一个一个都面,只有我一直在等,到最后确实是生气了,很生气。问题:自我介绍+项目经历。
抽象类与接口的差别,抽象类可以有实例吗?
抽象类不能实例化;
String类可以继承吗?
String由final修饰,所以不能被继承;
synchronizated 和lock差别?HashMap实现原理,同步还是异步?
java地址和值传递的例子?
基本类型,传递的是基本类型的值的拷贝;
引用类型,传递的是该参量所引用的对象在堆中地址值得拷贝。
Collection集合类中只能在Iterator中删除元素的原因?
每次我们尝试获取下一个元素的时候,Iterator fail-fast属性检查当前集合结构里的任何改动。如果发现任何改动,它抛出ConcurrentModificationException。Collection中所有Iterator的实现都是按fail-fast来设计的(ConcurrentHashMap和CopyOnWriteArrayList这类并发集合类除外)。
当使用Iterator来迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove()来删除上一次next()方法返回的集合元素才可以。否则将会引发java.util.ConcurrentModificationException异常。
Mysql 存储引擎类别以及差别?
面试结果:一面就挂了,问的很多问题一方面自己不会,另一方面,由于等待时间太长,和前台工作人员闹了不愉快,可能面试官觉得我个人有问题吧,所以pass的很快,不过也是一次经验获得,不管等多久,态度都要谦和。
京东
面试岗位:Java开发工程师
面试形式:电面
面试时间:2017.04.17
面试内容:(一面)自我介绍+项目经历,问题:
Mysql索引实现原理,Mysql ACID具体,
隔离级别,隔离级别如何实现,
读未提交、读已提交、可重复读、串行化;
实现:MySQL中设置事务的隔离级别。
set [glogal | session] transaction isolation level 隔离级别名称;
set tx_isolation=’隔离级别名称;’
参考:数据库事务
Java多线程,线程池有哪几类,每一类的差别?
1. newSingleThreadExecutor -单线程
创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
2.newFixedThreadPool -固定大小线程池
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3. newCachedThreadPool -无界线程池,可以进行自动线程回收
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
4.newScheduledThreadPool -支持定时以及周期性执行任务
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
synchronized 实现原理?
每个对象都有一个monitor锁,当monitor被某个线程持有后,便处于锁定状态,其他线程访问已加锁数据要等待锁释放。
HasnMap实现原理,扩容因子过大过小的缺点,扩容过程。
负载因子?
负载因子越大,对空间利用越充分,查找效率越低;
负载因子过小,散列表数据过于稀疏,对空间造成严重浪费。
扩容过程?
当添加元素时,若元素个数大于阈值,则resize();数组扩大为原来2倍,新建数组,将数据复制到新数组,引用指向新数组。
面试结果:每一问答得都很糟糕,尤其是数据库那一块,根本不熟悉,纯属胡说。项目经历回答也很糟糕,此外,面试官思路超级清晰,这么多面试中最欣赏的面试官,废话没有,条理很清晰,言简意赅。
总结
积累、积累、再积累。推荐系统的去看相关书籍,不是看帖子,没有用处。推荐书籍如下《深入理解Java虚拟机》、《Effective Java》、《深入分析Java web技术内幕》、《高级数据库原理》、《剑指Offer》+牛客在线编程、《Java并发编程实战》、《Java编程思想》
注:lz还没有看完,有些没看懂,但是最起码知道面试官问的问题的深浅,以及要怎么回答;其次,情商很重要,有些话不能乱说。
分享下我被头条三面挂的经历 T o T
四月份的时候家里有些事情,所以是五月份那一波视频面试的
一面:
一面问的很基础,但还是面的很差,但是应该是一面都比较宽松吧,所以还是被放过去了。
1.线程和进程区别?
大概讲了进程线程区别,但似乎没达到面试官要求的深度。。
(线程和进程出现很多次了。。还是得多准备一些)
(概念、资源、联系)
进程是程序运行的实例,是系统分配资源的基本单元;进程无法直接访问另一个进程的资源。如果要访问,就必须使用进程间通信机制。 ->可能会追问进程通信机制;
线程存在于进程中,线程是独立运行和CPU独立调度的基本单元;线程间共享进程的资源。
一个进程可以有多个线程,多个线程也可以并发执行;
2.nginx功能是什么?多进程还是多线程?
这个是因为在简历上写了了解nginx,但是好早以前看了一下nginx的知识,好多都不知道了,蒙了一下,说是多线程。面试结束重新看了才发现蒙错了....
3.简述tcp三次握手?
这个比较简单,随便说了说三次握手的过程
4. 数据库如果频繁查询某字段怎么办?如果两个属性频繁被一起查询呢?
建立索引;组合索引;
5. sql查一天各种类型的新增用户
这题其实不难,但是sql基本忘的差不多了,写不出来完整sql,大概跟面试官说了说思路
7. 算法题了,求二叉树的深度,比较简单
前段时间才做过,而且这题也不难
9. 你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?
完全没想到正确的方向上,面试官几次提醒,还是没想出来,我太弱了。
时间也差不多到了,面试官说又问了问打不打算考研啊,成绩啊这些的。然后说等会有二面,不过等了好久,当天还是没排上,二面排在了两天后。
二面:
1.了不了解b+树,有什么优点
前些天很粗略看了看,大概谈了谈,不过完全是一知半解的状态,差不多回答的对错参半
B+树是多路搜索树,它和B树的区别是所有关键字出现在叶子节点的链表中,非叶子节点相当于叶子节点的索引;
和二叉搜索树相比,B+性能相当于所有关键字做一次二分查找,没有二叉树平衡问题。
3.又问了道数据库题,和一面一样,我还是写不出来,,不过挺简单的,就是查什么平均数什么的。
5.求两个排序数组的中位数
写了个o(k)的解法,面试官不满意,后来想了段时间,写了个o(lgk)的算法,面试官还算满意
接着就是随便聊了聊,学了哪些课啊,能实习多久之类的,然后差不多也就结束了。二面结果是后来我打hr电话才知道的
三面:
1.我说平时看的书比较多,做的项目少,就问我看了哪些书啊什么的。然后问我读完c++ primer有什么感想
2.然后顺着我的感想就问我智能指针的实现了
简单写了个,然后面试官问我怎么处理多进程访问什么的。但是面试官对加锁这个回答不满意,提到可以原子操作,我也不记得了。这题答的也不好
3. 问同步io/异步io的区别
这个前一天历各种面试题的时候简单看了网上的答案,于是顺着回答了,不过好像完全理解偏差了,对操作系统怎么处理这个问题完全没搞清楚。答的又很失败
4.问了不了解网络
说知道,但是好久没看了,但是忘了好多网络的知识,结果面试官就没问。感觉当时不应该这么说的,其实算起来还是知道一些的。
4. 求数组中逆序对
这个前一天在剑指offer上看了,然后立即就跟面试官说那个归并算法的思路了(估计我这个反应,面试官一看就知道我看过这题了),不过实现的时候发现有困难,忘了要建一个辅助数组,后来折腾好久才弄出来。(期间面试官很着急的催促,一直看手机,那时候就猜到面试应该是没戏了)
接着就是简单聊了聊其他的了,实习多久,兴趣爱好什么的。问有什么想问他的。我就问他我有哪些不足,然后面试官给我推荐了包括apue在内的几本书,让我再做点项目。
然后就没消息了,战战兢兢等了好几天,给hr打电话才知道其实当天就被淘汰掉了ㄒoㄒ,而且hr还非说是当天就给我发了邮件的....
二面三面面完后问题没记下来,也许有遗漏。
感觉自己太弱了,开始都不敢面的。能挺到三面还是很出乎自己意料了....毕竟我太水了
不过发现好像面试也没想象的那么难,当时感觉自己太渣,就没打算找暑期实习,所以只是拿着很low的简历,随便投了几家,想着笔试面试积攒经验。现在有些后悔了,发现实习生笔试面试其实也没想象的那么难,其实面试官问的问题都不难,怪我没准备。而且初次面试,很紧张,也没有经验,完全很被动。面试官问什么,我就吐一点什么出来。没项目,基础知识也不好,还没有面试技巧,难怪被挂....
还有就是觉得面试中犯了挺多错误,思路都还没理清晰就开始写代码,紧张状态下出现各种本不该有的bug...应该也在面试官心中减分不少