zoukankan      html  css  js  c++  java
  • 阿里巴巴java工程师面试经验详情

    阿里巴巴java工程师面试经验详情

     

    转载 : http://www.kanzhun.com/gsmsh8198414.html

     

    头像

    匿名用户

    java工程师的面试经验 2016-06-13 11:27

    2016阿里实习面试经验分享

    面试地点:阿里巴巴-杭州

    一面:整整70分钟!(说好的45分钟呢?人和人之间这点信任都没有了吗?) 
    1、问:你把java内存模型的架构给我画一下吧? 
    我: 迟疑了一下,心想,JMM这玩意儿有架构图吗?这可怎么画。面试官看我迟疑,说,那你不画,先说一说吧,我就跟他说了由于什么指令重排序,处理器缓存什么的,不同的系统或者平台有不同的内存模型,使得相同的java程序在不同的处理器架构下的表现不一致啊,java内存模型就是为了在不同的处理器架构和平台下给java程序员提供一致性内存访问的保证的。本以为后面要问到volatile的内存语义,内存屏障,happens-before之类的,没想到面试官来了一句:你完全说错了,你说的这个是java的跨平台特性,不是内存模型,然后说内存模型是什么什么堆、栈之类的。 于是我就懵了,我就想到了原来面试官理解的内存模型就是我理解的java运行时数据区域(程序计数器,虚拟机栈,本地方法栈、java堆,方法区)。我也不敢跟面试官多争论,简单地表达了一下我的观点,然后他就接着问我,那你说说java是如何实现跨平台的。 
    2、问:说一下HashMap是如何实现的吧 
    我:就先画了一下结构,再说了一些什么拉链法解决冲突,什么JDK8里面冲突达到一定数量的时候就改用了红黑树的存储等等,然后问我怎么扩容。 
    3、问:说一下ConcurrentHashMap吧 
    我:JDK7里面采用的是分段锁机制什么的,读的时候不加锁,写的时候分段加锁,先定位到某个段,然后段里面的操作委托给HashMap等等。然后又说JDK8里面 ConcurrentHashMap有很大变化,从1600多行代码扩充到了6000多行代码。(还好没接着问我JDK8里面是怎么实现的,就昨天晚上瞄了一眼,6000多行代码确实没看下来) 
    4、问:用他的电脑给我看了一段程序,问我输出结果是什么,跟finally块相关的,考察点就是try块里面return了某个值,finally里面又对该值进行操作了,问最后的结果是什么,我知道return之前会先执行finally块里面的操作,但是操作的是引用类型还是值类型的情况是不一样的。本想把那个代码回忆起来,想想还是算了,应该有人能知道我说的是什么意思。我在回答这道题的时候面试官还“贱贱地“说这道题是有坑的,然后看我踩坑了还很鄙视的说一句:看那么多书连引用类型和值类型都搞不清楚。
    5、synchronized相关的,为什么同步块太大会影响性能?不同的线程拥有不同的对象锁,它们之间会有影响吗?如果synchronized加在静态方法上面那么锁指的是什么?(在这个地方又跟面试官就几个名词纠缠了一会儿,我说锁是Class对象,他问是实例还是对象,他说实例是静态的,对象是动态的,我说Class是静态的,对象是动态的,然后他说我们不说类了,用英文,instance和对象,我说instance我理解的就是对象啊,可能他觉得instance是指类,对象就是new出来的对象,也许是我没看过英文版的书吧)于是我接着说,指的是对象,是java虚拟机将一个类的字节码加载进内存之后生成的一个java.lang.Class对象,然后他可能没听明白我说的,还是在问,到底是类还是对象,我其实已经明白他的意思了,然后说,按照您的描述,那就是类。然后他好像满意了,就下一题了。(那明明就是一个Class对象嘛,Class对象不也是对象)
    6、问:基本排序和查找相关的,问我有哪些排序和哪些查找算法,(期待让我写个快排什么的,早就憋在心里了,分分钟搞定的事, 然而并没有)他让我描述一下选择排序的过程,就扯了扯,然后他问,你确定这是选择排序吗?我说,我很确定。(强调了“很”字,说的很坚决,他也没说什么,希望别又在理解上面跟我有偏差,我说的那个绝对是纯正的选择排序,如假包换)。
    7、写代码,给我5分钟,让我实现一个Stack,底层数据结构用数组。我问他需要支持扩容吗,他说先不用。写完他拿过去一看,可能是我写的太丑了,他又还给我,让我解释一下代码,然后就解释了一下。
    8、问我用栈怎么实现队列,我说用2个栈来实现,他问我具体怎么操作,我说我可以想一下吗?他说可以,然后我想了一下,画个图给演示了一下。
    9、问我有没有登过网页版微信,问我用手机扫二维码登录是怎么实现的。不会
    10、问我知道阻塞队列吗,让我自己实现阻塞队列我会怎么做?我说我会用两种方法来实现,一种是用wait和notify的方式,一种是用Condition条件变量的方式,然后他问怎么用wait和notify实现,我就把思路说了一下。
    -----------------又想起来一些问题,补充一下---------------
    1、ArrayList和LinkedList相关的,问分别在什么情况下使用,以及查找一个元素的话这两个的时间复杂度分别是多少(如果是调用contains(Object o)方法的话复杂度都是O(n),如果是根据下标进行查找的话ArrayList的时间复杂度是O(1),LinkedList是O(n))。
    2、java 线程有哪些状态,这些状态之间是如何转化的。
    3、linux命令相关的。将当前目录下所有以“.txt”结尾的文件打印出来,再追问,除了“.txt”再加上“.abc”结尾的也打印出来。
    4、有两个线程A和B,如果一个线程要等另一个线程执行完,该怎么做。(我说在ThreadA中调用ThreadB.join()方法,二面面试官问我入参呢?我说我见过的join方法没有要传入参的啊,可能面试官记错了,他也没说什么。被这么一搞我又虚了,面试官怎么能质疑我呢,我好怕。后来我回来看了一下Thread类的源码,里面有三个join方法,分别是join(); join(long millis); join(long millis, int nanos),后面两个方法含义是一样的,只不过是精度不同,都是指等待一定时间,而不带参数的join方法里面直接调用的是join(0),即调用了带参的join方法,该方法如果参数是0的话就代表一直等待下去直到所等待的那个线程执行完,所以我推断面试官问我入参可能是想让我说入参为0,其实入参为0和没有参数含义是一样的。 )
    5、List接口和Set接口的区别,(说了2个区别,一直被二面面试官说“还有还有”,那种淡定的语气,我又开始慌了,心想果然是大神,不好糊弄啊)
    6、Spring相关的,问我要把一个组件注入到Spring中该怎么做?我说可以用配置文件和注解的方式,他问我有哪些注解,我说@Controller,@Service等等,他说我说的都是Spring MVC里面的。然后我就没说话,我也不知道面试官想让我说的是什么。又被质疑,又慌了。
    7、Cookie和Session的区别
    8、如何获取一个网站每天的访问用户数
    9、自己定义的类如何实现hashCode方法
    10、equals方法和hashCode方法相关的,问如果要向集合中添加自定义类的对象该怎么做?(在类中重写equals方法和hashCode方法)
    抱怨没有用,只能靠自己
  • 相关阅读:
    mysql服务设置远程连接 解决1251 client does not support ..问题
    Docker的简单使用
    Kick Start 2018
    Kick Start 2018
    Kick Start 2018
    LeetCode——三维形体的表面积
    面试金典——按摩师
    LeetCode——使数组唯一的最小增量
    LeetCode——单词接龙 II
    LeetCode——N皇后 II
  • 原文地址:https://www.cnblogs.com/mybatis/p/8691527.html
Copyright © 2011-2022 走看看