赣州网上注册公司网站,WordPress仿站培训,wordpress 迅影网,做企业网站的公司有哪些作者#xff1a;晓风轻链接#xff1a;zhuanlan.zhihu.com/p/28615617近日里#xff0c;很多人邀请我回答各种j2ee开发的初级问题#xff0c;我无一都强调java初学者要先扎实自己的基础知识#xff0c;那什么才是java的基础知识#xff1f;又怎么样才算掌握了java的基础知… 作者晓风轻链接zhuanlan.zhihu.com/p/28615617近日里很多人邀请我回答各种j2ee开发的初级问题我无一都强调java初学者要先扎实自己的基础知识那什么才是java的基础知识又怎么样才算掌握了java的基础知识呢这个问题还真值得仔细思考。我做j2ee开发已经超过十载作为过来人心路历程估计和大家差不多。编码的前几年很长一段时间觉得java简单开发实现各种功能都很轻松代码写起来根本不费劲(主要是因为写的代码都是一些功能业务逻辑)。但同时自己心里明白自己其实没有什么水平自己这3,4年以来学懂的东西就那么多其他人几个月就可以学会自己的竞争力在哪里这种矛盾的心理困扰了我非常长的时间非常的苦恼总有一种报国无门无处发力的感觉。这个时期热衷了使用各种框架各种api常以今天学习了某个api组件框架的使用就觉得自己学到了东西设计模式也看过不止一次但都没有啥感觉。一方面很努力学习一方面又觉得不踏实因为例如这个api我知道而你不知道但我告诉你之后你就知道了那我比你的优势在哪里呢苦恼*2过了很长一段这种惶惶不可终日的日子决定自己要改变改变的方向就是阅读自己用到的java相关的源代码看看jdk是如何实现的。就从基本的数据结构看然后看多线程相关在学习前台等等。写的代码还是那些代码代码还是那么简单但我力求做到知道代码背后的真相这就是我最开始努力的方向。于是不再把时间都花在追求各种新框架、新API的使用上每天都花时间在看实现原理上。就这样过了大半年左右终于不再迷茫不会在觉得自己只懂api的使用觉得自己没有那么肤浅了说脱胎换骨也不为过。那段时间是我成长最快的时期也是最充实的一段时光。 Talk is cheapshow me the code 举例说明大家会比较有感觉。如学习了hashmap的源代码知道了工作原理之后使用hashmapMapString map new HashMap();代码还是那个代码但我已经知道了hashmap背后的东西1. 数据结构是链表的数组(注后面的版本为了提升性能已经是改成链表或者树(节点较多)了)2. 思想上是空间换时间的算法3. 构造函数上有容量和负载因子2个参数以及作用4. 决定性能的是key的hashcode是否够快、结果够分散(不分散就会变成链表的性能了)和扩容的开销(什么时候扩容和负载因子有关)然后写代码的时候如果知道了最终的容量(尤其是数据量大的时候)我都会指定初始化容量类似如下Listlist doSomeThing();Mapmap new HashMap((int)(list.size()/0.75));//0.75为默认负载因子如果工作中某个map使用特别多性能还需要继续优化我就会考虑从以下方面优化1. 如果key是自己定义的对象那么hashcode方法是否够快(最少应该缓存保证只计算一次而且放入之后不能改变决定hashcode的字段不能改变)hash的结果是否够分散2. 可以考虑调小负载因子花更多的空间来换时间学习源代码的时候特别有意思你会强烈感觉到一个词举一反三触类旁通学习api使用的时候如果你只知道使用不知道原理很难举一反三感觉的是死记硬背。但学习了原理之后知识成体系后很容易举一反三学的越多就容易还是以hashmap为例我举一个hashmap反三个点。1. 你会知道但凡有数组的数据结构构造函数都有一个容量的初始化参数(或者说构造函数有初始化容量的可能都是数组的数据结构)。构造函数如下public ArrayList(int initialCapacity) //LinkedList不是数组就没有public HashMap(int initialCapacity) public StringBuffer(int capacity)你就会知道数组扩容很耗性能(数据量大容易oom)尽量指定容量。2. 算法是空间换时间还有没有其他算法是这种思想的你最少能找到一个桶排序。3. 数据库的分库分表思路和hashmap大同小异4. 各种分布式的hash一致性算法第一步都是创建一个最大的数组(Integer.MAX_VALUE),就是避免了hashmap最耗性能的扩容运算。学习了hashmap之后你很自然就会去了解其他的map如TreeMapLinkedHashmap(超级有用)HashTableConcurrentSkipListMap(算法思路很有意思)ConcurrentHashMap等你会知道set就是用map做的都不需要学。到了这步map相关就可以暂告一段落。在学习中我发现思想上的东西是最重要的你理解了思想一下子就豁然开朗了在也不需要死记硬背了。如学习CAS的时候大家都知道这是一种指令级的免锁实现。看代码的时候我一度疑惑为什么会有个while死循环(原谅我天资驽钝)public final int getAndUpdate(IntUnaryOperator updateFunction) {int prev, next;do { prev get(); next updateFunction.applyAsInt(prev); } while (!compareAndSet(prev, next));return prev; }后来从思想上理解才知道乐观锁的概念就是很乐观假设你不会出错但你要是出错了我就重试有办法给你修复对应的就是悲观锁就是很悲观觉得不锁就会出错如synchronize关键字和reentrantlock。这体现了2种不同截然不同的管理思想。这种思想经常体现在多个系统集成的设计有些时候如果你用悲观的思想设计实现起来很麻烦或者无法实现但如果你用乐观的思想减少出错条件然后出错了能解决代价就会小很多。说了这么多我想说的就是j2ee的基础知识就是你做项目中代码背后的东西。提高自己水平的方法很简单就是把大部分时间去了解实现原理了解思想让自己的知识串起来形成体系。j2ee的知识特别多学得人想哭千万不要一开始把时间花在各种框架、组件的使用上在我看来那是本末倒置。简单来说先修内功再练招式。我觉得重要的、工作会用得到的知识就是一个请求从前台到后台处理的过程需要用到的东西最少包括以下点jshtmlcssajaxajax跨域跨站脚本web缓存web优化nginxapache作用鉴权方式cookiesessionservletfilter基本数据结构线程池线程并发缓存io等等知识点非常多。如你前台用jq你应该了解他的选择器和ajax是如何实现的(其实去了解就会发现不复杂)而不是只是会用。后台你用springmvc你要了解他是如何工作每一个配置是做什么为什么j2ee知识点特别多每一个都能写很多我也在不断学习中。具体要写我还真不知道如何下手我就列举一下我觉得基础的东西(面试的时候问的问题)有简单有难你觉得偏可能是你没有做过这块的开发或者做得比较浅1. map有哪些特点和使用场景(只知道hashmaphashtable是不够的。)2. 哪些方面会影响hashmap的性能3. 线程安全的map有哪些concurrenthashmap是如何实现线程安全的(jdk1.8大不同)4. 锁有哪几种5. 公平锁读写锁等如何实现6. synchronize能加在哪些地方什么区别7. 死锁的形成条件现在很少死锁了很少问8. 原子数据对象的原理9. reentrantlock相关知识condition如何使用(很重要的知识点强烈推荐阅读ArrayBlockingQueue源码教科书般)10. volatile的相关知识(内存屏障重排)11. ThreadLocal原理和使用(超级有用的知识点工作中使用很多让代码漂亮很多后面专门开贴写)12. 多个线程同步等待(CountDownLatchCyclicBarrierSemaphore信号量很多语言都有实际上使用不是很多线程池就可以实现大部分等待功能)13. 线程池(种类重要的方法这个一般是使用层面简单)14. 动态代理反射内省(考察知识面)15. session相关知识和cookie关系分布式session实现原理16 cookie相关知识有哪些属性(有些属性很有用只是我们很少留意而已)17. nginxapache 实际项目能做哪些(鉴权转发缓存反向代理等)和tomcat什么关系最少了解18 ajax跨域原因解决方式(重点知识做SE避免不了的问题。这里很多知识点。)19 jsonp原理后台需要改动吗(jsonp虽然现在落伍了但还是会问问)20. web优化知识点(常规知识点)21. 前台缓存相关(200cache,304ajax缓存如何实现缓存)一列举就根本停不下来了。。。其他的spring框架的东西也很多还有jvm的东西系统集成相关数据库相关io做得很少也不懂问后面再慢慢把我的学习过程和偶得写下来。很多东西我也是了解个大概就是看看你有没有学习过不断学习是程序员最重要的特征。我不算高手只能算一个合格的老程序员。这里只是说了一下自己之前学习的方向和列举了几个学习中的例子大家见仁见智。帖子也是针对迷茫的初学者有感而发希望能帮助到大家。最后我总结一下初学者先广在精关注代码背后的实现关注内功修炼了解实现原理和思想形成自己完整的技术体系知识成片之后就容易触类旁通进步的速度就会越来越快。最后以我在每一个项目组和开发人员聊天都会说的几个例子结尾“少林功夫里面有功和拳之分马步功石锁功是功蛇拳猴拳是拳你不可能练会了蛇拳猴拳就能打人你必须先重点练功。乔峰在聚贤庄用太祖长拳把大家打得落花流水我们用太祖长拳就只是个广播体操。同样我们要分清编程里面那些是功那些是拳代码背后的实现和思想是功各个框架、api使用是拳。初学者应该大部分时间花在练功上功到了拳自然就有了切勿本末倒置。”谢谢大家阅读开了一个专栏记录作者的学习之路和编程习惯每周最少一更欢迎关注本文作者的专栏https://zhuanlan.zhihu.com/c_120823325本文作者晓风轻知乎链接https://zhuanlan.zhihu.com/c_120823325。-END-推荐阅读1. Spring 中运用的 9 种设计模式吗 2. Java 中的继承和多态(深入版)3. 如何降低程序员的工资4. 编写 Spring MVC 的 14 个小技巧喜欢文章点个在看