当前位置: 华文星空 > 知识

大一软件工程专业,技术都不会,想走java路线,我该如何学习?

2021-06-15知识

大一难道不是打打游戏,谈谈恋爱的吗?这么早就知道来知乎提问题,问 Java 的学习路线了呀?我只能说,现在的年轻人真的太好学了

这不,前几天就有知友私信我问就业方向和学习路线,我还发了个圈,结果你猜评论区都怎么说?

  • 唉,现在的孩子觉悟都好高
  • 卷进来了
  • 这么卷了吗,从大一开始
  • 同为大一,已经按照二哥的学习路线学了 Java 一个月了
  • 我要是大一就知道二哥,这会早就近大厂了
  • 牛啊,我当年想的还是劳资终于可以好好打游戏了
  • 等等
  • 我只能说,题主来知乎问实在是太睿智了!为你点赞。下面就分享一些我的学习心得吧!

    一、大一上半学期,学一下 C 语言

    为什么我还是会建议你学习 C 语言呢?

    因为我们学的是计算机科学(CS),C 语言是一门古老而常青的编程语言,具备现代程序设计的基础要求,它的语法是很多编程语言的基础,比如说 Java。

    C 语言学得好,对 Java 的学习都是很好的补充。 像变量、算术运算符、关系运算符、逻辑运算符、赋值运算符、条件表达式、控制流、方法、传参等等这些基础的编程知识学会了,再学习 Java 的时候就可以直接跳过了。

    给你推荐一门课,浙江大学翁恺教授的【程序设计入门——C语言】,国家级精品课,很适合初学者。

    翁恺老师在推荐这门课的时候说过,「 这门课就是关于计算机的那些程序是如何被写出来的,写出来的这些人就是普通的人,那么我们当然也能学会怎么把程序写出来。学习编程最基础的那些东西,无非就是如何表达数据,如何计算,如何在计算的时候使用判断啊、循环啊这些手段 。」

    记住!课程里面的练习题一定要做,那可是浙江大学的练习题,能和浙大的同学共用一个老师,共用一套学习资源,想想都觉得美滋滋。一定要动手去敲代码,一遍觉得很生疏,就敲两遍,两遍还没记住就敲三遍,知道自己能独立自主的把代码给敲出来。推荐使用 VS Code 编辑器来敲 C 语言的代码。

    二、大一下半学期,学习 Java

    有了 C 语言作为启蒙,再学习 Java 就会轻松很多。拿 Java 中的 String 来说,C 语言里面是没有的,但 String 的底层结构是字符数组,这和 C 语言里面的 char 型字符数组是完全一样的。再比如说,Java 中引用的概念,和 C 语言中的指针概念是有一定的相似性的;还有,理解了 C 语言的方法传参为什么是通过值传递的,也就很容易明白为什么 Java 只有值传递没有引用传递。

    我之前整理了一份 GitHub 上星标 115k+ 的 Java 教程,里面涵盖了 Java 所有的核心知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容不多,只讲重点,这里也分享给你,希望能给你一些帮助。

    如果你是初学者,也可以看看我一直在连载的【教妹学 Java】,通俗易懂,风趣幽默,在 GitHub 上已经开源:itwanger/Tech-Sister-Learn-Java,可以去 star 下,我预计会更新 300 篇左右,把这个专栏打造成最适合初学者学习的 Java 教程 。给你看一下已经更新的内容。

    1)基础知识

  • 什么是 Java
  • Java 发展简史
  • Java 为什么如此流行
  • 第一个 Java 程序:Hello World
  • Java程序在编译期发生了什么
  • JDK 和 JRE 有什么区别
  • JVM 是什么
  • Java 变量类型有哪些
  • Java 数据类型有哪些
  • 必知必会的 Unicode:躲开锟斤拷
  • Java 运算符有哪些?
  • 一网打尽 Java 的那些关键字
  • 流程控制语句有哪些?图解版
  • Java 注释:程序的注解
  • 2)对象和类

  • 技术大佬的必备素质:命名优雅
  • 对象和类的相爱相杀
  • 方法:我负责程序的行为
  • 构造方法:对象初始化的必经之路
  • 学妹必须学会的 static 关键字
  • 学弟必须掌握的 this 和 super
  • 傻傻分不清:方法重载和方法重写
  • 代码初始化块:让我先走一步
  • 再见了,我的 final 关键字
  • 判断对象的类型:instanceof 关键字
  • 抽象类:子类复用的基石
  • 接口:抽象的另外一种表现形式
  • Java 表示:我只有值传递,没有引用传递
  • 面试经典题目:浅拷贝与深拷贝有什么区别
  • 自动拆箱与自动装箱,好玩
  • 3)数组

  • 最重要的数据结构之一:数组
  • 数组的专用工具类:java.util.Arrays
  • 打印数组最优雅的方式:deepToString
  • 4)字符串

  • 从源码的角度来看字符串的不可变性
  • 学弟学妹都必须掌握的字符串常量池
  • 深入浅出之美团技术团队解析过的 String.intern
  • 之后,你可以选择看视频学习或者看书学习,当然,学校安排的课程也是要学习的,但如果学校还给你讲 swing 这些东西,就可以跳过了,保证不挂科就行。可以按照我的学习路线来。

    书)

    推荐【Java核心技术卷1】,注意跳过 Swing、AWT、Applet 这些章节。之后,再读 【Java 编程思想】 作为升级,同样跳过图形化界面编程的章节。为什么要把【Java 编程思想】放在后面呢,因为毕竟是思想上的东西,放在前面很容易把初学者劝退,但放在后面就很容易在思维方式上提升初学者对 Java 的认知。

    之后,再看 【Java 并发编程实战】和【深入理解 Java 虚拟机】,学习 Java 并发编程和 Java 虚拟机,这也是 Java 的知识体系中最难的两块。

    像并发编程,经常被问的面试题有:

  • 进程与线程的区别
  • synchronized
  • volatile
  • ConcurrentHashMap
  • CopyOnWrite
  • 线程池
  • CAS
  • AQS
  • 等等
  • 像 Java 虚拟机,经常被问的面试题有:

    如果你觉得 Java 并发编程和 Java 虚拟机比较难学的话,可以看看我给你精心准备的辅助资料。

    视频)

    如果你比较喜欢视频学习的话,B 站是个好去处。去年的这个时候,我开始 在 B 站上关注一些优秀的 Java 方向的 UP 主,然后情况就发生了翻天覆地的变 化。以前习惯于收人鞭策才能前进,现在完全戒了这个瘾。

    1)入门篇。

    我推荐尚硅谷的 Java 零基础教程,虽然 UP 主是一家培训机构,但这并不妨碍这个视频的质量。

    翁恺教授的 Java 程序设计也是一个很不错的选择,我个人非常喜欢翁恺教授的授课风格。不过,B 站上的视频是搬运的,UP 主可以不关注了,嘿嘿。

    2)工具篇。

    工欲善其事必先利其器,掌握了下面这些工具,学习起来其他的内容也会更加顺手,不用瞎折腾。

    Intellij IDEA,编写 Java 程序的最佳 IDE,必须得掌握。UP 主还是尚硅谷这家培训机构,他家的视频是真的多,但白嫖他,我喜欢,哈哈。

    接下来是 Maven,可以帮助我们解决 jar 包的烦恼。UP 主还是尚硅谷这家培训机构。

    然后是 Git,工作中是必须掌握的。 UP 主是遇见狂神说 ,推荐大家关注下,我个人觉得非常好的一个 UP 主。他还出了很多其他方面的视频,下面会一一提到哈。

    3)JVM 篇

    尚硅谷的这套视频课程分为【内存与垃圾回收篇】【字节码与类的加载篇】【性能监控与调优篇】三个篇章,如果你能顺利学完的话,可以说 Java 虚拟机方面已经是有点小心得了。

    三、大二上半学期,学习 Spring

    网上总一些人,会很偏激,认为学 Spring 全家桶没什么用,他的理由是技术迭代太快,框架迟早是会被淘汰的,等你学会了,没准框架就过时了。还有一些人会杠,怎么 Java 程序员变成了 Spring 程序员呢?

    怎么说呢? 对于 Java Web 开发来说,Spring 已经成为和 Java 核心库一样的基础设施,如果你想成为一名合格的 Java 程序员,Spring 是必经之路

    另外,一个很重要的点,就是,自学的过程中,你是没有时间或者没有能力徒手撸一个像 Spring 这样强大的框架的。 有了 Spring,就有 AOP 和 IoC,意味着你可以做一些企业级的开发了 。再说,Spring 是建立在 Java 之上的一个框架,核心就是 AOP 和 IoC,如果 Java 基础不牢的话,也学不会 Spring。

    Spring 怎么学?可以到 B 站上看一下江南一点雨的视频教程,我推荐过很多次了,不只是因为我们关系好,更重要的是,他的视频质量很高,很值得推荐给你。

    我推荐你先学习 SSM(Spring+Spring MVC+MyBatis),再学习 Spring Boot。Spring Boot 的出现,并不意味着 Spring 和 SpringMVC 已经过时了,从设计目的上来说,Spring Boot 只是实现了 Spring 的自动装配,降低了项目搭建的难度。

    从技术角度来说,Spring Boot 的底层依然是 Spring 的核心机制,也就是 AOP 和 IoC,Spring Boot 只是一个承载者。在我看来,学习 Spring 的正确路径应该是 Spring -> Servlet -> Spring MVC -> Spring Boot。

    这里补充一下我对 AOP 和 IoC 的理解。

    AOP(Aspect-Oriented Programming),也就是面向切面编程,能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

    IoC(Inverse of Control),也就是控制反转,是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。DI(Dependency Injection),也就是依赖注入,原来叫 IoC,能让人更加直观和清晰地理解其背后所代表的含义。

    如果还不理解的话,可以看看【码农翻身】,里面讲的更生动一些。

    我再给你补充一些。

    继续尚硅谷,不得不佩服这家培训机构,眼光还是很长远的,很早就把这些视频公布出来占领了 B 站,很有远见。

    单学 Spring 的话,尚硅谷也提供了。

    还有狂神说的 Spring。

    然后是 SpringMVC。

    狂神说的 SpringMVC。

    江南一点雨的 MyBatis。

    狂神说的 MyBatis。

    学完 SSM,自然就少不了要学 SpringBoot,至于说为什么要学,我在之前的知乎回答里提到过,你感兴趣的话,可以跳过去看一眼。

    SpringBoot 的话,江南一点雨也录了,只不过没有放出来,单独作为课程卖了,他讲得其实非常好。那就推荐狂神说的 Spring Boot 吧,我也很喜欢,播放量也挺大。

    最后是 SpringCloud,狂神说这也有。

    学完 Spring,可以说你已经是一名合格的 Java 工程师了,CURD 不在话下,手到擒来。

    三、大二下半学期,补充其他知识

    1)数据库

    学习一门编程语言,如果不去操作下数据,就感觉这门编程语言空有皮囊却没有灵魂,对吧?

    要想学好数据,首先要学习一下 SQL,我推荐一个老外的视频课(中字版啦),内容制作得非常棒,所以完全不用担心听不懂。视频是搬运的,UP 主辛苦了。

    然后再学习一下市场占有率非常高的 MySQL,视频我推荐尚硅谷的,女老师讲的。不得不承认,老师讲得很精彩,嗯,弹幕里也很精彩。

    目前大多数公司的存储都是 MySQL + Redis,MySQL 作为主要的存储方式,Redis 作为缓存,用来加快热点数据的读写速度,从而提高性能。所以学完 MySQL,可以趁热打铁学一下 Redis,也可以放到后面学。UP 主是遇见狂神说,狂神出的视频也非常多,质量都还不错。

    2)操作系统

    为什么要学习操作系统呢?第一,面试要考;第二,无论学习哪门子编程语言,比如说 Java、C/C++,还是 D++(走错片场了),都需要和操作系统打交道,像 Java 中的多线程技术,其实是由操作系统来负责进程和线程管理的;第三,学习操作系统,还能学到内存分配方面的知识。

    我推荐清华大学的【操作系统】课。视频是搬运的,UP 主辛苦了。

    3)计算机组成原理。

    众所周知,计算机是由 CPU、内存、显示器这些设备组成的硬件,但我们大学毕业后,往往从事的是软件方面的开发工作。那怎样才能在硬件和软件之间自由穿梭呢?答案就是学好计算机组成原理。

    弄明白了计算机的组成原理,也就对整个软件开发有了一个系统的认知,不论是计算机的硬件原理,还是软件架构,都能很好的驾驭,随之而来的,我们的职业发展机会也就更多了。

    如果想深入学习计算机组成原理的话,我推荐哈工大的这门视频课,整体评价非常高。视频是搬运的,UP 主辛苦了。

    4)计算机网络。

    当今这个时代,没有网络简直无法生存,哪怕是在电梯里的一分钟,我都受不了那种手机没有网络的状态。我们所学的编程知识,如果脱离了网络,将变得毫无意义,因为没有哪个编程语言是要在单机环境下运行的。

    计算机网络方面的视频我推荐湖科大教书匠的【计算机网络微课堂】,制作得非常用心,是一部不可多得的佳作。UP 主是湖科大教书匠,可以关注下哈,支持原创视频的作者。

    四、大三上半学期,刷 LeetCode

    真的有必要刷题吗?

    必要肯定是必要的,毕竟「工厂」就喜欢这一套筛选机制!这就和古代的很多才子,都特么不喜欢八股文,写点风雅的诗词它不香吗?但能怎么办?想要参加科举出人头地,就得这么干!

    那怎么刷才能轻松点,才能高效点呢?

    我的心得就是简单粗暴: 从易到难,一遍一遍地刷,尽量使用自己熟悉的编程语言 ,比如说 Java 程序员尽量用 Java 来解题,这样刷题的幸福感也会提升很大一截。用自己不熟悉的语言可以刷,但时间成本就很高。就这样不断地坚持,刷完 10 道题,然后 50 道,100 道,刷题的功夫就有了本质上的提升。

    当然了,刷题仍然是需要有技巧的,不能闷着头吭哧吭哧地刷,可能会遇到很多阻碍。

    1) 如果不是天赋异禀,不要怕,一开始就是抄题,先把别人的解题思路照着敲出来,你可以使用我整理的这份纯 Java 版的 LeetCode 刷题笔记,几乎每道都有多种解题思路, 对算法薄弱和需要提高算法的你很有帮助:

    反正我一开始学 Java 的时候就是各种抄 demo,demo 抄得多了,大脑对代码产生记忆了,再去看视频、书籍学习就会感觉轻松得多!刷 LeetCode 也是这么个理,不要觉得不好意思,抄多了,思路就慢慢有了。虽然是个笨方法,但管用。

    2) 刷的题多了,尽量控制一下刷题的时间,掐个点,不能让自己一直想、一直写下去,如果半个小时没有解出来,就果断放弃,去背别人的答案,不要觉得不好意思,等到真的熟了,再去想自己的解题思路。

    在我们小的时候,学习就是靠背,拼音要背,乘法口诀要背,一样的道理,背的滚瓜烂熟,才能在应用的时候第一时间就想得到。甚至说,就省去了想的时间。

    想一下,是不是这样,当我们背会了 1+1=2 后,要得出 10+10=20 是不是就容易多了!

    3) 代码尽量要规范一点,不要以为只要把题解出来就行了,还是应该保证代码优雅的姿态。

    4) 一开始刷题不要追求量,非要把所有的题全部刷完,光 LeetCode 上就有 1000 多道题,所以没必要全部刷完的。可以按照下面这个类型来刷就可以了。

    数组-> 链表-> 哈希表->字符串->栈->队列->树->回溯->贪心->动态规划->图

    一开始,刷 100 道题就差不多了。

    这里强调一下数据结构与算法的重要性。

    通过阿里的校招要求就能看得出来了,数据结构与算法放在了很前面的位置。

    数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。 它包含三方面的内容,逻辑关系、存储关系及操作。 不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。 例如,计算机网络依赖于路由表运作,B 树高度适用于数据库的封装。

    为什么数据结构这么重要呢?清华大学计算机系邓俊辉教授有过这样一段描述:

    数据结构是计算机科学的关键内容,也是构建高效算法的必要基础。其中涉及的知识,在相关专业的课程系统中始终处于核心位置。以 ACM/IEEE Computing Curricula(计算机教学大纲)为例,其中对于几个相关专业(计算机科学、计算机工程、信息系统、信息技术、软件工程)的共同要求中,数据结构与算法作为程序设计概念与技能的核心,紧随在数学之后,排在第二位。

    算法研究的目的是为了更有效的处理数据,提高数据运算的效率,数据运算是定义在数据结构上的,各大公司的笔试基本都考这个。如果你想拿到更多的 offer,拿到更好的 offer,LeetCode 上的题要能刷个一百到三百道,有时间有精力的话,最好参加一下 ACM 竞赛,在找工作的时候会非常有优势 我这有一份 BAT 大佬的这份刷题笔记,对算法薄弱或者需要提高的同学很有帮助:

    四、大三下半学期,备战面试+准备简历

    我在五年之前参加过多场面试,应聘的岗位均为 Java 工程师,在不断地面试过程中,分类总结了面试中的一些知识点,主要包括以下几部分:

  • Java 基础知识点
  • Java 常见集合
  • 高并发编程(JUC 包)
  • JVM 内存管理
  • 网络协议相关
  • 数据库相关
  • MVC 框架相关
  • Linux 命令相关
  • 面试是从学校走向社会的第一步。互联网公司的校园招聘,从形式上说,一般分为 2~3 轮技术面试 +1 轮 HR 面试,不过某些公司没有 HR 面试。在技术面试中,面试官一般会先就你所应聘的岗位进行相关知识的考察,也叫基础知识和业务逻辑面试,只要回答的不是特别差,面试官通常会说:「咱们写个代码吧」,这个时候就开始了算法面试。也就是说, 一轮技术面试 = 基础知识和业务逻辑面试 + 算法面试

    有人可能会说,Java 面试都只是被答案吗?

    我敢百分百这么说!如果不背 Java 面试题的答案,肯定面试会挂!Java 面试题就像我们高考时的文言文,包括古诗词,不背是不可能答出来的!当然了,除了背,还得理解,否则意义不大,对面试过后的工作帮助也不大 !我在另外一个回答里,准备了非常详细的 Java 面试题,你可以去看看。

    另外,我还整理了一份面试题库,分为十九个模块,分别是: Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM,也就是说,面试当中常见的题都包括在内了。

    一定要牢记,不能对背答案抗拒,毕竟我们是为了找到一份满意的工作,面试就是一场考试,我们总不能裸考吧!

    面试突击的过程中,遇到之前没有学过的知识点,是要花时间去补一补的。 比如说 MySQL、Git、Redis 等等这些。

    简历一定要好好准备,是滴, 简历就好像电梯广告的单页一样,它富有鲜活的生命力,它在呐喊,它不需要过多的润色,只需要铿锵有力、赤裸裸的「炫耀」 。比如说我是沉默王二, 2019 年参与了 XXX 项目的开发。作为项目团队的核心 开发人员,我不仅能够提前完成自己的开发任务,还设计了一个高效的缓存中间件,大大提高了系统的性能。

    该中间件上线后,Web 前端性能从 10 QPS 提升到 120 QPS,服务器由 10 台缩减为 5 台。

    鉴于之前的良好表现,我在 2020 年升任项目的主要负责人,虽然小组成员只有 15 个,但硬生生地肩负起了每天超过 2000 万的 PV。

    看, 这样的简历是不是让人耳目一新,证明自己价值的同时,没有过多的粉饰,让招聘方觉得你很靠谱,迫切地想要把你这个人才「抢」到手,免费被别的公司挖走了

    简历上的内容不要太多,尽量不要超过一页,因为招聘方没有那么多时间去翻看你的简历。我是挺相信第一印象的,好的简历看一眼就会过目不忘,真的。

    简历要怎么样写,才能打造一个独一无二的你呢?才能让招聘方知道你做过什么?能做什么呢?我来简单的列举一下。

    1)个人信息

  • 姓名
  • 年龄
  • 手机
  • 邮箱(推荐使用 Gmail,因为可以无形「高大上」,给招聘方一种专业的 feel)
  • 2)教育经历

    只写最高学历就行了;博士就写博士,没必要再写什么时候考的研;本科就写本科,没必要再写什么时候专升本。如果学历不好,也不要担心,可以在项目经验中多突出一些。

    3)工作经历

    可以根据招聘方的要求,适当地做一些调整,比如说,应聘的岗位是开发,就没有必要写之前做运维,做测试的工作经历。

    如果工作经验比较丰富的话,尽量按照时间倒序来写,因为越后面的项目,肯定难度更大,技术含量更高,对吧,不要一步一个台阶往下迈。

    懂得适可而止,不要事无巨细,把所有项目的细节都罗列上。只需要交代三个重要的项目就行了。项目的背景是什么,你在其中的职责,项目用到的技术栈(最好是招聘信息上要求的那些),最好突出你做出了哪些特殊的贡献(证明你确实有能力)。

    4)加分项

  • 有一个访问量很不错的博客。
  • 有一个星标很高的开源作品。
  • 出过一些技术图书。
  • 在行业大会上做过分享。
  • 参加过一些出名的竞赛,获得过优异的成绩。
  • 记住一点,简历并不是单纯意义上的自我介绍,比如说我是沉默王二,今年 18 岁,来自洛阳,毕业于某某学校。这样的简历太苍白了。必须得把简历重视起来,尽量去贴合招聘方的要求。

    -----手动分割线-------

    计算机操作系统、计算机组成原理、计算机网络、数据结构与算法、C 语言,这些基础知识你全部都过了一遍,可能有些知识没有掌握,没关系的,只要能让自己的大学生活过得很充实就可以了。

    到了大四,有实习机会就出去,能找到一份好的工作,我的建议是可以不用读研。

    大一的时候就是一张白纸,我一开始的时候也是什么都不会,不要紧的,慢慢学,慢慢积累就对了。记住一点,动手去编码,不管是不是抄,对新手来说,真的是一个走出新手村的好办法。

    清华大学的孙家广院士曾说过三句话,我觉得非常妙:

    learning by doing
    do not give up
    get things done

    编程是一门手艺活,不动手是学不会的 。多 BB 几句,希望能给你一些参考。

    无论什么时候,一定要找到学习的目标,以及学习的套路 。找不到的话,就只能事倍功半,付出了很多努力,却迟迟得不到最好的回报。学习的时候一定要 把自己当成一台计算机,既有输入,也要有输出 。只输入不输出会堵塞,只输入不输出会枯竭。

    多交流,多思考,刻意练习 像算法,基本上面试是必考的项目,不要产生厌恶的情绪,该刷还是要刷!你不刷,岗位可能就给别人了 。推荐大家到 LeetCode 上刷题,如果觉得自己没有解题思路的话,可以看看下面这份刷题攻略。

    最后,我再强调一下,一定要动手敲代码,做笔记,把自己没有理解的知识点总结下来,哪怕是画一些思维导图。有一句话很糙,伟大的牛逼之前总是傻逼式的坚持,但理是这么一个理的,学习计算机的过程中,你可能会遇到各种各样的困惑,重要的是,一定要坚持

    我是 @沉默王二 ,希望这个回答能对你有所帮助,笔芯~