2016年互联网面试总结

来源:互联网 发布:fps网页.知乎 编辑:程序博客网 时间:2024/05/20 03:06

今年的找工作之旅也差不多到尾声了,其实已经一两个月没有面试了,想了一下还是记录一下面的几个公司吧,只记得那些能记起来的了。
我面的岗位是Java研发工程师,所以涉及的都是这方面的知识点吧。。

实习篇

1.摩根士丹利

第一场面试就是摩根。。。面试官很nice,主要问的问题:
(1)介绍了一下项目并说说自己做的那一部分(介绍完才发现,自己做的太low了,还需准备)
(2)多态。c++中虚函数,在派生类中重写虚函数,在运行时怎么知道我具体是运行的哪个子类中的。
(3)java中常用的Collection有哪些
答: List,包括ArrayList和LinkedList。ArrayList内部是由数组实现的,可改变长度。LinkedList是链表实现的,不可改变长度。
问:你说的可变长度和不可变长度,是不是意味着你一般定义LinkedList的长度,比方说10,然后超过就不可以了?
答:不是的,不一定是要写明LinkedList的长度,不定义的话应该是机器决定你的LinkedList最大能开辟多少的空间。。我只要在我需要的范围内add数据。
问:那如果有很多很多的add操作,会遇到什么问题,不可能无限的空间给你add啊
答:是啊。。。所以有一定的范围,LinkedList最大能有多少空间我觉得应该是机器决定的吧,32位机和64位机应该不一样吧(蒙,其实我不太清楚)
问:好吧,还有其他你常用的Collection吗?
答: Set,主要有HashSet,TreeSet,LinkedHashSet,然后分别解释了一下这三者之间的不同
问:分析一下HashSet和TreeSet的复杂度,插入,查找等时候。
答: HashSet应该跟它的hash有关吧,如果只是普通的散列码,可能会造成很多冲突,这样链表就会比较长,查找的时候遍历链表时就会比较慢,但是你用优化方法去解决冲突,例如二次探测什么的,减少冲突,应该会比较快吧,TreeSet内部使用的红黑树,查找和插入顺序应该是O(log(N))吧。。。
然后就换另一问题了。。。没再继续问下去。


回头查了一下,我的回答不太准确。
  对于ArrayList和LinkedList,我竟然忘记说ArrayList是基于动态素组实现的,所以查询速度比较快,适用于频繁查询操作,LinkedList适合于频繁插入、删除的操作。。。
  至于ArrayList和LinkedList能存储的最大容量,ArrayList理论上不能超过Integer.MAX_VALUE,看文档说明
这里写图片描述
  至于LinkedList,由于它是由链表实现的,理论上不限制长度,看内存空间到底有多大。但是要注意的是,LinkedList也有size()函数,返回值有一定的限制。

(4)解释一下内部类,并写一个内部类和匿名内部类
答:内部类就是将一个类的定义放在另一类的定义内部。
然后我举了一个匿名内部类的例子,我们常用的Thread

Thread thread = new Thread(new Runnable() {            @Override            public void run() {                // TODO Auto-generated method stub            }        })

问:在你写的run()函数中,可以用外部定义的变量吗?
答:可以啊,匿名内部类总应该只能是final类型变量。。
问:你平常写一般的内部类比较多还是匿名内部类比较多
答:普通的内部类啊
问:举个例子
答:一时脑抽,想不起来具体的例子了,orz。。。。


补充:
  当生成一个内部类对象时,此对象与制造它的外围对象之间就有一种联系,所以它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。
  想想我们为什么要需要内部类?每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。由于类不能多继承,内部类能有效的实现”多重继承“
  举个内部类的例子:
  把Node类放在LinkedList类内部,每次插入一个元素时,生成Node类的一个对象。

(5)由上一题引出问题,加了static的内部类和不加static的区别。然后说一下对static关键字的理解。
加了static关键字的内部类即嵌套类。普通的内部类对象隐式地保存了一个引用,指向创建它的外部类对象,当内部类是static是,就不是这样了,意味着:
1)要创建嵌套类的对象,并不需要其外部类的对象
2)不能从嵌套类的对象中访问非静态的外围类对象。
普通内部类的字段和方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和字段,也不能包含嵌套类。但是嵌套类可以包含以上所有东西。

class A{    class B    {        // static int x; not allowed here    }    static class C    {        static int x; // allowed here    }}class Test{    public static void main(String… str)    {        A a = new A();        // Non-Static Inner Class        // Requires enclosing instance        A.B obj1 = a.new B();         // Static Inner Class        // No need for reference of object to the outer class        A.C obj2 = new A.C();     }}

对于static变量或方法等,不需要实例化类的对象就可以调用,它不是“面向对象”的。
(6)接口和抽象类的区别,自己写一个抽象类和接口的例子。例如你常用的接口有哪些
答:
接口与抽象类的区别:
1)抽象类可以有构造函数,接口没有
2)抽象类中有普通成员变量,接口中没有普通成员变量
3)抽象类中可以有抽象方法和非抽象方法,接口中的方法都是抽象的
4)抽象类中的抽象方法的访问类型可以是public,protected的,但是接口中的抽象方法只能是public的,默认是public static类型
5)抽象类中可以包含静态方法,但是接口中不能包含静态方法。
6)一个类可以实现多个接口,但是只能继承一个类。

