Java进阶技术栈
2021-07-26 14:31:17 2 举报
AI智能生成
Java进阶技术栈
作者其他创作
大纲/内容
1、环境变量
1.环境配置
1、基本数据类型
2、对象
3、类
4、变量类型
5、修饰符
6、运算符
7、循环结构
8、条件语句
9、switch case
10、Number & Math
11、Character 类
12、String
13、StringBuilder
14、数组
15、日期时间
16、正则表达式
17、 方法
18、Java.io
19、Scanner
20、异常处理
2.基础语法
1、封装
2、继承
3、多态
4、抽象类
5、接口
6、枚举
7、重载重写
8、包
3.面向对象
1、数据结构
2、集合框架
1、ArrayList
2、LinkedList
3、List
1、默认hash表大小为16
1、HashMap
2、Hashtable
3、LinkedHashMap
4、TreeMap
4、Map
1、HashSet
2、LinkedHashSet
5、Set
6、Iterator
7、Object
8、泛型
9、序列化
10、网络编程
11、JavaMail
12、多线程编程
13、Java 文档注释
4.高级教程
1、必须有函数式接口
1、前提
() -> System.out.println("");
1、无参数无返回值
1、(x) -> System.out.println(x);
2、x -> System.out.println(x);
2、有一个参数无返回值
3、有两个参数并且有返回值,并且lambda体中有多条语句
4、有两个参数并且有返回值,并且lambda体中有一条语句,大括号和省略号都可以不用写
5、lambda表达式的参数列表可以不用写,因为JVM编译器通过上下文可以推断出数据类型,即类型推断
1、语法格式
1、lambda表达式
接口汇总只有一个抽象方法的接口,称为函数式接口,可以使用注解@FunctionalInterface
1、accept(T t)
1、Consumer<T> 消费型接口
1、T get()
2、Supplier<T> 供给型接口
1、R apply(T t)
1、tet(T t)
4、Predicate<T> 断言型接口
内置函数式接口
2、函数式接口
若果Lambda体重的内容有方法已经实现了,我们可以使用方法引用
Lambda体重调用方法的参数列表和返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致
1、概述
1、对象::实例方法名
2、类::静态方法名
3、类::实例方法名
2、语法格式
3、方法引用引用
Suplier<Employee> su = Employee::new; 匹配无参构造器
需要调用的构造器参数需要与函数式接口的参数个数保持一致
2、注意
4、构造器引用
Type::new
5、数组引用
是数据渠道,用于操作数据源(集合,数组等)锁生成的元素序列。集合讲的是数据,流讲的是计算
定义
Stream 自己不会存储元素
Stream不会改变源对象,相反,他们会返回一个持有结果的新的Stream
Stream操作是延迟执行的,这移位着他们会等到需要结果的时候才执行
注意
1、通过Collection系列结合提供的stream() 串行流或parallelStream()并行流
2、通过Arrays中 的静态方法stream() 获取数组流
3、通过Stream类中的静态方法of()
1、迭代
2、生成
4、创建无限流
1、创建Stream
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”
1、filter
截断流,使其元素不超过给定数量
2、limit
跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流,与limit(n)互补
3、skip(n)
筛选,公国流锁生成元素的hasCode 和 equals去除重复元素
4、distinct
1、筛选和切片
flatMap 接收一个函数作为参数,将流中的每个值都转换成一个流,然后把所有流连接成一个流
List的场合可以 类比创建一个新的List并执行List add 和 addAll
map 将对象转换为其他对象
2、映射
Comparable指定的顺序
1、sorted() 自然排序 Comparable
2、sorted(Comparator com) 定制排序
3、排序
1、allMatch 检查是否匹配所有元素
2、anyMatch 检查是否至少匹配一个元素
3、noneMatch 检查是否没有匹配所有元素
4、findFirst 返回第一个元素
5、findAny 返回当前流中的任意元素
6、count 返回流中元素的总个数
7、max 返回流中的最大值
8、min返回流中最小值
4、查找与匹配 filter
2、中间操作
5、规约 reduce 可以将流中元素反复结合起来,得到一个值
搜集所有人的名字
6、搜集 collect
3、终止操作
2、操作步骤
6、Stream
当执行新的任务时,他可以拆分成更小的任务执行,并将小的任务加到线程中,然后再送一个随机的线程队列偷一个放到自己的队列中java8中Stream API可以申明性通过parallel()与sequential()在并行流与顺序流之间切换
1、工作窃取模式
2、效率比较高可以更好的利用cpu资源
7、并行流和串行流 Fork/Join
1、Optional.of 创建一个 Optional 实例
2、Optional.empty() 创建一个空的 Optional 实例
4、isPresent() : 判断是否包含值
5、orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
6、orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
7、map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
8、flatMap(Function mapper):与 map 类似,Function要求返回值必须是Optional
8、Option容器类
1、接口中可以用default中定义默认方法
2、类优先原则-如果一个接口中定义了一个方法,而另一个父类中也定义了同名方法,则执行类中的方法
3、接口多实现中都有同名的默认方法,则接口必须重写改方法
9、接口默认方法
10、接口静态方法 与普通静态方法一致
1、线程安全问题
1、问题
1、传统时间函数
1、DateTimeFormatter
2、LocalDate
3、LocalTime
1、now 现在
1、of 通过参数年月日,构建时间
4、LocalDateTime
1、now() 默认获取utc时间 格林尼治时间 本地时差 8小时
2、atOffset(ZoneOffset.xxxx) 带偏移量的时间
3、toEpochMilli
5、Instance 已Unix元年为起点时间戳
6、Duration 两个时间之间的间隔
7、Period 两个日期之间的间隔
8、ZoneDate
9、ZoneTime
1、ZoneId.of("xx/shanghai")
10、ZoneDateTime
2、新的api
11、时间函数
1、必须先创建容器
2、添加RepeatAble注解
12、重复注解
1、注解任意类型
2、Target TYPE_PARAMATER
13、类型注解
1、Java 8 新特性
2、Java 9 新特性
5、JDK
1.Java SE
Servlet
2.Web基础
1、ClassPathXmlApplicationContext
2、AnnotationConfigApplicationContext
1、BeanDefinitionRegistry
1、核心组件
1、 spring-core
1、核心模块源码
1、调用父级 GenericApplicationContext 构造函数
1、设置当前环境信息
1、AnnotatedBeanDefinitionReader
1、设置当前环境信息 与 DefinitionReader 类似
2、ClassPathBeanDefinitionScanner
2、调用本类构造函数实例化BeanDefinition
1、设置基本环境(状态,时间)
2、initPropertySources
3、校验本环境下必须的参数配置信息
4、earlyApplicationListeners 存储前期程序监听
5、初始化前期程序事件 earlyApplicationEvents
1、prepareRefresh 准备上下文环境
1、获取Bean工厂序列化ID
2、将BeanFactory存储 serializableFactories
1、刷新Bean工厂 refreshBeanFactory
2、获取Bean工厂
2、obtainFreshBeanFactory 获取告诉子类初始化Bean工厂
1、初始化类加载器 ClassLoader
2、加载标准表达式解析器 StandardBeanExpressionResolver
3、加载资源编辑器 ResourceEditorRegistrar
4、加载前置后置处理器 ApplicationContextAwareProcessor
1、EnvironmentAware
2、EmbeddedValueResolverAware
3、ResourceLoaderAware
4、ApplicationEventPublisherAware
5、MessageSourceAware
6、ApplicationContextAware
5、忽略给定接口的自动装配功能 ignoreDependencyInterface
1、BeanFactory
2、ResourceLoader
3、ApplicationEventPublisher
4、ApplicationContext
6、注册有冲突(多个)实例的Bean registerResolvableDependency
7、加载后置处理器 ApplicationListenerDetector
1、加载前置后置处理器 LoadTimeWeaverAwareProcessor
2、设置临时类加载器 ContextTypeMatchClassLoader
8、织入Bean的场合
1、注册环境Bean
9、没有注册环境Bean的场合
1、注册配置Bean
10、没有注册配置Bean的场合
1、注册系统环境Bean
11、没有注册系统环境Bean的场合
3、prepareBeanFactory 对bean工厂进行填充属性
4、postProcessBeanFactory 留个子类去实现改接口
1、获取Bean工厂前后置处理器 getBeanFactoryPostProcessors
postProcessBeanDefinitionRegistry
1、如果前后置处理器为BeanDefinitionRegistryPostProcessor类型
1、遍历所有的前后置处理器
1、transformedBeanName 别名转换
2、getSingleton 尝试缓存中获取Bean
1、getParentBeanFactory 获取父容器
2、父容器获取的场合
3、getMergedLocalBeanDefinition
4、checkMergedBeanDefinition
1、isDependent
2、registerDependentBean
3、getBean 获取DependOn Bean
1、存在的场合
5、获取DependOn 依赖Bean的名称
1、this.singletonObjects.get(beanName)
2、beforeSingletonCreation
1、resolveBeanClass
2、prepareMethodOverrides
3、resolveBeforeInstantiation
4、doCreateBean
1、createBean
3、singletonFactory.getObject()
4、afterSingletonCreation(beanName)
5、addSingleton
getSingleton
6、创建单例bean
3、获取为空的场合
1、doGetBean
2、getBean
1、如果beanFactory是BeanDefinitionRegistry
2、invoke Bean工厂前后置处理器 invokeBeanFactoryPostProcessors
5、invokeBeanFactoryPostProcessors调用我们的Bean工厂的后置处理器
6、registerBeanPostProcessors 调用Bean的后置处理器
7、initMessageSource 初始化国际化资源
8、initApplicationEventMulticaster 创建事件多播器
9、onRefresh 这个方法同样也是留给子类实现的 SpringBoot 也是从这个方法启动tomcat的
10、registerListeners把事件监听器注册到多播器上
11、finishBeanFactoryInitialization 实例化剩余的单实例bean
12、finishRefresh 最后容器刷新 发布刷新事件(Spring Cloud 也是从这里启动的)
3、调用refresh()刷新Bean
1、AnnotationConfigApplicationContext
1、ApplicationContext
1、Bean 注入流程
控制反转
1、控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
2、使用 IOC 目的:为了耦合度降低
1、xml解析
2、工厂模式
3、反射
2、底层原理
2、原理
2、IOC
1、编译期织入
2、类加载期织入
3、运行期织入
1、织入切面的方式
3、AOP
1、方便解耦
2、简化开发
3、aop编程的支持
4、方便程序测试
5、方便和其它框架继承
6、声明式事务,方便事务管理,降低api的开发难度
4、特点
事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操 作都失败
不可分割
1、原子性
操作之前和操作之后总量不变
2、一致性
多事务操作不影响
3、隔离性
持久化
4、持久性
2、特性 ACID
1、编程式事务管理
加在方法上,则该方法开启事务
加载类上,则该类的所有方法开启事务
如果有事务,则当前方法在该事务中运行,如果没有事务,则创建事务
1、REQUIRED
无论是否有事务都会创建新的事务,有事务将会把事务挂起
2、REQUIRED_NEW
如果有事务则在事务中运行,没有事务则不在事务中执行
3、SUPPORTS
当前方法不应该在事务中运行,如果有,则将事务挂起
4、NOT_SUPPORTED
当前方法必须在事务中运行,如果没有则抛出异常
5、MANRORY
当前方法不应该在事务中运行,如果存在则抛出异常
6、NEVER
如果有事务在运行,当前方法应该在嵌套的事务中运行,如果没有就开启一个新事务,并在自己的事务中运行
7、NESTED
2、传播性 propagation
事务有特性成为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题
1、脏读
2、不可重复读
3、虚(幻)读
2、不考虑隔离性,并发事务的场合问题
3、事务隔离级别 ioslation
4、timeout 超时时间
5、readonly 是否只读
6、rollbackFor 回滚
7、noRollbackFor 不回滚
@Transactional
1、注解
2、xml配置
2、声明式事务管理
3、方式
AOP
4、原理
TransactionManager
5、事务管理API
5、事务
3.Spring Framework
4.SpringMvc
5.Mybatis
1、各版本差异
6.SpringBoot
1、版本2.5.2
2、进入维护阶段,将废弃
1、Spring Security OAuth
1、实验室产品
2、版本
子主题 3
2、spring-authorization-server
1、组件
7.SpringSecurity
8.Spring Session
1、基本原理
1、名字来由 前四个字母分别有 Naming 和 Configuration的前两个字母 s为Service
1、简介
配置中心 + 服务注册中心 相当于Eureka + Config
2、功能
1、官网:
2、Git地址
3、地址
4、安装运行
1、Nacos
2、Sentinel
路由是构建网关的基本模块,它由ID,目标URI,一系列断言和过滤器组成,如果断言为true则匹配该路由
1、Route路由
参考java8 断言
2、Predicate断言
SpringGateway的GatewayFIlter实例
3、Filter过滤
2、核心概念
转发和执行过滤链(日志,权限等)
3、核心逻辑
3、SpringCloud Gateway
4、Seata
5、Canal
6、ShardingSphere
1、SpringCloud Alibaba
1、版本3.0.0
2、将废弃
2、spring-cloud-security
2、组件
9.SpringCloud
3、Spring
子主题 1
1、学习书籍
2、跨语言
3、jvm字节码
1990年发布 JamesGosling
2000年 JDK 1.3 Java Hotpot Virtual Machine
2003年 Scala Groovy
200JDK 1.5 改名为 JavaSE 5.0
2006年 JDK 6发布 并开源OpenJDK
2007年 Clojure
2008年 Oralle 收购了BEA 得到 JRockit虚拟机
2010 年Oracle收购Sun
2011年 JDK 7发布 JDK 1.7u4中正式启用了新的垃圾回收器G1
2017 JDK9发将G1设置为默认GC IBM的J9开源
2019年 JDK12发布 加入RedHat领导开发的Shenandoah GC
4、历史
VMware
1、系统虚拟机
1、是一台执行Java字节码的虚拟计算机,Java字节码也未必由java语言编写,为二进制
1、一次编译到处运行
2、自动内存管理
3、自动垃圾回收功能
2、特点
3、位置
1、整体结构图
HotSpot VM是目前市面上高性能虚拟机的代表作之一
采用解释器与即时编译器并存的架构
2、代表
4、JVM的整体结构
1、源代码
2、Java编译器
3、字节码
1、类加载器
2、字节码校验器
3、翻译字节码(解析执行)/JIT 编译编译器)
4、JVM
5、操作系统
5、Java代码执行流程
Java指令
1、基于栈指令架构
2、寄存器的指令集架构
6、指令流的分类
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的
1、虚拟机启动
一个运行中的java虚拟机有着一个清晰的任执行java程序,程序开始执行时他才运行,程序结束就停止。执行一个所谓的java程序的时候,真真正在执行的是一个叫做Java虚拟机的进程
2、虚拟机执行
1、程序正常执行结束
2、程序在执行过程中遇到了异常或错误而异常终止
3、由于操作系统错误而导致Java虚拟机进程终止
4、线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作
5、除此之JNI(Java NativInterface)规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况
3、虚拟机的退出
7、JVM生命周期
1996 年 JDK1.4时被淘汰
只提供了解释器
现在的Hotspot虚拟机内置了Classic VM
1、Sun Classic VM
jdk1.2时 sun提供了此虚拟机
虚拟机可以知道内存中某个位置的数据具体是什么类型
热点探测
编辑器与解释器混合工作
2、Exact VM
97年被sun公司收购
JDK1.3 成为默认虚拟机
方法区独有
热点代码的探测技术
通过计数器找到最具编译价值的代码,触发即时编译或栈上替换
解释器与编译器协同工作,
3、HotSpot VM
不包含解释器,不关注程序启动速度
1、专注于服务器端应用
2、是世界上最快的JVM
3、MissioControl
4、BEA 被Oracle收购 2008年
4、JRockit
1、简称IT4J 内部代号J9
5、IBM J9
针对移动端Java ME产品线
6、KVM 和 CDC/CLDC Hotspot
硬件绑定
7、Azul VM
BEA公司开发
8、Liquid VM
IBM Intel
9、Apache Harmony
微软
10、Microsoft JVM
阿里巴巴
11、Taobao JVM
安卓
12、Dalvik VM
2018年 Oracle公司 未来
13、Graal VM
8、JVM发展历程
JVM
2、程序虚拟机
5、虚拟机
1、JVM与java体系结构
从文件系统或者网络中加载Class文件,class文件在文头中有特定的文件标识
ClassLoader只负责Class文件的加载,至于它是否可以运行,则Execution Engine决定
加载的类信息存放于一块成为方法区的内存控件,除了类的信息外,方法区中还会存放运行时常量池信息,
1、作用
1、通过一个类的全限定名获取定义此类的二进制字节流
2、讲这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
引导加载器
扩展类加载器
系统类加载器
2、分类
1、加载阶段
目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全,主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证
1、验证 Verify
为类变量分配内存并且设置该类变的默认初始值,即零值。这里不包含含有final修饰的static,因为final在编译的时候就会分配了,准备阶段会显示的初始化。这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中
2、准备 Prepare
将常量池中的符号引用转化为直接引用的过程。事实上,解析操作往往会伴随着JVM在执行完初始化之后再执行,符号引用就是一组符号来描述所引用的目标,符号引用的字面量形成明确定义在Java虚拟机规范的Class文件格式中,直接引用就是指向目标的指针、相对偏移量或一个间接定位到目标的句柄。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等,对应常池中的CONSTANT_Class_info\\CONSTANT_Fieldref_info、CONSTANT_Methodref_info等
3、解析 Resolve
2、链接阶段
3、初始化阶段
2、过程
2、类加载子系统
3、运行时数概述及线程
4、程序计数器
5、虚拟机栈
6、本地方法接口
7、本地方法栈
8、堆
9、方法区
10、直接内存
11、执行引擎
12、StringTable
13、垃圾回收概述
14、垃圾回收相关算法
15、垃圾回收相关概述
16、垃圾回收器
1、内存与垃圾回收
2、字节码与类的加载
3、 性能监控与调优
4、大厂面试题
1、实现Runnable接口 重写run()
2、继承Thread类,重写run();
1、无返回
1、需要FutureTask支持用于接收运算结果,是Futrue接口的实现类,可以用闭锁 类似于 CountDownLatch
2、利用线程池;
2、有返回
1、创建执行线程的方式
当多个线程访问共享数据时,彼此数不可见的
1、概述:
线程加锁,效率会变低
互斥锁
2、synchronized
可以从内存中获取变量值
2、修饰效率会变低但比synchronized 效率高,不具备互斥性,不能保证原子性
3、volatile关键字
1、原子变量
1、内存值
2、预估值
3、更新值
2、CAS算法保证原子性Compare And Swap 是硬件对于并发操作共享数据的直吹
4、Aotomic
1、锁分段机制
2、分段,每段对应链表
3、每段都是独立锁
4、1.8后改为cas
5、ConcurrentHashMap
每次修改都复制没有线程安全问题,添加操作多时,效率低,因为每次添加都会进行复制,但并发迭代操作多时,效率高
6、CopyOnWriteArrayList
在完成某些运算时,只有其它所有线程的运算全部完成,当前运算才继续执行
7、CountDownLatch 闭锁
2、内存可见性
1、同步代码块
2、同步方法
1、用synchronized修饰 1.5以前 隐试锁
需要通过Lock方法上锁,并通过unlock释放锁,必须释放
2、同步锁 Lock 1.5以后 显式锁
1、方法
3、多线程安全问题
1、虚假唤醒
2、wait
1、condition
3、lock的唤醒机制
4、等待唤醒机制
5、线程按序交替
1、写写的场合需要锁
2、读写的场合需要锁
3、读读的场合不需要锁
1、锁的场合
6、读写锁ReadWriteLock
7、线程8锁
1、ThreadPoolExecutor
3、ScheduleThreadPoolExecutor
2、ScheduleExecutorService
1、创建线程池
2、为线程池的线程分配任务
3、关闭线程池
线程使用
1、ExecutorService
1、Executor
8、线程池
9、分支合并框架
1、JUC
5、并发编程
6、高并发架构设计
1、后端技术
1、Keepalived
2、nginx
1、redis
3、缓存
1、rabbitmq
2、rocketmq
3、kafaka
4、消息队列
5、Skywalking
6、Elk
7、Zabbix
8、MinIO
1、spring-boot-maven-plugin
2、maven-compiler-plugin
3、maven-source-plugin
4、maven-javadoc-plugin
5、maven-dependency-plugin
6、maven-jar-plugin
7、maven-resources-plugin
8、maven-surefire-plugin
9、cobertura-maven-plugin
10、dockerfile-maven-plugin
1、插件
9、Maven
1、Idea 中追加单元测试 在对应类上 Shift + Ctrl + T /Shift + Alt + T
2、静态引入 直接可以使用静态方法就不用加包名
1、应用
10、Junit
2、中间件/组件
1、为什么需要docker
2、使用docker的好处
3、容器和虚拟机的区别
1、基本概念
1、Linux安装
2、Windows安装
2、环境安装
1、-d
2、--cidfile
超链接
3、--pid
4、--uts
5、--ipc
1、--dns
2、--network="bridge"
3、--network-alias=[]
4、--add-host=""
5、--mac-address=""
6、--ip=""
7、--ip6=""
8、--link-local-ip=[]
6、网络设置
1、docker run
子主题 2
3、基本命令
1、Docker基础
2、Dockerfile
1、工程(project)
2、服务(service)
3、容器(container)
2、将容器分为三层
1、默认为docker-compose.yml
2、自定义配置文件
3、工程配置文件
4、安装
1、-f --file
2、-p --project-name
3、--verbose
4、-v,-version
5、--log-level
1、基本命令格式
2、docker-compose ps
2、-no-color
3、-no-deps
4、--force-recreate
5、–no-recreate
6、–no-build
7、–build
8、–abort-on-container-exit
9、-t
10、–remove-orphans
3、docker-compose up
1、-t
4、docker-compose stop
5、docker-compose -h
1、–rmi type
3、–remove-orphans
6、docker-compose down
1、-f
7、docker-compose logs
1、–compress
2、–force-rm
3、–no-cache
4、–pull
6、–build-arg key=val
8、docker-compose bulid
1、–ignore-pull-failures
2、–parallel
3、–quiet
9、docker-compose pull
10、docker-compose restart
2、-v
11、docker-compose rm
12、docker-compose start
13、docker-compose run
14、docker-compose scale
15、docker-compose pause
16、docker-compose kill
1、–resolve-image-digests
3、–services
4、–volumes
17、docker-compose config
1、–force-recreate
2、–no-recreate
3、–no-build
4、–build
18、docker-compose create
2、–privileged
3、–user
4、-T
5、–index=index
19、docker-compose exec
1、–protocol=proto
2、–index=index
20、docker-compose port
1、–ignore-push-failures
21、docker-compose push
22、docker-compose stop
23、docker-compose uppause
5、基本命令
1、模板示例
1、version
1、image
1、context
2、dockerfile
2、build
3、command
4、container_name
5、depends_on
6、PID
7、ports
8、extra_hosts
9、volumes
10、volumes_from
11、dns
12、expose
13、links
14、net
2、service
3、networks
5、模板文件
3、Docker compose
4、Docker Machine
5、Docker swarm
1、Docker
2、Kubernetes
3、git
4、jenkins
5、Sonar
6、Yapi
3、项目工具
1、Windows
1、Redhat
2、CentOS
2、Ubuntu
3、Suse
1、发行版本
2、Linux
4、服务器
1、Mysql
2、Oracle
1、关系型数据库
2、非关系型数据库
H2 是一个用 Java 开发的嵌入式数据库,它本身只是一个类库,即只有一个 jar 文件,可以直接嵌入到应用项目中
1、最常使用的用途就在于可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据
2、用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态
3、作为缓存,即当做内存数据库,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表
2、用途
1、H2
3、嵌入式数据库
5、数据库
1、Vue
1、基础简介
1、bpmn-js
6、前端
7、算法
8、大数据
1、系统分析
2、系统架构
3、项目管理
9、项目
1、概述:一个类只负责一个职责
1、降低类的复杂度
2、提高类的可读性,可维护性
3、降低变更带来的风险
2、优点:
3、缺点:需要改动代码较多
1、单一职责原则
1、A如果implement 接口IA 则 IA中所有的方法应改为A必须的方法
2、接口隔原则
1、高层模块不应该依赖底层模块,二者都应该依赖其抽象类
2、抽象不应该依赖细节,细节应该依赖抽象
3、依赖倒转(倒置)的中心思想是面向接口变成
5、使用接口或者抽象类的目的是指定好规范,而不涉及任何具体的操作,把战线细节的任务交给他们的实现类去完成
4、依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多,以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类。
特点:
1、底层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好
2、变量的生命类型尽量是抽象类或接口,这样我们的变量引用和实际对象间,就存在一个缓冲层,利于程序扩展和优化
3、继承时遵循里氏替换原则
注意事项
3、依赖倒转原则
1988年,由麻省理工大学姓里的女士提出
子类中尽量不要重写父类的方法
1、基本简介
当子类需要重写父类的方法时,让父类和子类都继承更基础的父类
2、解决方法
4、里式替换原则
开闭原则是编程中最基本,最重要的设计原则。
一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节
当软件需求变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则
1、基本介绍
1、通过抽象类实现
5、开闭原则 OCP
一个类应该对其它类保持最少的了解
类与类关系越密切耦合度越大
迪米特原则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好
只与直接朋友进行通信
两个对象有耦合关系就是朋友关系,耦合的方式有很多,依赖,关联,组合
非直接朋友,比如类中方法内部的成员变量,要考虑是否要拿到对应类中取实现。
2、解决方案
核心是降低类之间的耦合
只是要求降低类之间的耦合,并没有要求完全没有依赖关系
3、小结:
6、迪米特法则 Demeter
尽量使用合成聚合的方式,而不是使用继承
7、合成复用原则
1、设计原则
采取一定的方法,保证整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得对象实例的方法
1、Hibernate SessionFactory
2、示例
1、JDK中 Runtime
1、实例
1、饿汉式(静态常量)
2、饿汉式(静态代码块)
3、懒汉式(线程不安全)
4、懒汉式(线程安全,同步方法)
5、懒汉式(线程安全,同步代码块)
6、双重检查 推荐使用
7、静态内部类 推荐使用
8、枚举 推荐使用
3、分类
1) 单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使 用单例模式可以提高系统性能
2) 当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
3) 单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session 工厂等)
4、优点及需要注意事项
1、单例模式
1) 优点是比较好理解,简单易操作。2) 缺点是违反了设计模式的ocp原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.3) 比如我们这时要新增加一个Pizza的种类(Pepper披萨),我们需要做如下修改.
1、不使用工厂模式优缺点
比如 需要订购不同类型的pizza,如果不采用工厂模式,则订购,制作,销售等涉及到不同pizza的场景都需要实现对应的代码,如果加一个种类的pizza修改很多地方,违反了opc原则即开关原则,引入工厂模式可以很好的适应该原则,减少代码的修改
2、实例
2、简单工厂模式
1、定义了一个创建对象的方法,由子类决定要实例化的类,工厂方法模式将对象的实例化推迟到子类
3、工厂方法模式
4、抽象工厂模式
3、原型模式
4、建造者模式
5、工厂模式
1、创建型模式
1、适配器模式
2、桥接模式
3、装饰模式
4、组合模式
5、外观模式
6、享元模式
7、代理模式
2、结构性模式
1、模板方法模式
2、命令模式
3、访问者模式
4、迭代器模式
5、观察者模式
6、中介者模式
7、备忘录模式
8、解释器模式
9、状态模式
10、策略模式
11、责任链模式
3、行为型模式
1、设计模式
1、用例图
1、用于描述类本身的组成和类之间的关系
1、依赖关系
2、泛化关系 (继承)
3、实现关系(类实现接口)
4、关联关系(类与类之间的关系)
5、聚合关系(可以缺少的属性)
6、组合关系(不可缺少的属性)
2、类之间的关系
1、类图
2、对象图
3、包图
4、组件图
5、部署图
2、静态结构图
1、交互图
2、状态图
3、活动图
3、动态行为图
2、UML
3、Oauth2.0
10、其它
Java Web
0 条评论
回复 删除
下一页