第一个问题:阿里面试都问什么?
并发、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年半不到
结语
从讨厌的人学他的优点,一棒子打死会让你失去很多学习成长的机会。