常用的接口Runnable,,HttpServletRequest ,,HttpServletResponse 等等

其实感觉自己说的并不怎么好。
总结一些知识点:
常见的接口:Comparable ,Collection,Set,Map,List,Runnable等等
常用的类:java.lang.Object、java.lang.String、java.lang.StringBuffer、java.lang.Math、java.lang.System,java.util.Vector,java.util.Date,java.text.DecimalFormate
常用的包:java.lang、java.awt 、java.io 、java.util 、java.sql
常见的运行时错误:
Exception:
java.lang.NullPointerException,java.lang.ClassNotFoundException, java.lang.ArrayIndexOutOfBoundsException,java.lang.IllegalargumentException,
java.lang.InterruptedException

Error:
java.lang.StackOverflowError
java.lang.OutOfMemoryError

具体也可查看文档:点此

阿里

一面(2016.3.25)

1.自我介绍
2.介绍一下项目
3.根据项目(我有一个项目涉及到爬虫,就问了一点关于爬虫的问题)。给定一些爬取页面的url关系图,怎么判断现在遍历到的页面已经爬过了?有没有快速一点的方法?
4.讲一下List,Set,Map之间的区别。给出一串数字,要按输入的顺序输出,用哪种容器来存?如果我已经规定要用Map来存,那满足这种条件的话用什么Map,等等等等
5.java是一门面向对象的语言,讲一下其面向对象的特征
6.函数重写和函数覆盖的区别
7.抽象类和接口的区别
8.多线程一般怎么实现,什么时候用Runnable?什么时候选择用Thread,你的项目中有用过多线程吗?用在什么地方?
Runnable主要还是考虑到程序的扩展,因为java不支持多继承。
9.你会如何实现一个单例模式?
延迟加载 线程不安全
直接创建 线程安全

