zoukankan      html  css  js  c++  java
  • 阿里面试1

    一面:整整70分钟!(说好的45分钟呢?人和人之间这点信任都没有了吗?)


    1、问:你把java内存模型的架构给我画一下吧?
    我: 迟疑了一下,心想,JMM这玩意儿有架构图吗?这可怎么画。面试官看我迟疑,说,那你不画,先说一说吧,我就跟他说了由于什么指令重排序,处理器缓存什么的,不同的系统或者平台有不同的内存模型,使得相同的java程序在不同的处理器架构下的表现不一致啊,java内存模型就是为了在不同的处理器架构和平台下给java程序员提供一致性内存访问的保证的。本以为后面要问到volatile的内存语义,内存屏障,happens-before之类的,没想到面试官来了一句:你完全说错了,你说的这个是java的跨平台特性,不是内存模型,然后说内存模型是什么什么堆、栈之类的。 于是我就懵了,我就想到了原来面试官理解的内存模型就是我理解的java运行时数据区域(程序计数器,虚拟机栈,本地方法栈、java堆,方法区)。我也不敢跟面试官多争论,简单地表达了一下我的观点,然后他就接着问我,那你说说java是如何实现跨平台的。

    那么,跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM)。JVM也是一个软件,不同的平台有不同的版本。我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件。
    Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。而这个过程中,我们编写的Java程序没有做任何改变,
    仅仅是通过JVM这一”中间层“,就能在不同平台上运行,真正实现了”一次编译,到处运行“的目的。JVM是一个”桥梁“,是一个”中间件“,是实现跨平台的关键,Java代码首先被编译成字节码文件,再由JVM将字节码文件翻译成机器语言,
    从而达到运行Java程序的目的。注意:编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样。所以,
    运行Java程序必须有JVM的支持,因为编译的结果不是机器码,必须要经过JVM的再次翻译才能执行。即使你将Java程序打包成可执行文件(例如 .exe),仍然需要JVM的支持。

      


    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方法)

  • 相关阅读:
    [Git]08 如何自动补全命令
    [Git]06 如何提交空目录
    [Git]05 如何使用分支
    [Git]04 如何使用标签
    [Git]03 如何查看提交历史
    29、前端知识点--sessioncookie oken
    28、前端知识点--跨域问题
    26、前端知识点--利用webpack搭建脚手架一套完整流程
    25、前端知识点--webpack篇之面试考点
    24、前端知识点--数组的合并
  • 原文地址:https://www.cnblogs.com/UncleWang001/p/12916671.html
Copyright © 2011-2022 走看看