———————————10.4更新———————————
有评论指出下面说的不是Java的开始学习路线。其实也对,当时在大学是先学了一遍《Java程序设计》,其实也是停留在只懂写 private,类,对象这些,很浅。而后网上认识了个网易的老师傅,就带入门了,就开始看一些Java内存结构什么的,就是以下的这些内容,而后后来就本身分类了学。但愿对你们有帮助(固然,有些可能我的能力问题说得不对,但愿你们能够帮忙指出,谢谢)。
———————————8.25更新———————————
补充些网站(Ps:没有利益相关,只是以为他们写得真蛮好):
- 并发编程网
- 金丝燕网 - 一个严谨的网站!
- 沈玮 | Wei SHEN
- Java并发编程 (海子的博客园)
———————————如下原文———————————
能够参考从这几方面来看Java:
JVM
多线程
记忆方法:产生的缘由(内存模型)--> 解决的办法(synchronized,Lock,Condition,volatile,ThreadLoad,AtomicInteger,CAS)--> 优化(生产者消费者模式(从源头分析),Condition)
集合
记忆方法:Collection系列(当你分析他们的原理 ArrayList,LinkedList,Vector 做为一类记比较好),Map系列(HashMap,HashTable,ConcurrentHashMap做为一类记)
IO
记忆方法:重点理解 IO模型(阻塞式IO,非阻塞式IO,IO复用,信号驱动IO,异步IO)理解了这些,会有助于理解 NIO,AIO。另外,须要知道 设计模式中的装饰器模式,会比较好理解Java的IO包。
小知识点
我的以为 Java 大致上能够切分为上面4个大部分。但其实还会有不少小知识点。好比说
- Java 关键字:abstract,final,static 等。
- 关键类:Object类的几个方法, String类,Thread类,栈,队列,Arrays,Collections 等其余Java经常使用类。
- 其余关于Java的知识,好比 jdk8的新特性(重点lambda+集合的流式操做),UML类图等。
==============
进阶--看书
《
Effective Java》《Thinking in java》《深刻理解Java虚拟机》《Java并发编程实战》这四本 是 Java 领域比较有名的书了,分别再从 虚拟机,多线程,一些小的要注意点等方面进一步提升本身的Java能力。
进阶--研究
框架代码
考本题的 EZLippi 的答案,此时能够看下一些 java 后端的框架,例如能够研究一下 Spring,如:
又或者 看看 SpringMVC ,Spring Security 的源码流程 也是比较好的,毕竟这些都是比较流行的基于Java的一些技术:
在这里,可能会对编译期和运行期不太熟悉,对反射不太了解,对Java的异常以前好像也没怎么接触过,又或者,不知道 abstract,final,try-catch-finally 的实际运用场景是什么。这里均可以接触到。
==============
最后--把知识用在工做中或者本身的项目中
例如,若是没有工做,那么就本身作个我的博客,用Java搭建后端,部署到阿里云。这时候能够监控下本身的Java使用了多少内存,例如简单的使用 jstat 就能够:
这时候你能够看到 新生代,老年代,eden区域,survivor区域等,能够看下他们的占比,利用-xmx,-xms,-xmn,-xss 等适当调节下。
又或者,若是在你的代码中你要用到集合,这个时候就能够考虑下 JDK8 的新特性,集合的流式处理是JDK8 的一大特性,以下是我在工做中使用的代码举例(写得不太好,不过意思就是这样):
List<Account> accounts = accountRepo.findAccountsByEntityCode(entityCode);
if(accounts != null) {
//若是不是叶子节点,那么从新计算
accounts
.parallelStream()
.filter(param -> {
AccountType accountType = accountTypeService.findAccountTypeById(param.getAcctCode());
if(StringUtils.isEmpty(accountType.getIsLeaf())){
if("0".equals(accountType.getIsLeaf())){
return true;
} else {
return false;
}
} else {
return true;
}
})
.forEach(param -> getAccount0(param));
}
再另外,若是分析了 ArrayList,LinkedList,会发现,ArrayList 的性能消耗主要是扩容所引发了,那么定义 ArrayList 的时候,就不要这样子了:
ArrayList<Object> list = new ArrayList<Object>();
而是先估算容量大小,这样子(估算不出那就算了):
ArrayList<Object> list1 = new ArrayList<Object>(10);
==============
最后,Java 只是一个工具,要配合好设计模式,以及算法,数据结构。好比说对数组排序,若是使用冒泡,选择算法,Java代码写得再好,再明了清晰,复杂度也是 O(n^2),效率不是很高。