public class Singleton{    //类加载时就初始化    private static final Singleton instance = new Singleton();    private Singleton(){}    public static Singleton getInstance(){        return instance;    }}

还可以参考下这个链接的内容
10.了解jvm吗?堆内存结构
11.数据库索引。假设我有一张表,在姓名name字段建立了索引,现在要找姓王的所有用户,sql语句怎么写? 什么时候建立的索引有效,什么时候建立的索引会失效? 如果在性别字段(只有男和女两种情况),有没有必要建索引?
select * from tb where name like “王%”
左匹配的时候可以用索引
有匹配的时候索引失效。 “%琴”这种,虽然name字段建立了一个索引,但是没有用。
12.项目用了什么框架?
13.讲讲你对spring框架的理解?它有什么优点?
14.jsp 的四个作用域 :page、request、session和application的区别
15.session是怎么跟踪用户信息的?我怎么知道这个用户就是之前登录的用户?
16.OOM,碰到过哪些?一般怎么想办法解决的?
17.bean中作用域singleton和prototype的区别?
18.进程与线程的区别

二面(2016.4.6)

1.自我介绍
2.介绍项目,碰到什么难点,怎么解决的? 我说了一些,然后说要改些什么,问那有什么改进的想法了吗。。
3.讲一下jvm类加载过程
4.有没有做过开源项目,看过的开源项目
5.对未来有什么规划
6.关于岗位的(意思是如果换岗,会接收吗?)
7.有什么想问的问题

网易(2016.4.6)

一面

1.项目用到哪些技术
2.spring框架有哪些优点
3.AOP。。一般你是怎么实现的?答:代理。。哪些代理? 动态代理和cglib动态代理区别
4.用过哪些集合。写一个链表中删除元素的代码。(我有用迭代器+remove操作),remove操作可能会出现什么问题
5.给一个链表,怎么实现排序(答,继承Comparable接口重写compareTo函数,或者自定义比较函数),问两者又有什么区别。。
6.线程。项目中用到多线程吗?什么情况下用?
7.如何返回线程的状态(答的currentThread()是获取当前线程的状态,答错了。。。)

Class A(){    .........    synchronized(this)//(1)    {    }    synchronized(A.class)//(2)    {    }}

Thread t1,t2指向的是同一个对象,当t1进入(1),t2能进入(1)吗?能进入(2)吗?延伸好多,记不太清

8.在写同步的时候要注意的问题,例如用synchronized时会出现什么问题?(答,可能会出现死锁之类的,举了个例子,不知道答得在不在点上)
9.jvm。。学了些什么,说一说。就介绍了一下类加载等过程
10.接触过哪些设计模式。举例
11.hashMap,ConcurrentHashMap

二面

1.描述在浏览器中敲入一个网址后所发生的事情
2.DNS端口号
3.get/post区别
4.纸上写题,字符串反转
5.有没有接触过分布式,hadoop之类的
6.线程有哪些实现方式
7.垃圾回收过程
8.给出2G的内存,大概可以建多少个线程

校招一面

被虐。。
1.数据库:事务(包括ACID属性), Innodb
有一张表,id,userid,type,money
(1)求出前五项消费最高的类目
(2)求出每个类目下消费最高的用户id
2.网路编程
3.操作系统
4.项目中要到多线程的地方,包括爬虫用到多线程的地方都要了解
5.jvm内存管理,GC,查看GC的命令

腾讯

1.C++多态,常用的STL
2.vector,list区别,其内部的排序算法用的是哪种排序
给出一个链表,能用快排进行排序吗?(不能开辟额外空间)
3.用过网络编程吗?(木有) TCP 连接,断开过程,窗口,拥塞控制
4.内存管理
5.map是怎么实现的,hash key值时复杂度,如果不用hash,用平衡二叉树怎么样?两者有什么优劣?map插入删除时如果多线程的话怎么保证线程安全?如果用的是hash算法,当链表太长是,需要rehash,怎么保证线程安全。。。
5.文件系统,linux (不会,orz)
6.手写程序,给出一颗完全二叉树,现在要插入下一个节点,怎么实现,时间复杂度多少?(我写了一个log2Nlog2N 的。。)
貌似就这些,中间展开比较多,还谈了一些比赛,项目。。

微软

一面:

1.聊了一部分项目
2.有一个大文件,里面存着URL,现要随机取K个URL,怎么随机抽取并写入到文件。
可以参考这个博客

二面:

1.给出一个int范围内的数,例如10,转换成二进制数为0000….1010,求出这个二进制数中有多少个0构成的块,0000…00001010 ,有3个0构成的块
2.给出含有n个元素的int类型的数组和一个int类型的数K,求数组中的那些元素乘积等于K,给出所有元素的组合

三面:

1.有两个字符串,例如S1=abcbcd,S2=abcd,求S2是否包含在S1中,如果有,则输出每种结果对应的下标,例如S1=abcbcd,S2=abcd时,下标的组合:{0125,0145,0345}
2.现有32G的数据,但是只有8G的内存,怎么对这些数进行排序。
3.有一个大文件,里面存着电话号码,现给出一个电话号码,判断该电话号码在不在该文件中。
4.现有一个大文件,存着电话号码该该电话号码对应的话费记录,选出前10000个消费最高的电话号码(NlogK)

校招篇

京东

1.介绍简历中的项目
2.爬虫url去重,bloomfilter原理,影响bloomfilter效率的两个参数
3.数据库。我说了mybatis,参数中$和#的区别;悲观锁、乐观锁;Innodb和MyISAM的区别;数据库优化,索引,怎么快速查看索引建立的索引有没有生效;数据库执行计划;。
4.sql注入和防范方法;垂直越权。
5.实现多线程的几种方法;Future的特点。
6.开放题。如果服务器上运行了一个程序,过一段时间发现他运行越来越慢,费时了,可能是什么原因造成的,你会从哪些角度来考虑?
答:分析一下日志,有可能是内存问题,导致一直产生full gc,那可能就影响速度了。。比如一开始分配内存不足,所需的对象又占较大内存。。。blabla
问:那怎么找到这个有问题的对象。。
答:blabla。。。
问:现在假设内存是正常的,那有可能是什么原因?
答:那可能程序有bug等,执行费时的程序。。jvm没有优化等等。。
问:那怎么找到有问题的代码。。orz
答:blabla。。
问:现在假设这些都不是问题,线下测试是正常的,线上比较慢。。又是什么原因?
答:网络问题吧。。地址解析。。有没有缓存等,或者防火墙拦截?。。blabla。。
感觉在乱答。。orz。。
7.手写程序,写一段你认为最好的单例模式的代码
8.有没有用linux,hadoop等,有哪些你认为是自己的有点我没有提到的?有什么想问我的。。
还有哪些。。忘记了。。。

网易

一面

spring AOP,IOC,bean默认:singleton
spring MVC
synchronized和lock
Collection
jvm:内存都组成,GC
HashMap和CurrentHashMap的不同,HashMap的内部实现所用的结构
缓存,一级缓存,二级缓存
线程池
红黑树

二面

Collection和Collections
IO和NIO
jvm:-Xmn,-Xms,-Xmx分别代表什么,-XX:SurvivorRatio的含义
优先队列的内部实现
斐波那契的实现
关系型数据库,非关系型数据库
生产者和消费者
开放题:
了解的一些中间件
在看的相关领域的书
java比较流行的一些框架

好像还有华为,腾讯之类的,腾讯二面跪了,各种分布式的知识,刚好碰到来了自己不熟了一块,打的不好,校招面试差不多和实习的类似,就不记了。
总而言之,实习面试就是刷经验的,第一场面试担心的要死,面到后来都麻木了,也不太会紧张了,所以实习面试的时候要多刷一下。

准备资料

  面试主要还是考察基础知识扎不扎实。当然,我们这个专业,项目经验也是丰富一点的好,主要能说出自己参与的内容,几个亮点。
  整理一下我主要看的一些书:

基础篇(Java)

  《Java编程思想》(一些基础,遇到不熟的时候翻一翻)
  《Effective Java》
  《Java并发编程实践》
  《深入理解Java虚拟机》
  《Java面试宝典》(虽然看了,但是感觉很一般。。还是看看其他系统的书,早点准备的好)
  上面是我看的一部分Java的书,都还是不错的,但是书毕竟是理论,还是要结合工程等,时间操作一遍印象更深刻。
  能看一些源码是最好不过了,可以学到不少。简短一点的,MyBatis的源码可以看看,还是能看的,也能学到不少设计模式等知识。

网络篇

  网络的相关知识在面试中也是经常遇到。下面的书可做参考:
  《HTTP权威指南》
  《TCP-IP协议族》
  《TCP-IP详解卷1:协议》(有好几卷,基础的话看看卷1好了)
  网络我基础不太好,面试中当然也是问一些很基础的网络知识,把基础补补好。
  

数据库

  数据库的其实看的不多。这边还不错吧
  《高性能MySQL》

分布式

  我对分布式不熟悉,但是其实蛮重要的,要在实践中去学,面试其实面的不多,就腾讯什么的好像问到了。
  《大型分布式网站架构 设计与实践》
  《大型网站技术架构 核心原理与案例分析》
  我就稍微看了一点上面两本书,还可以,面试的问题其实书上也提到过的,只是我自己没有相关的项目实践,所以面试的时候也没答好,能配合项目去操作一遍再好不过吧。

算法篇

  算法的话,还是看你要面试什么公司吧,外企什么的那可能要算法啦,耍耍leetcode之类的。其他国内的互联网公司其实问的不多,就面试到最后问个一题,或者干脆不问。要面试外企的则要好好刷题。
  《编程之美》
  《剑指offer》
  算法光看书没什么软用,需自己把书上的题自己实现一遍,《剑指offer》上的题很多在leetcode上是有的,可以去那边刷一下验证一下自己的想法。

其他

  操作系统很惭愧,我没有好好准备这一块,一块软肋。。
  《设计模式 可复用面向对象软件的基础》(这本看起来挺枯燥的,我一般看网上的资料,然后看一眼这本书中的介绍。单例模式当然是问的比较多的,几种实现方法要能写出来。设计模式需掌握各3-4种比较常见的)
  《疯狂Java讲义》
  要需要了解一些框架,比如Spring,知道AOP,IoC之类的概念,MVC等,这个做过相关工程的话应该还是能说上一些的。

  面试的准备貌似就看了上面的一些书吧。重在实践2333。虽是投了Java开发岗,肯定还是不能只关注于此,做实验处理数据什么的就觉得Python比Java好用多了。。(●’◡’●)
  还有关注一些互联网的事实,一些发展,可以扯扯淡,主要用于面试到后期的情况吧,前期主要面基础。。别再基础面挂了就好,哈哈哈。

2 0