一、JavaSE
1、JavaSE基础
1.1 面向对象
- 类和对象
类:就像一个模板,它描述一类对象的行为和状态
对象:是类的一个实例,有状态和行为 - 面向对象特征:
包含三大特征:封装、继承、多态 - 数据类型:
- Java分内置数据类型、引用数据类型。
- 内置数据类型共8种:包含6种数字类型(4个整数型byte、short、int、long,2个浮点类型float、double),1种字符类型char,还有1种布尔类型boolean
- 引用数据类型共三种:类Class、接口Interface、数组Array
- 流程控制
主要分为:条件语句(if、if…else、switch)、循环语句(while、do…while、for)、跳转语句(break语句、continue语句和return语句) - 异常处理
Java提供了try
、catch
、finally
这三个关键字来处理异常因为finally是可以省略的,所以异常处理格式可以分为三类:try{}---catch{}
、try{}---catch{}---finally{}
、try{}---finally{}
1.2 集合底层原理
Java中的集合框架主要包括两种类型的容器,一种叫集合(Collection):存储一个元素集合,另一种是图(Map):存储键值对映射。Collection接口又有3种子类型:List、Set和Queue,再下面是一些抽象类。最后是具体实现类,常用的有ArrayList、LinkList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等
1.3 网络编程
- 介绍
网络编程通常是指编写运行在多个设备的程序,这些设备都通过网络连接起来。Java中提供了两种常见的网络协议的支持,分别是TCP和UDP - TCP
TCP:(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于节流的传输层通信协议,TCP层是位于IP层之上,应用层之下的中间层。TCP保障了两个应用程序之间的可靠通信。通常用于互联网协议,TCP/IP - UDP
UDP:(User Datagram Protocol,用户数据协议)是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范
1.4 IO/NIO
NIO即New IO,是在JDK1.4中引入。NIO和IO有相同的作用和目的,但实现方式不同,NIO的效率要比IO高很多。NIO和传统IO间最大的区别是:IO是面向流的,NIO是面向缓冲区的。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中,其次IO的各种流是阻塞的,NIO是非阻塞的
1.5 抽象类和接口
- 抽象类特点:
- 1、类名用abstract关键字修饰
- 2、有抽象方法的一定是抽象类、但抽象类不一定有抽象方法
- 3、抽象类不能被实例化,只能通过它的子类来实例化
- 4、抽象类中的抽象方法在子类中重写,不然的话子类也要被定义为抽象类
- 接口的特点
- 1、接口是用interface关键字修饰
- 2、接口中全部都是抽象方法,而且是public abstract修饰
- 3、接口不能直接被实例化,只能通过实现类来实现实例化
- 4、接口中的所有方法必须在该接口的实现类中全部实现,不然的话实现类还是抽象类
1.6 方法
方法是一系列语句的集合方法,方法是解决一类问题的步骤的组合,方法包含于类或对象中,方法可以被创造也可以被调用
1.7 JDK特性
-
JDK8新特性
Java8(又称为JDK1.8)是Java 语言的一个主要版本。2014年3月18日0racle发布Java 8。它支持函数式编程,新的 JavaScript 引擎,新的日期APl,新的Stream API等等。Java 8是LTS版本,即长期支持的版本 -
JDK11新特性
Java 11是Java8之后的第一个LTS版本,于2018年9月25日正式发布。它支持基于嵌套的访问控制、Epsilon垃圾回收器、标准 HTTP Client升级、简化启动单个源代码文件的方法、Lambda参数的局部变量语法、支持 TLS 1.3协议、动态类文件常量、实现ChaCha20和Poly1305加密算法等等 -
JDK15新特性
Java15于2020年9月15日正式发布。一次发布了14个新特性,包含隐藏类、封闭类、数据签名算法(EdDSA)、模式匹配、Records、 Text Block等等。它并不是一个长期支持的版本,只支持 6个月(到2021年3月),上一个LTS长期支持版本还是Java 11
二、专业通识
1、数据结构
1.1 栈和队列
- 栈
栈是一种物理结构,它存储一组线性元素,这组元素在操作上有后进先出的特性。堆是堆(heap),栈是栈(stack),堆栈是栈。栈的两个基本操作:入栈(push)、出栈(pop) - 队列
像栈一样,队列也是一种线性表。它允许在表的一端插入数据,在另一端删除元素。插入元素的这一端叫做队尾,删除元素的这一端叫做对首
1.2 树
树是非线性数据结构,是由结点或顶点和边组成的,且不存在着任何的一种数据结构。典型的树有:二叉树、平衡二叉树、红黑树等
1.3 哈希表
Hash Table:本质是一种对数组进行了扩展的数据结构。是一种根据根据关键码(key)去寻找值(value)的数据映射结构
1.4 优先队列和堆
- 优先队列
普通队列是先进先出、后进后出,优先队列与出队顺序和入队顺序无关,和优先级有关,动态选择优先级最高的任务执行 - 堆
堆是优先队列的一种实现方式,实现入队和出队操作时效率较高。堆一般是二叉堆,本质是满足一些特殊性质的二叉树
2、常用算法
2.1 递归与分治
- 递归算法
递归算法是指直接或者间接不断反复调用自身来解决问题的方法。过程中不能无限制的调用,必须有一个出口,作为结束递归的条件,否则就会出现死循环。如:阶乘、斐波那契数列、汉诺塔问题等 - 分治算法
待解决复杂的问题简化为若干个小规模相同的问题,然后逐步划分,达到易于解决的方法。如:棋盘覆盖、找伪币、求最值等
2.2 动态规划算法
动态规划和分治类似,均为组合子问题的解决原问题的方法。区别是分治的子问题是相互独立存在的,动态规划应用于子问题重叠的情况。如:钢条切割问题
2.3 贪心算法
贪心算法是就待解决问题,做当下最好的选择,而不从全局最优来考虑,通过局部最优希望导致全局最优。如:背包问题、均分问题、最大整数问题等
2.4 回溯法
回溯法是一种搜索算法,从原始的根节点出发,按照深度优先搜索的策略进行搜索。当到达某节点后,探索节点是否包含该问题的解。加入包含那么进入下一个节点进行搜索,假如不包含则回溯到上级父节点选择其它分支搜索。如:旅行商问题、八皇后问题等
2.5 分支界限法
也是一种搜索算法,和回溯法相似。可是回溯法是找出问题的许多解,而分支界限法是找出一个解,或者是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,简单来讲就是在某种情况下的相对最优解。如:装载问题,旅行售货员问题等
3、重构设计
3.1 常用设计模式
- 创建型模式
- 工厂模式
- 单例模式
- 建造者模式
- 原型模式
- 结构型模式
- 代理模式
- 装饰器模式
- 适配器模式
- 外观模式
- 桥接模式
- 组合模式
- 享元模式
- 代为型模式
- 策略模式
- 命令模式
- 责任链模式
- 观察者模式
- 模板方法模式
- 迭代子模式
- 备忘录模式
- 状态模式
- 访问者模式
- 中介者模式
- 解释器模式
3.2 设计原则
- 开放-关闭原则OCP
即对扩展开放,对修改关闭:在已有系统基础上进行开发,不要对正常运行的源码进行修改操作。需要需求拓展时,通过添加新类和新的代码来实现对已有代码做到最少修改,甚至是零修改 - 依赖倒置原则DIP
即面向抽象编程,即通过接口或者抽象类提供依赖关系;各个业务模块之间依赖关系,通过约定的接口或者抽象类来实现,不涉及具体实现细节,细节要交给具体的实现类来完成 - 接口隔离原则ISP
即接口中的方法和属性都是实现类所需要,没有额外无用信息:是指接口的完美复用,接口的内容对于实现来说无冗余代码 - 单一职责原则SRP
即接口或类只提供一种业务实现:每个接口、类的功能,只能用来做专门的事,强调系统内业务职责的唯一性,避免职责扩散 - 里氏替换原则LSP
即使用父类的地方可以用子类来替换:子类尽量不要重写父类或者接口中已经实现的方法,即子类和父类逻辑保持一致性 - 迪米特法则LOD
即最少知道原则,核心思想是低耦合,高内聚:用于弱化代码(通常指类)之间的依赖关系
三、开源框架
1、NET框架
1.1 Netty
Netty是由JBOSS提供的Java开源框架,其提供了异步的、事件驱动的网络应用程序框架和工具。一般用来快速开发高性能、高可靠性的网络服务器和客户端程序。Netty是基于NIO的客户、服务器端的框架,可以高效的并发出两络应用。相当于简化了网络应用的编程开发辽程,例如:基于TCP和UDP的Socket服务开发
1.2 Mina
Mina是(Multipurpose Infrastructure for Network Applications)的简称,是一个网络应用程序框架,可以帮助用户轻松开发高性能、高可伸缩性的网络应用程序。和Netty一样同为Trustin Lee的作品,因此与Netty有很多相似之处。相比起来Netty新一些、文档更清晰、新版本的发布比较快。而且Netty性能更高,和其它主流的NIO框架对比,Netty的综合性能相对更好
2、SSM框架
2.1 Spring
Spring是一个开源的轻量级的应用程序开发框架。它的目的是化繁为简,简化企业的应用程序开发。同时,Spring不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring提供的IOC和AOP功能,可以将组件之间的耦合度讲到很低,便于后期的维护和迭代,实现了软件的高内聚、低耦合思想。Spring的核心思想是IOC,也就是不需要程序员去显式地new一个对象,而是让Spring帮你来完成这一切
2.2 SpringMVC
MVC是(Model View Controller)的简称,是一种软件设计的通用框架模式。
它采用模式(Model)-视图(View)-控制(Controller)的方式把业务逻辑、数据与界面显示分离。而SpringMVC是框架,是一个基于Java语言实现了MVC框架模式的轻量级框架。SpringMVC采用了松耦合的可插拔组件结构,比其它的MVC框架相对更具有灵活性和扩展性。同时,与Spring框架集成
2.3 Mybatis
Mybatis是一个基于Java的持久层框架,是基于ORM框架模式(一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术)的一种框架。Mybatis简化了很多JDBC代码和手工设置等,是一种对JDBC的封装。简单来说,Mybatis是一个帮程序员更高效的和数据库打交道的框架。可以把数据库的表翻译成类,字段翻译成类的字段,记录翻译成对象。Spring中,通过简单的设置就可以集成Mybatis这个框架,所以会有SSM框架的说法,SSM是Spring+SpringMVC+Mybatis
2、RPC框架
2.1 Dubbo
Dubbo是绑定语言框架,仅支持Java。Dubbo始于电商系统,是国内最早开源的RPC框架,由阿里巴巴公司开发并与2011年末对外开源,可以和Spring框架无缝集成。它提供了三个关键功能:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。
Dubbo架构主要包含四个角色:Consumer是服务消费者,Provider是服务提供者,Registry是注册中心,Monitor是监控系统。交互流程大致是Consumer端通过Registry注册中心获取到Provider节点后,通过Dubbo的客户端SDK与provider建立连接并发起调用。Provider端通过Dubbo的服务端SDK接收到Consumer的请求,处理后再把结果返回给Consumer
2.2 Thrift
Thrift是跨语言框架,除Java外还支持其它语言。Thrit学期是由Facebook开发的内部系统跨语言的RPC框架,于2007年贡献给了Apache基金,成为了Apache开源项目之一·主要特性为:支持多种序列化格式:如Binary和JSON等、支持多种通信方式:如 Socket和Framed等、服务端支持多种处理方式:如Simple等
2.3 gRPC
gRPC是跨语言框架,除Java外还支持其它语言。BRPC是Google于2015年对外开源的跨语言RPC框架。主要特性为:通信协议采用HTTP/2、1DL使用ProtoBuf、以及多语言支持
3、微服务框架
3.1 Spring Boot
Spring Boot是由Pivotal团队提供的全新开源的轻量级框架。它是基于Spring4.0设计的,不光继承了Spring框架原本的优秀特质,还通过简化配置来进一步简化了Spring应用的整个搭建以及开发过程。而且Spring Boot通过集成大量的框架使得依赖包的版本冲突、引用的不稳定性等棘手问题得到了比较好的解决。简单来讲,Spring Boot使编码变简单、使配置变简单、使部署变简单、使监控变简单
3.2 Spring Cloud
Spring Cloud是一系列框架的有序集合。利用了Spring Boot的开发便利性简化了分布式系统基础设施的开发,都可以用Spring Boot风格做到一键启动和部署。Spring Cloud本质上来讲只是将各家公司开发的比较成熟、经得起考验的服务框架进行整合,再通过Spring Boot风格进行再次封装,摒弃掉了复杂的配置和实现愿理,最终给程序员留出了一套易懂、易部警、易维护的分布式系统开发工具包。Spring Cloud对于中小型公司来讲简直是福音般的存在,因为这类公司普遍没有足够的预算投入去开发自己的分布式系统基础设施,使用Spring Cloud-站式餐决方案就可以大幅减少开发成本。而且,随着近年来微服务架构和Docker容器的爆火,使得Spring Cloud在“云”化的软件开发风格中站有一席之地
4、前端框架
4.1 Vue
Vue是一套用于构建用户界面的渐进式JavaScript框架,作者是国人尤雨溪。与其它框架不同的是,Vue被设计为可以自底向上逐层应用。Vue不是一个全能框架(仅聚焦于视图层),所以它比较易学,而且易与其它库或已有项目整合。优势为:模板和渲染函数的弹性选择、简单的语法和项目配置、更快的渲染速度和更小的体积
4.2 React
React起源于Facebook,最早是其内部项目,用来架设Instagram网站,于2013年5月开源。优势为:更适合大型应用和更好的可测试性、Web端和移动端原生App通吃、更大的生态系统,更多的支持和好用的工具
5、安全框架
5.1 OAuth2
OAuth是一个开放标准,允许用户授权第三方移动应用访问存储在其它服务提供者上的信息,且不需要将用户名与密码提供给第三方应用或分享数据的所有内容。OAuth2.0是OAuth协议的延续版本,且不向下兼容OAuth1.0
5.2 Shiro
Shiro也是Java的安全框架。因为它非常简单,所以使用的人越来越多。相比Spring Security来讲可能功能偏弱,有的实际场景使用小而简单的Shiro就可以满足需求了
5.3 Spring Security
Spring Security前身是Acegi Security,是Spring项目组中用来提供
安全认证服务的框架。使用的目的是:验证、授权、攻击防护
四、开发运维
1、开发工具
1.1 Intellij IDEA
IntelliJIDEA常被简称为IDEA,是Java语言的集成开发环境(1DE),是JetBrains公司的产品。目前在业界被公认为最好的Java开发工具
1.2 Eclipse
经典Java开发工具,插件MyEclipse大名鼎鼎
2、容器化
2.1 Docker
Docker是一个开源应用容器引擎,可以让开Docker发者打包应用和依赖包到一个轻量级并可移植的容器中,然后发布到Linux上,还可以实现虚拟化。容器是完全沙箱机制,相互之间不会有任何接口,很重要的一点是容器性能开销非常低
2.2 K8s
Kubernetes通常被叫做K8s,是Google云平台开源的容器集群管理系统。用于自动部涵、扩展和管理容器化应用程序。将Docker应用在庞大的业务实现时,存在编排、管理和调度的问题。K8s应运而生,可以对Docker及容器进行更高级、更灵活的管理
3、JenKins自动化部署
Jenkins是一款由Java编写的开源的持续集成工具。Jenkins提供了软件开发的持续集成服务
4、项目构建
4.1 Maven
Maven是一个用Java开发项目管理工具,归属Apache。它可以对Java和其他语言的项目进行构建、依赖管理。还能很方便的管理项目报告、生成站点、管理Jar文件等
4.2 Gradle
Gradle是一个基于Apache的Ant和Maven概念的项目自动化构建开源工具。2020年6月,Springboot团队宣布将他们的build迁移到了Gradle
5、版本控制
5.1 Git
Git是一个开源的分布式版本控制系统,相比SVN来讲,Git是分布式的
5.2 SVN
SVN是一个开源的版本控制系统,相比Git来讲,SVN是集中式的
五、数据存储
1、关系型数据库
1.1 MySQL
MySQL是一个关系型数据库管理系统,是Oracle甲骨文公司旗下的产品。为多种编程语言提供了API,主要包括C、C++、Python、Java、PHP等。互联网兴起以后,MySQL已经成为了最为流行的开源关系型数据库。拥有体积小、速度快、总体拥有成本低、开放源码等特点
1.2 Oracle
Oracle Database,也叫Oracle RDBMS,一般简称Oracle.是Oracle甲骨文公司的一款关系型数据库管理系统。Oracle是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。拥有系统可移植性好、使用方便、功能强大等特点。相比MySQL,对硬件要求高、价格昂责、管理操作比较复杂、技术要
求比较高就是它的短板了
1.3 JDBC
JDBC是(Java Data Base Connectivity,即Java数据库连接)的简称。JDBC为多种关系型数据库提供统一访问,它是由一组用Java编写的类和接口组的,是一种用于执行SQL语句的Java APl。使用JDBC的一般步骤为:加载JDBC驱动程序→建立数据库连接Connection→创建执行SQL的Statement→处理执行结果ResultSet→释放资源
2、NoSQL数据库
2.1 Redis
Redis是(Remote Dictionary Server)的简称,与Oracle和MySQL不同,Redis是跨平台的非关系型数据库。Redis通常被称为数据结构服务器,或键对(Key-Value)存储数据库。因为值(value)可以是字符串(String)、哈希(Hash)、列表(List)、集合(Sets)、有序集合(Sorted Sets)等类型。一般应用场景是数据量相对较小的更性能的操作和运算上。
2.2 MongoDB
MongoDB是基于分布式文件存储的数据库,由C++语言编写。是为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能相对更丰富,同时最像关系型数据库的存在。一般应用场景是用来解决海量数据的访问效率问题。