阿里面试回来(干货版)

作者: hedgehog1112 | 来源:发表于2018-01-24 16:30 被阅读130次

    第一个问题:阿里面试都问什么?

    并发、JVM、分布式、TCP/IP协议

    1)LinkedList,ArrayList,HashMap,TreeMap

    HashMap是不是有序的?不是

    有没有有顺序的Map实现类?有TreeMap和LinkedHashMap。

    TreeMap和LinkedHashMap是如何保证它的顺序的?哪个的有序实现比较好?还有没有比它更好或者更高效的实现方式?

    2)Java并发包当中的类,它们都有哪些作用,以及它们的实现原理,这些类就是java.concurrent包下面

    所有的线程一起等待某个事件的发生,当某个事件发生时,所有线程一起开始往下执行的话,有什么好的办法吗?

    这个时候你可能会说可以用栅栏(Java的并发包中的CyclicBarrier),那么面试官就会继续问你,你知道它的实现原理吗?

    你还知道其它的实现方式吗?

    哪个方式更好?

    还有比它更好的实现方式吗?

    3)IO包(可能略)和NIO包(重点)中的内容。

    熟悉NIO模型,selector职责和实现原理(非常清楚)。

    NIO的核心是IO线程池。

    IO包的设计模式(装饰器模式),为什么要这样设计?

    4)Java的虚拟机的内容。这部分主要包括三部分,GC、类加载机制,以及内存。

    什么时候一个对象会被GC?

    为什么要在这种时候对象才会被GC?

    GC策略都有哪些分类?分别都有什么优劣势?都适用于什么场景?

    举个实际的场景,选择一个GC策略?为什么要选择这个策略?

    Java类加载器都有哪些?

    每个类加载器都加载哪些类?

    这些类加载之间的父子关系是怎样的?

    什么是双亲委派模型?为什么Java类加载器要使用双亲委派模型?

    如何自定义自己的类加载器,它和Java自带的类加载器关系如何处理?

    内存

    内存分为哪几部分,分别都存储哪些数据?

    一个对象从创建到销毁,怎么在这些里存活和转移的?

    内存的哪些部分会参与GC的回收?

    Java的内存模型是怎么设计的?为什么要这么设计?

    结合内存模型的设计谈谈volatile关键字的作用?

    你在谈的时候,肯定会提到可见性,那么接着可见性这三个字,还可以继续问你并发的内容。

    2、讲述自己的项目,并在中间穿插着问题

    讲你做过的项目,为什么要这么做,挖掘出一个甚至N个亮点,让眼前一亮。

    程序员面经:面试前到底该不该刷题以及面试前该如何准备

    3、额外的加分项

    TCP/IP协议、算法

    1、计算机系统原理。

    2、网络通信协议(TCP/IP,HTTP等)。

    3、数据结构与算法。

    4、著名开源项目的源码。

    5、你自己有很棒的开源项目。

    6、你的个人博客。

    1-3项,如之前比较了解,临时抱佛脚。4-6项,需要日常的积累了。

    学习建议

    第一部分:未做过Java工作的同学。

    一、Java基础

    Java的基础http://www.runoob.com/java/java-tutorial.html。多动手

    二、Web开发

    HTML/CSS/JS(前端页面)、Servlet/JSP(J2EE)以及Mysql(数据库)相关的知识。

    三、开发框架

    SSM框架,即spring、springmvc、mybatis。快速搭建出一个Web框架,了解maven

    http://edu.51cto.com/lesson/id-76468.html

    不能停止学习。

    第二部分:对于参加工作1年到2年的同学。

    《Java编程思想》LZ花了整整三个月。看不止一遍,工作中实践。

    LZ看的是《大话设计模式》这本书,了如指掌,设计模式就是你博客的开端。

    http://www.cnblogs.com/zuoxiaolong/p/pattern26.html

    代码优化的书《重构 改善既有代码的设计》,《effective java》,写优雅的代码。

    第三部分:对于参加工作2年到3年的同学

    必看《深入理解Java虚拟机》。最重要,没有之一。高于《Java编程思想》。

    全面了解Java虚拟机,你一定已经知道Java是运行在JVM之上的。

    LZ写过JVM系列的知识http://www.cnblogs.com/zuoxiaolong/category/508918.html

    《Java并发编程实战》啃下来了,并发已经60-70%。

    框架/java底层/java类库(并发是Java并发包java.concurrent的内容、也就是JVM和JDK的相关内容)更深入的了解,看一些框架和JDK中的类的源码。

    源码能看懂的前提是,对设计模式非常了解。否则会有疑问,为什么要这么写、定义这个接口?看起来好像很多余?

    上面是最低要求。

    了解框架,看源码/看官方文档。

    造轮子。

    进行系统的锻炼,考察你的编码能力、框架设计能力,让轮子有好的扩展性、健壮性。

    遇到难题是学习契机。造好的时候,收获多。

    除JVM、JDK和框架源码以外,根据优秀源码,造个能够想象出的轮子。

    第四部分:参加工作3年到4年的同学

    比如大数据、分布式缓存、分布式消息服务、分布式计算、软负载均衡等等。精通任何一项,都是巨大的优势,不一定是工作用到的,但是相关的。

    切忌朝三暮四,了解强过大多数人才行,让自己有差异性,找一个方向深入研究下去。

    弥补你基础上的不足,基础是很枯燥无味的,深入必须掌握的。

    研究分布式计算,懂算法

    分布式缓存,了解计算机系统的内存

    大部分人的基础都很薄弱,比如算法、计算机系统原理、编译原理这些。

    《深入理解计算机系统》Java Web开发和APP后端

    《数据结构与算法》这本书,则比较适合做计算研究工作的人,比如刚才提到的分布式计算。

    《tcp/ip详解 卷一、二、三》比较适合做网络编程的人群,开发netty

    并不是其它两本对你就没有用。做Java Web《tcp/ip详解 卷一、二、三》作用也是很大。分出个主次关系而已,一年一本精读下来,就已经非常厉害

    第五部分:参加工作4年到5年的同学

    提高你的影响力了,Github创建开源项目,造出来真正对别人有价值的轮子。

    技术很容易遇到瓶颈,达到一定程度后,再深入收效就真的微乎其微。

    好的项目就可以成就一群程序猿。

    像支付宝项目,如果是核心开发,光Title,就已是非常大的优势。做的时候历练也给力,后面的五年有着落了。

    在分布式计算领域有一定的影响力,那么如果有分布式计算的项目,面试的时候,影响力超过技术能力。

    LZ做程序猿4年半不到

    结语

    从讨厌的人学他的优点,一棒子打死会让你失去很多学习成长的机会。

    原文:https://www.jianshu.com/p/11b4d630a265

    相关文章

      网友评论

        本文标题:阿里面试回来(干货版)

        本文链接:https://www.haomeiwen.com/subject/zxfrnxtx.html