面向对象
本质 | 是软件开发方法 |
概念 |
对象:具体/抽象的事物,具有状态和行为。 类型:相同数据结构和行为的对象抽象为类,具有属性和方法。 结构:一般-具体结构(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。 多态失效:在类型擦除之后,继承父类的泛型方法时会导致重写方法变成重载方法。 桥方法:编译器引入桥方法,在子类中重写父类方法,并引用子类方法。 图解如下(顺便复习一下方法重载和方法重写): PS:在MyBatis的MapperAnnotationBuilder.parse()中通过反射解析Mapper接口的方法并生成MapperStatement对象时,就调用了method.isBridge()判断是否为桥方法,如果是桥方法则跳过。 |
数据结构
概念 |
数据:可输入计算机的符号。例:数据库 数据对象:相同性质的数据元素集,数据的子集。例:数据表 数据元素:组成数据的基本单位。例:数据记录。 数据项:数据不可分割的最小单位。例:数据字段。 |
逻辑结构 |
基于数据与数据之间的关系划分。
集合:无关联。 线性:一对一。 树形:一对多。 图形:多对多。 |
物理结构 |
基于存储结构划分。
顺序存储:连续的存储单元。 链式存储:任意的存储单元。 |
常见结构 |
数组: 链表: 队列: 栈: 树: 堆: 图: 散列表: |
排序算法 |
选择排序: 冒泡排序: 插入排序: 希尔排序: 快速排序: 堆排序: 归并排序: 计数排序: 桶排序: 基数排序: |
集合
存放数据的集合,JAVA中实现Collection和Map的都是集合
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接口 |
|
线程池 | ||
线程并发 | 三大特性 |
原子性 有序性 可见性 |
同步方案 |
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) 获取指定对象字段属性 操作私有字段时,请注意 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。