近日里,不少人邀请我回答各类j2ee开发的初级问题,我无一都强调java初学者要先扎实本身的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考。
我作j2ee开发已经超过十载,做为过来人,心路历程估计和你们差很少。编码的前几年,很长一段时间以为java简单,开发实现各类功能都很轻松,代码写起来根本不费劲(主要是由于写的代码都是一些功能业务逻辑)。但同时本身内心明白,本身其实没有什么水平,本身这3,4年以来学懂的东西就那么多,其余人几个月就能够学会,本身的竞争力在哪里?这种矛盾的心理,困扰了我很是长的时间,很是的苦恼!总有一种报国无门无处发力的感受。
这个时期,热衷了使用各类框架,各类api,常以今天学习了某个api,组件,框架的使用就以为本身学到了东西,设计模式也看过不止一次,但都没有啥感受。一方面很努力学习,一方面又以为不踏实,由于例如这个api我知道而你不知道,但我告诉你以后你就知道了,那我比你的优点在哪里呢?苦恼*2
过了很长一段这种惶惶不可终日的日子,决定本身要改变,改变的方向就是阅读本身用到的java相关的源代码,看看jdk是如何实现的。就从基本的数据结构看,而后看多线程相关,在学习前台等等。写的代码仍是那些代码,代码仍是那么简单,但我力求作到知道代码背后的真相,这就是我最开始努力的方向。因而再也不把时间都花在追求各类新框架、新API的使用上,天天都花时间在看实现原理上。就这样过了大半年左右,终于再也不迷茫,不会在以为本身只懂api的使用,以为本身没有那么肤浅了,说脱胎换骨也不为过。那段时间,是我成长最快的时期,也是最充实的一段时光。css
Talk is cheap,show me the code。举例说明你们会比较有感受。
如学习了hashmap的源代码知道了工做原理以后,使用hashmap
Map map = new HashMap<>();
代码仍是那个代码,但我已经知道了hashmap背后的东西
1.数据结构是链表的数组(注:后面的版本为了提高性能,已是改为链表或者树(节点较多)了)
2.思想上是空间换时间的算法
3.构造函数上有容量和负载因子2个参数以及做用
4.决定性能的是key的hashcode是否够快、结果够分散(不分散就会变成链表的性能了),和扩容的开销(何时扩容,和负载因子有关)
而后写代码的时候,若是知道了最终的容量(尤为是数据量大的时候),我都会指定初始化容量,相似以下
List list = doSomeThing();
Map map = new HashMap<>((int)(list.size()/0.75));//0.75为默认负载因子
若是工做中某个map使用特别多,性能还须要继续优化,我就会考虑从如下方面优化
1.若是key是本身定义的对象,那么hashcode方法是否够快(最少应该缓存保证只计算一次,并且放入以后不能改变,决定hashcode的字段不能改变)? hash的结果是否够分散?
2.能够考虑调小负载因子,花更多的空间来换时间
学习源代码的时候,特别有意思,你会强烈感受到一个词:触类旁通!举一反三!学习api使用的时候,若是你只知道使用不知道原理,很难触类旁通,感受的是死记硬背。但学习了原理以后,知识成体系后,很容易触类旁通,学的越多就容易,仍是以hashmap为例,我举一个hashmap反三个点。html
int prev, next;
do {
prev = get();
next = updateFunction.applyAsInt(prev);
} while (!compareAndSet(prev, next));
return prev;复制代码
}我以为重要的、工做会用获得的知识就是一个请求从前台到后台处理的过程须要用到的东西,最少包括如下点:js,html,css,ajax,ajax跨域,跨站脚本,web缓存,web优化,nginx,apache做用,鉴权方式,cookie,session,servlet,filter,基本数据结构,线程池,线程并发,缓存,io等等,知识点很是多。如你前台用jq,你应该了解他的选择器和ajax是如何实现的(其实去了解就会发现不复杂)?而不是只是会用。后台你用springmvc,你要了解他是如何工做,每个配置是作什么,为何?java
j2ee知识点特别多,每个都能写不少,我也在不断学习中。具体要写我还真不知道如何下手,我就列举一下我以为基础的东西(面试的时候问的问题),有简单有难,你以为偏多是你没有作过这块的开发或者作得比较浅:
1.map有哪些,特色和使用场景?(只知道hashmap,hashtable是不够的。。。)
2.哪些方面会影响hashmap的性能?
3.线程安全的map有哪些,concurrenthashmap是如何实现线程安全的(jdk1.8大不一样)?
4.锁有哪几种?
5.公平锁,读写锁等如何实现?
6.synchronize能加在哪些地方?什么区别?
7.死锁的造成条件?如今不多死锁了,不多问
8.原子数据对象的原理?
9.reentrantlock相关知识,condition如何使用?(很重要的知识点,强烈推荐阅读ArrayBlockingQueue源码,教科书般)
10.volatile的相关知识(内存屏障,重排)
11.ThreadLocal原理和使用?(超级有用的知识点,工做中使用不少,让代码漂亮不少,后面专门开贴写)
12.多个线程同步等待?(CountDownLatch,CyclicBarrier,Semaphore信号量不少语言都有,实际上使用不是不少,线程池就能够实现大部分等待功能)
13.线程池?(种类,重要的方法,这个通常是使用层面,简单)
14.动态代理?反射?内省?(考察知识面)
15.session相关知识?和cookie关系?分布式session实现原理?
16.cookie相关知识?有哪些属性?(有些属性颇有用,只是咱们不多留意而已!)
17.nginx,apache 实际项目能作哪些?(鉴权,转发,缓存,反向代理等)和tomcat什么关系?最少了解
18.ajax跨域缘由?解决方式?(重点知识,作SE避免不了的问题。这里不少知识点。)
19.jsonp原理?后台须要改动吗?(jsonp虽然如今落伍了,但仍是会问问)
20.web优化知识点?(常规知识点)
21.前台缓存相关?(200cache,304,ajax缓存,如何实现缓存)
一列举就根本停不下来了。。。其余的spring框架的东西也不少,还有jvm的东西,系统集成相关,数据库相关,io作得不多也不懂问,后面再慢慢把个人学习过程和偶得写下来。不少东西我也是了解个大概,就是看看你有没有学习过,不断学习是程序员最重要的特征。
我不算高手,只能算一个合格的老程序员。这里只是说了一下本身以前学习的方向和列举了几个学习中的例子,你们见仁见智。帖子也是针对迷茫的初学者有感而发,但愿能帮助到你们。
最后我总结一下:初学者先广再精,关注代码背后的实现,关注内功修炼,了解实现原理和思想,造成本身完整的技术体系,知识成片以后就容易举一反三,进步的速度就会愈来愈快。最后以我在每个项目组和开发人员聊天都会说的几个例子结尾:“少林功夫里面有功和拳之分,马步功,石锁功是功,蛇拳猴拳是拳,你不可能练会了蛇拳猴拳就能打人,你必须先重点练功。乔峰在聚贤庄用太祖长拳把你们打得落花流水,咱们用太祖长拳就只是个广播体操。想要朝这方面发展或者真心有兴趣的。能够找我要一些基础的学习视频,Q号码:3300863615,这个是免费的,但愿同窗找我要的时候不要有理所应当的态度,毕竟都是个人心血,但愿你是真的有一颗想要学好java的心,我也会尽所能的去帮助你成为一名优秀的程序员。一样,咱们要分清编程里面那些是功那些是拳,代码背后的实现和思想是功,各个框架、api使用是拳。初学者应该大部分时间花在练功上,功到了拳天然就有了,切勿本末倒置。”谢谢你们阅读!
做者:晓风轻nginx