林萧谈如何进入BAT

前提:

1. 心态

心态上要静下心来看书,一点一点扣,切忌浮躁。

2. 欲望

欲望是前进的动力。

一。基本要求:必须会的,必考的

1. 语言基础

基础部分的重点:

1)关键字:statis, final, transient, volatile。

2)高阶语法:内部类、泛型。

具体解释:

1)static: static变量不会被GC回收,也就意味着有内存泄露的风险。— 融云的项目还会造成频繁的Full GC.

static会将所引用的属性、方法、内部类,与类直接产生引用关系,而不是与类的实例。为什么一个没有被static修饰的内部类,必须要这么声明:
OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
这是因为,没有用static修饰内部类InnerClass,所以必须new一个外部类OuterClass的实例,才能在此基础上new出新的内部类的实例。如果使用了static修饰内部类,那么就不用new OuterClass()了,而仅需要这样:
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

2) volatile:  可见性(主存和工作内存)、不能保证同步
其他待续。。。

2. Java运行时环境 — 其实就是考JVM

JVM与Hotspot的关系:JVM是规范,Hotspot是对规范的实现。

JVM三个部分必须非常清楚:内存划分、class加载机制、GC策略。

1)内存划分

我们常说的对于内存的划分,通常是指Hotspot的划分方式,而非JVM规范所规定的。
Hotspot将JVM内存划分为三个部分,Young Generation(年轻代)、Old Generation(年老代)、Perm Generation(永久代)。其中,Young Generation又分为Eden、From和To. 其中From和To又统称为Survivor Spaces(幸存区)。

对于内存的划分,可以没事用内存分析工具看看,如jmap, jvisualvm等等,观察下各个区域实际的变化。

2)classloader机制

关于classloader,可以结合tomcat,了解清楚tomcat和classloader机制,看看tomcat是如何保证各个APP之间的类的隔离的。
待续。。。

3)GC
http://www.cnblogs.com/zuoxiaolong/category/508918.html
待续。。。

3. 并发知识与Concurrent包

精通并发知识是进入一线互联网必备知识。

并发知识,有两个重要概念:可见性、原子性。
可见性与volatile息息相关。

之后就是Concurrent包了,这是一个宝藏,对于写并发程序非常有用。

1)ConcurrentHashMap与HashMap的区别,即ConcurrentHashMap的分段锁最常考。而且要理解二者的底层实现原理。

2)Concurrent包中非常重要的类: AbstractQueuedSynchronizer. 几乎所有的concurrent包中的并发工具类,都继承自它。

3)ReentrantLock和synchronized关键字的区别:synchornized是由JVM底层实现的互斥,因此效率会高些。而ReentrantLock功能比synchronized更多,比如定时获取某个锁,多个等待条件等。

并发部分是程序员进阶的关键部分。

4. 设计模式和反射

这部分是高阶程序员必须精通的部分。用好了这部分知识,可在实际开发中少写N多代码,而且程序的结构更好。

http://www.cnblogs.com/zuoxiaolong/category/509144.html。

关于发射,其实就是reflect包里的内容,Spring框架最常用,里面充斥着大量的设计模式和反射的真实使用场景,没事多研究下,会受益匪浅。

5. 文件IO、NIO、网络IO及网络协议

NIO关键是了解其原理,此外,要了解BIO、NIO、APR三者的区别。

网络IO部分,就是net包中的内容,如调用HTTP-API, 那么就需要使用里面的类,在restful-API泛滥的时代,少不了要使用HTTP协议调用API.
因此,在了解这部分的时候,网络协议也要适当的了解下,最典型的是TCP和HTTP协议,必须了解他们。比如TCP协议的重试机制,三次握手的过程。
至于HTTP协议,相对来说就简单很多了,应用层的协议主要是知道其协议格式即可,比如都支持哪些header、每个header都是什么含义等等。

上述内容,就是所谓的扎实的Java基础。

二。可选要求:这部分是决定公司要不要你的最关键指标

Spring、Mybatis框架

spring和mybatis的原理和源码,如果你非常精通的话,那么会成为你的巨大优势。这部分知识可以做很多架构上的优化,且可省去很多重复性的工作。

关于Spring框架,最核心的是IOC, 其实是AOP和MVC这两部分。要好好研究这三部分的源码。

关于Mybatis框架,主要关注它如何实现动态SQL.

研究透彻之后,你完全可以自己尝试去造轮子,会有意想不到的收获。

2. Linux服务器

对于java后端开发,如果精通Linux服务器,对于排查线上问题有很大的帮助。

一是要熟悉Linux的常用命令,二是最好了解Linux操作系统本身,包括文件系统、网络、IO等等。

3. 数据库优化

一个应用系统的性能瓶颈,通常在于DB, 所以要明白DB的优化

在SQL过慢时,如何通过索引、SQL分析和优化,将SQL的执行时间优化到一个可接收的范围内,这个过程如果精通,足以成为优势。

4. 消息服务

消息服务是当今互联网公司中必不可缺的一个组件。

常见的组件比如rabbitMQ, activeMQ等等,如果精通其原理的话,也会成为有力的竞争条件。

消息服务的重点,无非就是如何保证最终一致性、消息的有序、包括消息的事务等。

5. 缓存服务

常用的缓存有redis, memcached。 如果可以搞清其中一个,会为你加分不少。

对于缓存服务,常见的问题有,缓存满了怎么扩容,缓存的实时性如何处理,内存结构如何规划,分布式场景下如何处理增删节点时缓存的命中问题等等。

6. 负载均衡器

常见的负载均衡器就两种,一种是软负载均衡,如nginx, apache, lvs等;另一种是硬件负载均衡 ,如F5.

硬件负载均衡,主要用于简单的应用、并发量大的场景。
软件负载均衡,主要用户复杂的应用,并发量小的场景。
还有,硬件负载均衡一般非常贵,而软件负载均衡基本没有成本。

负载均衡器常见的问题有,如何保持会话、如何做流量控制、负载均衡算法有哪几种,如何坚持后端服务器的健康状态等等。

7. 总结:对于上述的6点,光知道答案并不足以体现优势,要有独到的见解及深刻的理解。

三。加分要求

所谓加分要求,其实也是基本要求,即是拿到Offer的关键。

1. 数据结构与算法

这块既是加分项,也是必须的项。必须要熟悉各种排序、各种常用算法,比如贪心、递归等等。

2. 计算机操作系统

这块是一些最基本的底层原理,如内存、指令、系统IO等等。
http://www.cnblogs.com/zuoxiaolong/category/518480.html

3. 计算机网络

要理解透彻TCP/IP协议,计算机网络知识必不可少。

4. 熟练使用一种脚本语言

脚本语言很多时候是很方便的,而且非常实用。虽然Java也可以实现类似的功能,但如果你可以熟练使用一种脚本语言,如Python或者shell,必定会成为你的加分项。

5. 你的github和博客

如果拥有自己的github和博客,而且里面有不少有价值的内容,会为你加分不少。

四。总结

大部分一线互联网,对于招人的技术要求就两个:扎实的Java基础和一个一技之长。





猜你喜欢

转载自doudou-001.iteye.com/blog/2335757
今日推荐