8

面向对象

本质 是软件开发方法
概念 对象:具体/抽象的事物,具有状态和行为。
类型:相同数据结构和行为的对象抽象为类,具有属性和方法。
结构:一般-具体结构(is-a;继承关系);整体-部分结构(has-a;组合关系)。
通信:对象之间通信的结构称为消息,通过消息调用方法。
特性 唯一性:对象是唯一的。
抽象性:类是由相同数据结构和行为的对象抽象出来的。
继承性:提供类规范的等级结构;共享的代码可以复用。
多态性:消息相同,引用不同,结果不同,即多态。

设计模式

本质 开发过程中一般问题的最佳解决方案,帮助经验不足的开发人员通过简单快捷的方式学习软件设计。
原则 开闭原则:对修改关闭,对扩展开放。
里氏代换原则:是面向对象设计的基本原则之一(方法重写)。子类可以再任何地方替换基类。
依赖倒转原则:依赖抽象而非具体。
接口隔离原则:多个隔离接口优于单一接口。
迪米特原则:对象单一原则。
合成复用原则:组合优先继承。
创建型 关注对象的实例化。
单例模式:全局唯一;构造器私有/内部维护实例并提供获取方法;考虑懒加载机制。
工厂模式:针对单一产品对象的构建;工厂类/一个抽象产品及子类。
抽象工厂模式:针对系列产品对象的构建。抽象工厂类及子类/系列抽象产品及子类。
建造者模式:针对复杂对象的构建初始化。
原型模式:深复制/浅复制。
结构型 关注类的结构,用组合关系去替代继承关系实现对已有类的方法改造。
适配器模式
装饰器模式
代理模式
过滤器模式
桥接模式
外观模式
享元模式
行为型 关注对象的通信。
责任链模式
策略模式
模板模式
迭代器模式
观察者模式
命令模式
解释器模式
中介者模式
备忘录模式
状态模式
空对象模式
访问者模式

JVM

内存模式 元空间(线程共享):原方法区,存放class对象。
(线程共享):存放Java对象、常量池,新生代(Eden/Servivor)/老年代。
虚拟机栈(线程私有):执行方法(以栈帧[局部变量表/操作数栈]为单位)。
本地方法栈(线程私有):
程序计数器(线程私有):
GC算法 标记算法引用计数/可达性分析算法。
回收算法标记-清除/复制/标记-整理/分代收集算法
GC触发机制 MinorGC:Eden内存不足
FullGC:Old内存不足/MinorGC悲观策略/System.GC()/jmap :live

泛型

本质 类型参数化,作用就是将类型转换问题从运行时转移到编译期。
语法 1 定义在类上 class ClassName<T>{}
2 定义在方法上 <T> void methodName(T t){}
3 通配符 <?> 可限制传入参数,但无法使用 泛型参数 需类型转换
4 上限 <? extends T > 接受 T及任意子类
5 下限 <? super T> 接受 T及任意父类
原理 泛型是语法糖,只在编译过程中存在,在编译之后会类型擦除。
类型擦除:编译之后的二进制文件(class)中,<?/T>会变为Object;上限<? extends T>会变为T。
多态失效:在类型擦除之后,继承父类的泛型方法时会导致重写方法变成重载方法。
桥方法:编译器引入桥方法,在子类中重写父类方法,并引用子类方法。
图解如下(顺便复习一下方法重载和方法重写):
image.png
PS:在MyBatis的MapperAnnotationBuilder.parse()中通过反射解析Mapper接口的方法并生成MapperStatement对象时,就调用了method.isBridge()判断是否为桥方法,如果是桥方法则跳过。

数据结构

概念 数据:可输入计算机的符号。例:数据库
数据对象:相同性质的数据元素集,数据的子集。例:数据表
数据元素:组成数据的基本单位。例:数据记录。
数据项:数据不可分割的最小单位。例:数据字段。
逻辑结构 基于数据与数据之间的关系划分。 集合:无关联。
线性:一对一。
树形:一对多。
图形:多对多。
物理结构 基于存储结构划分。 顺序存储:连续的存储单元。
链式存储:任意的存储单元。
常见结构 数组
链表
队列




散列表
排序算法 选择排序
冒泡排序
插入排序
希尔排序
快速排序
堆排序
归并排序
计数排序
桶排序
基数排序

集合

存放数据的集合,JAVA中实现Collection和Map的都是集合

clipboard.png

Vector:线程安全,基于动态数组,增长率为100%,ArrayList为50%
ArrayList:基于动态数组,查询快,增删慢。
LinkedList:基于链表,增删快,查询满。

