0301 - Java编程核心
2021-04-18 09:50:02 0 举报
AI智能生成
架构师技术栈之核心编程
作者其他创作
大纲/内容
算法
排序算法
分类
内排序
插入排序
直接插入排序
希尔排序
选择排序
简单选择排序
堆排序
交换排序
冒泡排序
快速排序
归并排序
基数排序
外排序
评估标准
时间/空间复杂度O
稳定性
查找算法
二分查找
分块查找
哈希查找
贪心算法
爬山问题
分治算法
动态规划
回溯算法
文件指纹算法
位图算法
布隆过滤器
设计模式
创建型6种
单例模式(Singleton)<br>
懒汉式
饿汉式
<br>
懒汉式(双重检测)
静态内部类
枚举类<br>
工厂模式(Factory)
简单工厂模式
子主题
工厂方法模式
具体工厂生产具体的产品,在简单工厂基础上增加了“抽象工厂”角色
抽象工厂模式
包含创建一族产品的工厂方法,每个方法对应一个产品族
建造者模式(Builder)
原型模式(Prototype)
背景
与其它创建型模式不同,原型模式不是在他们的基础上的改进
概念
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。本质: 通过一个原始对象为模版,克隆出更多一模一样的对象;<br>在java中就是clone方法;
目的
提高效率、绕过构造方法、使用方便
优缺点
优点:<br>--高性能<br>通过new进行创建对象时,需要首先获取class信息,计算出所需内存大小,分配内存,赋默认值,执行代码块、执行构造方法初始化 等一系列动作;<br>而使用clone方法,只需要根据原始对象大小分配内存,然后复制二进制流即可;省去了很多的计算和初始动作;因此性能会较高;<br>--绕过构造方法<br>这个即是优点,某些情况下可能也是缺点;<br>如果一个对象的初始化非常消耗性能,比如:通过加载数据库配置,则绕过构造方法会大大提高性能;<br>--使用简单<br>这也是创建型模式的基本优点,它隐藏了对象创建的内部细节;<br>最核心的目的:高性能、方便、快速的创建出大量一模一样的对象<br>-----------------------------------------------------------------------------------------------------------------------------------------------------------<br>缺点:<br>--绕过构造方法<br>--一些必须通过构造方法进行不同初始化的操作将无法执行;<br>
现时案例
jdk 中的cloneable接口
对象克隆
深克隆
是指复制的两个对象本身及对象的属性(包括所有递归属性)都是完全全新的对象;在内存是,是两块不同的内存块;
浅克隆
是指复制的两个对象本身是不同的,但是属性值引用的是同一个对象;即拷贝的是同一个同象的引用;
结构型7种
适配器模式(Adapter)
对象适配器
适配器与适配者之间是关联关系
类适配器
适配器与适配者之间是继承(或实现)关系
双向适配器
在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法
缺省适配器
在不需要实现接口中所有方法时,可以使用一个抽象类去实现该接口,并提供其中方法的默认实现
在一些开源框架中应用广泛:如Spring MVC中典型的HandlerInterceptor接口和HandlerInterceptorAdapter抽象类
代理模式(Proxy)
场景
假如你是一个业主,有一套500万的房子需要出售;你希望找一个合适的客户,签个合同,收了钱,然后把房子过户给客户就可以了;<br>但是,有太多的客户天天找你需要看房,询问,而且大部分都是没有诚意的客户,让你不胜其烦;<br>业主: 只需要签字收钱就好了,剩下的事情,如果有人能帮我处理就发了;<br>
图形化展示
概念
为其他对象提供一种代理以控制对这个对象的访问;<br>本质: 引入一个中介类, 这个类实现了被代理类相同的接口或继承自被代理类,对外假装成被代理对象,帮被代理对象处理一些非必要或不能做的事情;但核心功能,仍然通过调用被代理对象来实现;
目的
不修改原来代码的情况下,动态地给一个对象添加一些额外的职责和功能,或者添加一些控制功能,以限制对原对象的访问<br>本质:动态增加功能;把需要新增加的功能以代理的方式动态的添加到原对象上;
优缺点
优点:<br>--松耦合<br>在不修改原来代码的情况下,动态的为原类增加新功能<br>--扩展性高<br>只需要增加新的代理功能类,就可以对原类不断增加新功能<br>--灵活<br>通过动态代理,不修改调用方和被调用方的情况下动态增加新功能<br>----------------------------------------------------------------------------------------------<br>缺点:<br>--代理实现起来可能会比较复杂<br>--增加了中介类,可能会对性能有影响<br>----------------------------------------------------------------------------------------------<br>最核心的目的:在不修改原代码的情况下,动态的为对象增加或减少某些功能,以及控制对被代理类的访问<br>
应用场景
A、远程代理<br>B、虚拟代理<br>C、Copy-on-Write 代理<br>D、保护(Protect or Access)代理<br>E、Cache代理<br>F、防火墙(Firewall)代理<br>G、同步化(Synchronization)代理<br>H、智能引用(Smart Reference)代理 <br>
现实案例
spring @Aspect aop对应的实现
应用分类
JDK代理
静态代理
让代理类和目标类实现一样的接口,同时代理类中维护一个目标类对象的引用
动态代理
它是静态代理的改进,当代理接口发生改变时相应的代理对象也随之改变,让代理类实现InvocationHandler接口,动态为目标接口生成代理类
缺点:目标类必须实现接口
cglib代理
使用字节码技术(asm框架)动态创建目标类的子类作为代理类,突破了JDK代理目标类必须实现接口的限制
缺点:无法为final修饰的类或方法创建代理
装饰模式(Decorator)
背景
某些情况,当一个类已经存在,并且可以对外提供核心功能时,但是,某个时刻,希望对这个类进行功能增强(如:增加缓存);通常情况,我们可以修改原来的类,并增加对应的增强功能即可;<br>但是,这种方式违背了“开-闭”原则,需要修改原来的代码;而且不够灵活,如果有某个时刻又不想使用缓存,又需要修改原来的代码,显然,这不是一个很好的解决方案;<br>
概念
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。<br>本质: 引入一个中介类,这个类实现了被装饰者相同的接口,对外假装成被装饰者,并通过引用被装饰者,在调用被装饰者前后做一些附加功能(如:缓存,参数预处理);
目的
不修改原来代码的情况下,动态地给一个对象添加一些额外的职责和功能<br>本质:动态增加功能;把需要新增加的功能预先制作成零件,在需要时“动态“的添加到对象上;<br>
优缺点
优点:<br>--松耦合<br>在不修改原来代码的情况下,动态的为原类增加新功能<br>--扩展性高<br>只需要增加新的装饰类,就可以对原类不断增加新功能<br>--灵活<br>不需要通过继承来扩展,而且可以动态增加或去除新装饰类,从而随意对原对象增加或减少某些功能<br>-----------------------------------------------------------------------------------------<br>缺点:<br>--额外引入第三方<br>-----------------------------------------------------------------------------------------<br>最核心的目的:在不修改原代码的情况下,动态的为对象增加或减少某些功能<br>
应用场景
扩展类的功能时<br>动态增加或取消某些功能时
现实案例
JDK中的流处理;<br>ByteArrayInputStream<br>FileInputStream<br>ObjectInputStream <br>PipedInputStream
外观/门面模式(Facade)<br>
背景
我是一个辛苦一辈子的农民,攒了几十年钱,现在日子好了,也想建一套属于自己的小洋楼;首先,我要雇一个搬砖的和一个和泥的,还要一个会砌墙的人;可是我到哪里去找这些人,还要一个一个跟他们谈价钱;不知道他们和不和得来,会不会干一半不干了;哎,好烦;要是有一个人什么都会就好,我只要跟他谈,他一个人就能帮我把房子建好;<br>
图形化展示
概念
提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用。本质:就是化零为整;引入一个中介类,把各个分散的功能组合成一个整体,只对外暴露一个统一的接口;
目的
为了用户使用方便,把过度拆分的分散功能,组合成一个整体,对外提供一个统一的接口
优缺点
优点:<br>--松耦合<br>用户与子系统解耦,屏蔽子系统;可以提高子系统的独立性;<br>--使用简单<br>简化用户与子系统的依赖关系;<br>用户只与门面对接,有统一的入口;不需要知道所有子系统及内部构造;<br>----------------------------------------------------------------------------------<br>缺点:<br>不规范的编程方式<br>没有面向抽象编程,而是通过增加中介层,转换服务提供方的服务接口; <br>
使用场景
A:简化子系统复杂性时。<br>B:监控所有子系统时;通过门面控制了入口,可以统一监控;<br>C:希望封装和隐藏子系统时;<br>D:两历史系统进行改造并打通关系时;
实现案例
spring ApplicationContext;<br>它实现了Factory、ResourceLoader等接口,并通过引用这些接口的实例,对外统一提供:加载配置、解析资源、创建Bean、提供环境、启动流程等功能;<br>客户代码只需要操作context就可以获取spring的提供的功能,而无需关心内部的细节;<br>
桥接模式(Bridge)
组合模式(Composite)
享元模式(Flyweight)
行为型11种
观察者模式(Observer)
模板方法模式(Template)
策略模式(Strategy)
迭代器模式(Iterator)
责任链模式(Chain of Responsibility)
命令模式(Command)
状态模式(State)
访问者模式(Visitor )
中介者模式(Mediator)
备忘录模式 (Memento )
解释器模式(Interpreter)
接口服务
RPC
即Remote Procedure Call,远程过程调用。客户端通过网络实现对服务器上的方法进行调用。
常见框架
Alibaba dubbo
Google grpc
Facebook Thrift
RMI
可以看成是RPC的Java实现,同时他也是JNDI(Java Naming and Directory Interface,Java命名和目录接口)规范的一种实现。
主要组成
Naming类
LocateRegistry类
Remote接口:代表远程对象
UnicastRemoteObject类
使用步骤
1、声明一个远程接口(如HelloService),并继承Remote接口;
2、在远程接口中声明需要远程调用的方法,注:必须声明抛出RemoteException异常
3、编写远程对象接口的实现类(如HelloServiceImpl),必须继承UnicastRemoteObject类,方法中的参数必须实现Serializable接口
4、编写服务端程序(即被远程调用的一方)
使用LocateRegistry.createRegistry(port);绑定端口
使用Naming.bind()方法将HelloServiceImpl对象进行绑定
5、编写客户端程序
使用Naming.lookup()方法根据服务端绑定的地址获取远程对象
调用helloService对象的方法
Web Service
SOAP协议
简单对象协议,它是一种轻量级的、简单的、基于XML和HTTP的web数据交换协议
WSDL
Web服务描述语言,用于描述web服务即其函数、参数和返回值的语言
WSDD
即Web Service Deployment Descriptor,web服务部署描述符。
常见框架
Apache Axis
Apache CXF
RESTful
即表述性状态传递(Representational State Transfer,简称REST),它是一种软件架构风格,可以完全使用HTTP协议实现,适用于完全无状态的CRUD操作。
对资源的操作有获取、创建、修改和删除,与HTTP协议提供的GET、POST、PUT、DELTE等方法相对应
通过Spring MVC来实现
org.springframework.web.filter.HiddenHttpMethodFilter 过滤器(由于浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,此过滤器就可以将其转换成标准的HTTP方法,使得支持PUT、DELETE等请求)
统一异常处理
@ExceptionHandler注解
实现HandlerExceptionResolver接口
token身份验证
JavaSE
基础语法
数据类型
8种基本数据类型
整形:1byte、2short、4int、8long
浮点型:4float、8double
字符型:2char
布尔型:boolean
引用类型
类
接口
数组
静态初始化:int[] a = {1,2,3};
动态初始化:int[] a = new int[2];
数组默认初始化:int a[] = new int[2]; //默认值为0,0
枚举类型
enum
类型转换
运算符与表达式
算法运算符
关系运算符
赋值运算符
位运算符
移位运算符
流程控制结构
顺序结构
选择结构
循环结构
方法重载 Overload
针对同一个类或接口而言
同一个类中的多个同名方法之间参数列表必须不同,与返回值相同无关。
方法重写/覆盖 Override
以继承为基础,子类可以覆盖父类实现的方法,实现自己的功能。
<div>1、要保证子类中重写的方法签名要和父类一直,即返回值、方法名、参数列表完全一致;<br>2、子类抛出的异常不能超过父类相应方法抛出的异常(子类异常不能大于父类异常);<br>3、子类中重写的方法访问控制权限不能低于父类。<br></div>
不允许方法重写的两种特殊情况
private关键字修饰的方法
final关键字修饰的方法
面向对象
对象
在软件系统中视一切事物皆为对象,不仅包括现实中客观存在的事物,还包括抽象的东西
类
对于同一类型对象的抽象表达
接口
对行为的抽象
三大特性
封装
对内将对象具有的特征和行为进行统一管理;对外隐藏实现的细节仅提供公开接口。
属性:用于表达对象具有的某些特征
方法:定义一系列对属性进行操作的行为
继承
用于子类对父类的功能的扩展
表现形式
子类继承父类
子类实现接口
多态
即多种形态,通常表现于接口或抽象类中抽象方法的不同实现
表现形式就是方法重写
七大设计原则
单一职责原则
简单而言,就是类所有的功能尽量单一
开闭原则
对扩展开发,对修改关闭
依赖倒置原则
抽象不应该依赖于细节,细节应该依赖于抽象
针对抽象(抽象类或接口)编程,而不是针对实现编程
里氏替换原则
所有引用基类的地方必须能透明地使用其子类的对象
接口隔离原则
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖哪些它不需要的接口
合成复用原则
复用时要尽量使用组合/聚合关系,少用继承
迪米特法则
一个软件实体应该尽可能少地与其他实体发送相互作用,低耦合。(少和陌生人说话)
反射
API
Class 类:反射的核心类,可以获取类的属性,方法等信息<br>
Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值
Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法
Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法
获取Class 对象的3种方法
Person p=new Person(); Class clazz=p.getClass();<br>
Class clazz=Person.class;<br>
Class clazz=Class.forName("reflection.Person");
注解
4种标准元注解
@Target 修饰的对象范围<br>
用于描述注解使用的范围(即被描述的注解可以使用在什么地方)
ElementType
1、CONSTRUCTOR:用于描述构造器
2、FIELD:用于描述字段
3、LOCAL_VARIABLE:用户描述局部变量
4、METHOD:用于描述方法
5、PACKAGE:用于描述包
6、PARAMETER:用于描述参数
7、TYPE:用于描述类、接口或enum声明
@Retention 定义被保留的时间长短
用于描述生命周期(即被描述的注解在什么时间内有效)
RetentionPoicy
1、SOURCE:在源文件中有效
2、CLASS:在class文件中有效
3、RUNTIME:在运行时有效
@Documented 描述-javadoc<br>
代表着此注解会被javadoc工具提取成文档
@Inherited 阐述了某个被标注的类型是被继承的
允许子类继承父类的注解
@Repeatable(JDK8新增)
允许注解使用多次
内建注解
@Override
供编译器检查,保证方法重写正确
@Deprecated
标记过时的方法或类型,并建议在javadoc指明替换方法或类型
@SuppressWarnings
使编译器忽略警告
@FunctionalInterface(JDK8新增)
供编译器检查,接口是否满足函数式接口条件
自定义注解
区别于接口定义,使用@interface进行声明
异常
分类
Error
Error 类是指java 运行时系统的内部错误和资源耗尽错误。
RuntimeException 运行时异常
不需要显示的程序中进行try...catch处理
如:NullPointerException、illegalArgumentException、ArrayIndexOutOfBoundException等
Exception
CheckedException 检查异常<br>
必须在程序中进行异常捕获处理
如IOException、SQLException、FileNotFoundException等
处理方式
throw
throws
try catch finally
关键字
transient
底层实现原理
transient的作用就是把修饰的字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化
序列化两种方式有什么区别?
实现Serializable接口
java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加<br>关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
实现Exteranlizable接口
需要重写writeExternal和readExternal方法,它的效率比Serializable高一些,并且可以决定<br>哪些属性需要序列化(即使是transient修饰的),但是对大量对象,或者重复对象,则效率低。
静态变量会被序列化吗?
静态变量不管是不是transient关键字修饰,都不会被序列化
泛型
Java是一种假的泛型
JavaEE
Servlet
生命周期
init(ServletConfig confg)方法,在Servlet初始化时被调用
service(ServletRequest quest, ServletResponse response)方法,处理用户请求
destroy()方法,在Servlet销毁时被调用
配置
web.xml配置servlet和servlet-mapping
@WebServlet注解
ServletConfig
代表当前Servlet
获取Servlet初始化参数init-param
ServletContext
代表当前web应用
获取web应用初始化参数context-param
整个web应用数据共享
ServletRequest
代表客户端请求
请求转发forward,转发前后同一个请求
ServletResponse
代表服务端响应
请求重定向redirect,前后是两个不同的请求
JSP
九大内置对象
pageContext:PageContext类型,页面上下文对象
request:ServletRequest类型,表示HTTP请求
response:ServletResponse类型,表示HTTP响应
session:HttpSession类型,表示当前会话
application:ServletContext类型,表示当前Web应用
exception:Throwable类型
out:JspWrite类型,JSP页面输出流
page:Object类型,页面对象
config:ServletConfig对象,表示当前Servlet
四大作用域
page: 表示页面范围
request:表示请求范围
session:表示当前会话范围
application:表示当前web应用范围
JSTL
使用步骤
导入standard.jar和jstl.jar包到项目中
在jsp页面上使用taglib标签引入,指定前缀和URI
分类
核心标签库
引入核心标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:if>、<c:set>、<c:out>、<c:choose>
格式化标签库
格式化标签用来格式化并输出文本、日期、时间、数字
引入格式化标签库:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
常用标签
<fmt:formatDate>、<fmt:parseDate>、<fmt:message>等
SQL标签库
SQL标签库提供了与关系型数据库进行交互的标签
引入格式化标签库:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/sql"%>
常用标签
<sql:setDataSource>、<sql:query>、<sql:update>、<sql:param>等
JSTL函数
其中包含了一系列标准函数,大部分式字符串处理函数
引入标签库:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/functions"%>
常用函数
fn:replace()、fn:split()、fn:startsWith()、fn:substring()等
自定义标签
继承了javax.servlet.jsp.tagext.SimpleTagSupport类,并重写doTag方法
在项目WEB-INF目录下创建tld文件(其中描述了标签的语法)
EL表达式
Expression Language表达式语言的灵感来自于ECMAScript和XPath表达式,它提供了在JSP中简单表达式的方法,让JSP的代码更简化。
语法:${expression}
监听器Listener
分类
ServletRequestListener
ServletContextAttributeListener
HttpSessionListener
HttpSessionAttributeListener
ServletContextListener
ServletContextAttributeListener
配置
web.xml配置listener
@WebListener注解
过滤器Filter
生命周期
init()
初始化,由Servlet()容器(如tomcat)创建
doFilter()
处理请求过滤
destroy
销毁、由servlet容器完成
配置
web.xml配置filter和filter-mapping
@WebFilter注解
Cookie
为了弥补Http协议无状态的不足而引用的机制,由服务端创建,但由客户端(浏览器)保存。
应用:客户端记住密码
Session
由服务端创建,并保存到服务器端
应用:用户登录验证
四种会话跟踪技术
1、URL重写:将会话ID写到URL之后,服务端通过会话识别不同用户;
2、隐藏表单域:将会话ID放到表单的隐藏域中,随者表单提交到服务器;
3、Cookie:第一次请求时服务器主动发一小段信息给浏览器(即Cookie),下次请求时浏览器自动附带该段信息发送给服务器,服务器读取Cookie识别用户;
4、Session:服务器为每个用户创建一个Session对象保存到内存,并生成一个sessionID放到Cookie发送给浏览器,下次访问sessionID会随Cookie传回来,服务器根据sessionID找到对应的Session对象。
URL编码
网络路径编码:UTF-8,如xxx.com/title/编码
查询字符串:操作系统默认编码,win7是GBK
GET和POST方法的编码:网页的编码
Ajax调用中的编码:IE总是采用操作系统中的默认编码,而Firefox总是采用UTF-8编码
XML
XML基本语法
文档说明
约束
DTD约束
Schema约束
XML解析
DOM
JDOM
Dom4J
SAX
websocket
基于TCP,全双工通信协议,可实现服务端信息主动推送,支持各种消息格式
主要API
注解
表示Websocket服务端
@ServerEndpoint
事件处理
@OnOpen、@OnMessage、@OnClose、@OnError
类
扩展配置
javax.websocket.server.ServerEndpointConfig.Configurator
接口
会话
javax.websocket.Session
消息编码
javax.websocket.Encoder
消息解码
javax.websocket.Decoder
应用场景
Web聊天室
服务端消息通知
消息服务JMS
API
Message
消息是消息服务器在客户端直接发送的一条条信息
消息类型
StreamMessage:Java原始值的数据流对象
MapMessage:一套名称-值对
TextMessage:一个字符串对象
ObjectMessage:一个序列化的Java对象
BytesMessage:一个字节数据流
ConnectionFactory
用于创建Connection对象的工厂,通常通过JNDI获取
Connection
连接对象和JMS提供者通信的媒介
Destination
目标是受控对象,在JMS中表示一个队列或者一个主题
点对点模型:Queue子接口
发布/订阅模型:Topic子接口
Session
用于创建消息的生产者、消费者和消息
MessageProducer
消息生成者,也叫消息发送者
TopicPublisher子接口
MessageConsumer
消息消费者,也叫消息接收者
TopicSubscriber子接口
开发步骤
(1)用JNDI得到ConnectionFactory对象;<br>(2)用ConnectionFactory创建Connection对象;<br>(3)用Connection对象创建一个或多个JMS Session;<br>(4)用JNDI得到目标队列或主题对象,即Destination对象;<br>(5)用Session和Destination创建MessageProducer和MessageConsumer;<br>(6)通知Connection开始传递信息。
两种消息传递方式
PERSISTENT:持久化消息,将使用暂存后再传送的机理投递
NON_PERSISTENT:非持久化消息,最多只能被投递一次(默认)
分类
点对点模型(P2P)
消息队列Queue
消息生成者(发送者)MessageProducer
消息消费者(接收者)MessageConsumer
同步、异步(通过MessageListener实现)
发布订阅模型(Pub/Sub)
主题Topic
主题发布者TopicPublisher
主题订阅者TopicSubscriber
框架
ActiveMQ、RocketMQ、RabbitMQ、Kafka
命名服务JNDI
事务API JTA
持久化API JPA
邮件服务
JavaMail
Spring JavaMailSender
0 条评论
下一页