如何学好java
今天发现这么一篇文章,对于笔者谈的:"一方面很努力学习,一方面又觉得不踏实",我感同身受.觉得文章写得不错,在此献给一些在java中努力的朋友们,希望能有所收获.
文章原内容:
近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考。
我做j2ee开发已经超过十载,作为过来人,心路历程估计和大家差不多。编码的前几年,很长一段时间觉得java简单,开发实现各种功能都很轻松,代码写起来根本不费劲(主要是因为写的代码都是一些功能业务逻辑)。但同时自己心里明白,自己其实没有什么水平,自己这3、4年以来学懂的东西就那么多,其他人几个月就可以学会,自己的竞争力在哪里?这种矛盾的心理,困扰了我非常长的时间,非常的苦恼!总有一种报国无门无处发力的感觉。
这个时期,热衷了使用各种框架,各种api,常以今天学习了某个api,组件,框架的使用就觉得自己学到了东西,设计模式也看过不止一次,但都没有啥感觉。一方面很努力学习,一方面又觉得不踏实,因为例如这个api我知道而你不知道,但我告诉你之后你就知道了,那我比你的优势在哪里呢?苦恼*2
过了很长一段这种惶惶不可终日的日子,决定自己要改变,改变的方向就是阅读自己用到的java相关的源代码,看看jdk是如何实现的。就从基本的数据结构看,然后看多线程相关,在学习前台等等。写的代码还是那些代码,代码还是那么简单,但我力求做到知道代码背后的真相,这就是我最开始努力的方向。于是不再把时间都花在追求各种新框架、新API的使用上,每天都花时间在看实现原理上。就这样过了大半年左右,终于不再迷茫,不会在觉得自己只懂api的使用,觉得自己没有那么肤浅了,说脱胎换骨也不为过。那段时间,是我成长最快的时期,也是最充实的一段时光。
Talk is cheap,show me the code。举例说明大家会比较有感觉。
如学习了hashmap的源代码知道了工作原理之后,使用hashmap
代码还是那个代码,但我已经知道了hashmap背后的东西
数据结构是链表的数组(注:后面的版本为了提升性能,已经是改成链表或者树(节点较多)了)
思想上是空间换时间的算法
构造函数上有容量和负载因子2个参数以及作用
决定性能的是key的hashcode是否够快、结果够分散(不分散就会变成链表的性能了),和扩容的开销(什么时候扩容,和负载因子有关)
然后写代码的时候,如果知道了最终的容量(尤其是数据量大的时候),我都会指定初始化容量,类似如下
如果工作中某个map使用特别多,性能还需要继续优化,我就会考虑从以下方面优化
如果key是自己定义的对象,那么hashcode方法是否够快(最少应该缓存保证只计算一次,而且放入之后不能改变,决定hashcode的字段不能改变)? hash的结果是否够分散?
可以考虑调小负载因子,花更多的空间来换时间
学习源代码的时候,特别有意思,你会强烈感觉到一个词:举一反三!触类旁通! 学习api使用的时候,如果你只知道使用不知道原理,很难举一反三,感觉的是死记硬背。但学习了原理之后,知识成体系后,很容易举一反三,学的越多就容易,还是以hashmap为例,我举一个hashmap反三个点。
1、你会知道但凡有数组的数据结构,构造函数都有一个容量的初始化参数(或者说构造函数有初始化容量的可能都是数组的数据结构)。构造函数如下
你就会知道,数组扩容很耗性能(数据量大容易oom),尽量指定容量。
2、算法是空间换时间,还有没有其他算法是这种思想的?你最少能找到一个桶排序。
3、数据库的分库分表,思路和hashmap大同小异
4、各种分布式的hash一致性算法,第一步都是创建一个最大的数组(Integer.MAX_VALUE),就是避免了hashmap最耗性能的扩容运算。
学习了hashmap之后,你很自然就会去了解其他的map,如TreeMap,LinkedHashmap(超级有用),HashTable,ConcurrentSkipListMap(算法思路很有意思),ConcurrentHashMap等,你会知道set就是用map做的,都不需要学。到了这步,map相关就可以暂告一段落。
在学习中,我发现思想上的东西是最重要的,你理解了思想,一下子就豁然开朗了,在也不需要死记硬背了。如学习CAS的时候,大家都知道这是一种指令级的免锁实现。看代码的时候,我一度疑惑为什么会有个while死循环(原谅我天资驽钝)
后来从思想上理解,才知道乐观锁的概念,就是很乐观,假设你不会出错,但你要是出错了我就重试有办法给你修复,对应的就是悲观锁,就是很悲观,觉得不锁就会出错,如synchronize关键字和reentrantlock。这体现了2种不同截然不同的管理思想。这种思想经常体现在多个系统集成的设计,有些时候如果你用悲观的思想设计,实现起来很麻烦或者无法实现,但如果你用乐观的思想,减少出错条件,然后出错了能解决,代价就会小很多。
说了这么多,我想说的就是,j2ee的基础知识就是你做项目中代码背后的东西。提高自己水平的方法很简单,就是把大部分时间去了解实现原理,了解思想,让自己的知识串起来,形成体系。j2ee的知识特别多,学得人想哭,千万不要一开始把时间花在各种框架、组件的使用上,在我看来那是本末倒置。简单来说:先修内功再练招式。
我觉得重要的、工作会用得到的知识就是一个请求从前台到后台处理的过程需要用到的东西,最少包括以下点:js,html,css,ajax,ajax跨域,跨站脚本,web缓存,web优化,nginx,apache作用,鉴权方式,cookie,session,servlet,filter,基本数据结构,线程池,线程并发,缓存,io等等,知识点非常多。如你前台用jq,你应该了解他的选择器和ajax是如何实现的(其实去了解就会发现不复杂)?而不是只是会用。后台你用springmvc,你要了解他是如何工作,每一个配置是做什么,为什么?
j2ee知识点特别多,每一个都能写很多,我也在不断学习中。具体要写我还真不知道如何下手,我就列举一下我觉得基础的东西(面试的时候问的问题),有简单有难,你觉得偏可能是你没有做过这块的开发或者做得比较浅:
map有哪些,特点和使用场景?(只知道hashmap,hashtable是不够的。。。)
哪些方面会影响hashmap的性能?
线程安全的map有哪些,concurrenthashmap是如何实现线程安全的(jdk1.8大不同)?
锁有哪几种?
公平锁,读写锁等如何实现?
synchronize能加在哪些地方?什么区别?
死锁的形成条件?现在很少死锁了,很少问
原子数据对象的原理?
reentrantlock相关知识,condition如何使用?(很重要的知识点,强烈推荐阅读ArrayBlockingQueue源码,教科书般)
volatile的相关知识(内存屏障,重排)
ThreadLocal原理和使用?(超级有用的知识点,工作中使用很多,让代码漂亮很多,后面专门开贴写)
多个线程同步等待?(CountDownLatch,CyclicBarrier,Semaphore信号量很多语言都有,实际上使用不是很多,线程池就可以实现大部分等待功能)
线程池?(种类,重要的方法,这个一般是使用层面,简单)
动态代理?反射?内省?(考察知识面)
session相关知识?和cookie关系?分布式session实现原理?
cookie相关知识?有哪些属性?(有些属性很有用,只是我们很少留意而已!)
nginx,apache 实际项目能做哪些?(鉴权,转发,缓存,反向代理等)和tomcat什么关系?最少了解
ajax跨域原因?解决方式?(重点知识,做SE避免不了的问题。这里很多知识点。)
jsonp原理?后台需要改动吗?(jsonp虽然现在落伍了,但还是会问问)
web优化知识点?(常规知识点)
前台缓存相关?(200cache,304,ajax缓存,如何实现缓存)
一列举就根本停不下来了。。。其他的spring框架的东西也很多,还有jvm的东西,系统集成相关,数据库相关,io做得很少也不懂问,后面再慢慢把我的学习过程和偶得写下来。很多东西我也是了解个大概,就是看看你有没有学习过,不断学习是程序员最重要的特征。
我不算高手,只能算一个合格的老程序员。这里只是说了一下自己之前学习的方向和列举了几个学习中的例子,大家见仁见智。帖子也是针对迷茫的初学者有感而发,希望能帮助到大家。
最后我总结一下:初学者先广在精,关注代码背后的实现,关注内功修炼,了解实现原理和思想,形成自己完整的技术体系,知识成片之后就容易触类旁通,进步的速度就会越来越快。
最后以我在每一个项目组和开发人员聊天都会说的几个例子结尾:“少林功夫里面有功和拳之分,马步功,石锁功是功,蛇拳猴拳是拳,你不可能练会了蛇拳猴拳就能打人,你必须先重点练功。乔峰在聚贤庄用太祖长拳把大家打得落花流水,我们用太祖长拳就只是个广播体操。同样,我们要分清编程里面那些是功那些是拳,代码背后的实现和思想是功,各个框架、api使用是拳。初学者应该大部分时间花在练功上,功到了拳自然就有了,切勿本末倒置。”谢谢大家阅读!
这是文章链接:https://mp.weixin.qq.com/s/IU_xCCGSRbEQQLkpqpaB3A
谢谢作者的分享。
如何学好java的更多相关文章
- 怎样才能自学好Java?
经常有初学Java的同学问:怎么样才能学好Java?自学Java难吗? 我认为自学Java并不难.相对于其他语言来说,因为Java95年才出来,所以相对比较新,旧的语言中一些不合适的东西在Java里面 ...
- 如何学好JAVA编程
我的思路: 1.我觉得先学学JSP,用纯JSP做个日记本简单的小系统,纯粹从语言层面上了解一些基 础知识,把tomcat玩熟了,就用记事本编就行,主要是熟悉,能够理解jsp运行机制.然 ...
- 我们如何学好java
转载:http://www.zhihu.com/question/19945685 马士兵有一篇文章,我觉得写得很好,原文转载如下,希望题主可以好好读读. ---------------------- ...
- 零基础6个月学好java月薪1w+看看他是怎么学好java的
21世纪进入信息时代,信息科技给人类的生产和生活方式带来了深刻的变革,信息产业已成为推动国家经济发展的主导产业之一,Java作为含金量极高的一门IT技术,很多人希望从事这个行业,那么想学好Java,要 ...
- 要学好JAVA要注意些什么?
从自学开始到参加系统的学习JAVA已经差不多有1个月了的时间了,在这段时间以前我也和很多人一样在网上盲目的搜罗一些视频来自己啃,随着时间的积累,对JAVA的认识也有了一定的提升,之前可能因为在IT咨询 ...
- Java小白如何一步步学好Java,听听企业Java培训师的实践经验吧
今天我准备给小主展示一篇Java培训老师的文章,希望能给Java小白一个学好Java的路径或者提示.以下就是原文: 从大学到现在,我使用Java已经将近20年,日常也带实习生,还在公司内部做train ...
- 如何学好Java大数据并快速提升
Java作为一种最流行的,最热门的编程语言,可以说它无处不在,目前全球有着数十亿的设备正在运行着Java,很多服务器程序都是用Java编写,用以处理每天超过数以千万的数据.无论是手机软件.手机Java ...
- 0基础小白怎么学好Java?
自身零基础,我们应该先学好Java,小编给大家介绍一下Java的特性: Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java.Java丢弃了C+ ...
- Java教程到处都是,究竟怎样能学好Java?
学习Java如何入门?学习教程要点是什么?如何精通?做好以下这些点,入门更快,掌握Java更轻松. Java必备基础知识 1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EE ...
- 学好java,做好工程师必读的15本书
学好java,做好工程师必读的15本书 一.Java编程入门类 对于没有Java编程经验的程序员要入门,随便读什么入门书籍都一样,这个阶段需要你快速的掌握Java基础语法和基本用法,宗旨就是“囫囵 ...
随机推荐
- HTML 练习显示隐藏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CesiumJS 添加会动的GIF
由于Cesium使用canvas渲染,如果使用billboard等加载gif图片只能渲染第一帧,导致动图不动.在Cesium的官方示例中找到一段代码可将HTML元素渲染到地图上,将gif以html元素 ...
- 如何给Windows2016新建IIS并建立网站
首先在菜单按钮旁右击-----点击Control Panel(控制面板) 点击Turn Windows features on or off 开始设置环境!!!!! 认真勾选参数!!! 然后点击安装! ...
- Java对象引用/JVM分级引用——强引用、软引用、弱引用、虚引用
无论是通过引用计数法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判断对象是否存活都与“引用”有关, 相关资料:如何判断对象是否存活/死去 那么引用究竟是什么?让我们一起来看一下 ...
- scrapy-redis 分布式爬虫
为什么要学? Scrapy_redis在scrapy的基础上实现了更多,更强大的功能. 有哪些功能体现? request去重.爬虫持久化.实现分布式爬虫.断点续爬(带爬取的request存在redis ...
- mpvue小程序开发之 iconfont图标引入
背景: mpvue进行小程序项目开发时候,会有很多图标需求,但是小程序官方提供的icon图标库实在有限而且也不利于调样式,所有想到和之前前端项目一样引入iconfont. 图标加入购物车及项目 下载到 ...
- PHP全栈学习笔记6
php能做什么,它是运行在服务器端的,web网站大部分数据都是存储在服务器上的,PHP就是用来处理这些存储在服务器的数据.跨平台,服务器可以是多种平台上的服务器,脚本语言,免费. wampserver ...
- Android GL deadlock timeout error
Android GL deadlock timeout error CRASH 在 PBR&IBL 的开发过程中,在 Linux 验证程序运行正常后,移植到 Android 平台,发现程序 c ...
- 读Cassandra源码之并发
java 并发与线程池 java并发包使用Executor框架来进行线程的管理,Executor将任务的提交与执行过程分开,直接使用Runnable表示任务.future获取返回值.ExecutorS ...
- ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1
一.前言 最近一两个星期,加班,然后回去后弄自己的博客,把自己的电脑从 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本计划的学习 Vue 中生命周期的相关知 ...