PS : Hash散列算法 hash & (length-1) 通过Hash散列算法获取下标,HashCode冲突且equals为false时存入链表。当length为2的N次方时,可以最大程度减小HashCode冲突。

HashSet:底层由HashMap实现,允许null,唯一,无序
LinkedHashSet:底层由LinkedHashMap实现(适配器模式),不允许null,唯一,按插入顺序排序
TreeSet:底层由TreeMap实现,不允许null,唯一,按排序规则排序

映射集合(键值对)
HashMap:基于Hash散列算法,键唯一,允许null,无序
LinkedHashMap:继承HashMap,键唯一,不允许null,按插入顺序排序
TreeMap:键唯一,不允许null,按排序规则排序,底层基于红黑树

HashTable:线程安全
ConcurrentHashMap:线程安全,锁分离

图片描述

IO

本质 数据传输
分类 数据类型 字节流
字符流
数据流向 输入流
输出流
输入流 字节流 InputStream 字节输入流接口
ByteArrayInputStream 字节数组输入流
FileInputStream 文件输入流
BufferedInputStream 高级流 缓存输入流
字符流 Reader 字符输入流接口
InputStreamReader 转换流 字符输入流 可指定字符集
BufferedReader 高级流 缓存字符输入流
输出流 字节流 outputStream 字节输出流接口
ByteArrayOutputStream 字节数组输出流
FileOutputStream 文件输出流
BufferedOutputStream 高级流 缓存输出流
字符流 Writer 字符输出流接口
OutputStreamWriter 转换流 字符输出流 可指定字符集
BufferedWriter 高级流 缓存字符输出流
PrintWriter 高级流 缓存字符输出流 自动行刷新

多线程

多线程 并发,合理使用可以提高效率,CPU给每个线程分配时间片(几十ms),线程有创建与上下文切换的开销
线程状态 新建 NEW
就绪 RUNNABLE
运行 RUNNING
阻塞 BLOCKED
死亡 DEAD
创建线程 1 继承Thread
2 实现Runnalbe接口
3 实现Callable接口
线程池 clipboard.png
线程并发 三大特性 原子性
有序性
可见性
同步方案 1 volatile 类型修饰符 保证可见性
2 Synchronized 同步代码块,可修饰方法 代码块
3 ReentrantLock 显示获取/释放锁
线程操作 1 sleep() 使线程进入阻塞,可指定毫秒值,不释放锁
2 wait()/notify()/notifyAll() 等待(阻塞)唤醒(就绪)机制,可指定毫秒值,释放锁
3 yield() 使线程进入就绪,不释放锁
4 join() 当前线程进入阻塞,直到join线程执行结束,进入就绪,释放锁

反射

反射 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。
主要功能 1 在运行时判断一个对象所属的类
2 在运行时构造任意一个类的对象
3 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
4 在运行时调用任意一个对象的方法
语法 注意: 调用私有属性时,需setAccessible(True)跳过java语言访问检查,否则抛出IllegalAccessException
获取Class 1 Class.forName(className)
2 类名.class
3 对象.getClass()
对象 无参构造器 newInstance() 调用无参构造器创建对象并返回
未定义无参构造器时,抛出InstantiationException
获取构造器 1 getConstructor([types]) 获取指定参数类型列表的公有构造器
2 getConstructors() 获取所有公有构造器
3 getDeclaredConstructor([types]) 获取指定参数类型列表的构造器
4 getDeclaredConstructors() 获取所有构造器
调用构造器 构造器对象.newInstance([params]) 创建对象,调用私有构造器时, 请注意
方法 获取方法 1 getMethod(name[,types]) 获取指定方法名,参数类型列表的公有方法
2 getMethonds() 获取所有公有方法,包括继承类的公有方法
3 getDeclaredMethod(name[,types]) 获取指定方法名,参数类型列表的方法,但不包括继承方法
4 getDeclaredMethods() 获取所有方法,但不包括继承方法
调用方法 方法对象.invoke(obj[,params]) 调用指定对象方法,调用私有方法时, 请注意
字段 获取字段 1 getField(name) 获取指定字段名的公有字段
2 getFields() 获取所有公有字段,包括继承类的公有方法
3 getDeclaredField(name) 获取指定字段名的字段,但不包括继承字段
4 getDeclaredFields() 获取所有字段,但不包括继承字段
操作字段 字段对象.set(obj,val) 设置指定对象字段属性
字段对象.get(obj) 获取指定对象字段属性
操作私有字段时,请注意

roylion
204 声望25 粉丝

读书破万卷