Java学习路线-知乎

鼬自来晓

378 人赞同

可以从几方面来看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个大部分。但其实还会有很多小知识点。比如说

  1. Java 关键字:abstract,final,static 等。
  2. 关键类:Object类的几个方法, String类,Thread类,栈,队列的一些实现类 等其他Java常用类。
  3. 其他关于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 等适当调节下。不要小看这些,阿里云上1G内存可是要差不多30块钱呢,够两顿饭钱了。

又或者,如果在你的代码中你要用到集合,这个时候就可以考虑下 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),慢。

来自为知笔记(Wiz)

时间: 2024-08-06 18:29:25

Java学习路线-知乎的相关文章

java学习路线及资源下载,持续整理中

java学习路线及资源下载,持续整理中 学习路线图:http://blog.csdn.net/shenzhq1980/article/details/484703371.java学习经典书籍_基础编程篇下载地址:http://blog.csdn.net/shenzhq1980/article/details/48375543书籍:Java程序设计语言.(美国)阿诺德.清晰版JAVA2核心技术第1卷.基础知识7thJAVA2核心技术卷II:高级特性7th Java语言程序设计-基础篇(原书第8版)

【转载】JAVA学习路线二

JAVA学习路线二------------高阶面试 作者:Java高级进阶链接:https://zhuanlan.zhihu.com/p/35301291来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1.hashcode相等两个类一定相等吗?equals呢?相反呢? 2.介绍一下集合框架? 3.hashmap hastable 底层实现什么区别?hashtable和concurrenthashtable呢? 4.hashmap和treemap什么区别?低层数据结

【强烈推荐】可能是最适合你的 Java 学习路线和方法

如遇链接无法打开,建议使用 https://github.com/Snailclimb/JavaGuide/blob/master/docs/questions/java-learning-path-and-methods.md 这个链接进行阅读. 到目前为止,我觉得不管是在公众号后台.知乎还是微信上面我被问的做多的就是:"大佬,有没有 Java 学习路线和方法"(大佬属现代流行的客气称呼,本人非大佬哈).所以,这部分单独就自己的学习经历来说点自己的看法. 前言 大一的时候,我仅仅接触

十年架构师留下最完整的Java学习路线,学完年薪40W

文章有点长,请大家耐心看完,话不多说直接上干货! 永不过时的编程语言--Java 编程开发. Java编程语言占比: 据官方数据统计,在全球编程语言工程师的数量上,Java编程语言以900万的程序员数量位居首位. 而且很多软件的开发都离不开Java编程,因此其程序员的数量最多.而在以Java编程为核心的开发领域中,javaEE程序员的需求量10年来一直居于首位!创一个小群,供大家学习交流聊天如果有对学java方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对

好程序员Java学习路线分享SpringCloud

好程序员Java学习路线分享SpringCloud一.Web应用架构的演变随着互联网的发展,网站应用的规模不断扩大,Web应用架构也在不断的演变四个阶段:单一应用.垂直应用.分布式服务.流动计算1.单一应用架构当网站访问量很小时,只需要一个应用程序,将所有的功能都部署在一起,以减少部署节点和成本 此时关键问题:简化数据库操作,数据访问框架ORM是核心适用场景:小型网站.管理系统.简易办公系统 局限:1.扩展性差2.不便于协同开发3.不利于升级维护 2.垂直应用架构 当访问量逐渐增大,单一应用(单

好程序员Java学习路线Java bean是个什么概念

好程序员Java学习路线Java bean是个什么概念,Bean的中文含义是"豆子",顾名思义JavaBean是一段Java小程序.JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重用或者是插入其他应用程序中去.所有遵循一定编程原则的Java类都可以被称作JavaBean.一. Java Bean技术概述??????? Java Bean是基于Java的组件模型,由属性.方法和事件3部分组成.在该模型中,JavaBean可以被修改或

好程序员Java学习路线分享5分钟了解基数排序

好程序员Java学习路线分享5分钟了解基数排序,前言:基数排序无需进行比较和交换,而是利用分配和收集两种基本操作实现排序.基数排序分为两种:第一种是LSD ,从最低位开始排序:第二种是 MSD, 从最高位开始排序. 基数排序思想介绍 分配:对于数字,每位的取值范围是0-9,因此需要10个容器(我们可以将其称为桶),这10个桶标号为0-9.每趟排序时,我们取每一个元素在该位的数值依次放入桶中. 收集:在一趟排序完成后,我们按顺序从0-9的桶中依次取元素. 继续进行分配和收集,直到最大位数排序完成.

好程序员Java学习路线分享冒泡排序及优化

? 好程序员Java学习路线分享冒泡排序及优化,冒泡排序是一定典型的交换排序,如排序规则是升序,有如下数列: ? A[0] A[1] A[2] A[3] ...... A[n] ? 将A[0]和A[1]比较,如果A[0]>A[1] ,则交换两个元素的位置,否则不变, 再继续比较A[1]和A[2],直到A[n-1]和A[n].即比较相邻的两个元素,如果前一个大,就交换(否则不交换),再继续比较后面的元素,每一轮比较之后,最大的元素会移动到最后(完成一轮冒泡):再开始第二轮冒泡,本次会选出第二大的元

好程序员Java学习路线分享创建Java class

好程序员Java学习路线分享创建Java class,首先通过Transport Client获取ES的连接 private Client client; //通过Transport Client获取ES的连接 @Before public void getClient() throws Exception{ ????//ES服务的JavaAPI的port为9300 ????//注意:如果请求一个ES集群,可以多添几个节点 ????//为了避免在一个节点出现网络问题导致的请求失败问题,可以自动切