目录
一、 J2EE基础
i. 关键字的使用
- Static
- abstract
- 访问修饰符public,private,protected,以及不写(默认)时的区别
- Final、finally、finalize的用法区别
- Transient
- Volatile
- This/Super
- Serializable序列化的作用
ii. JVM内存分配与GC - 内存分配
- 一个java程序的工作过程
- GC的方法与使用时机
- JVM初始化参数
- Java内存泄露问题
iii. 面向对象编程 - 面向对象编程的特征
iv. 集合 - 类图与主要类
- 主要实现类区别
- 二叉排序数、平衡树、红黑树
v. 排序(算法) - 交换排序-冒泡排序(稳定)
- 交换排序-快速排序
- 选择排序-直接选择排序
- 选择排序-堆排序
- 插入排序-直接插入(稳定)
- 插入排序-shell排序
- 归并排序(稳定)
- 基数排序(稳定)
vi. 泛型、反射机制和类装载原理、内嵌类 - Java对象的生命周期
- Java类装载器与双亲委派模式
- Java类加载机制
- 反射(Reflection)
vii. I/O
viii. 多线程并发 - 多线程并发、并行和高并发、多线程
- 什么是线程安全
- 可见性和原子性
- 线程阻塞
- wait和sleep的区别:
- volatile和synchronized的区别
- Java原子类(Atomic包)
ix. 网路编程 - TCP、UDP、HTTP和SOCKET
x. 异常机制 - 运行时异常
- 非运行时异常(编译异常)
二、 数据库(Oracle)(Mysql)
i. 增删改查
ii. 视图和索引
iii. 数据库设计
iv. Sql优化 - 建立索引
- Sql查询语句优化
三、 源码/架构
i. 常用设计模式 - strategy策略模式
- Observer观察者模式
- Decorator 装饰者模式
- Factory工厂模式
- Singleton单例模式
- Command命令模式
- Adapter适配器模式
- appearance外观模式
- Template模板方法模式
- Iterator迭代器与组合模式
- State状态模式
- Proxy代理模式
- Recombination复合模式
- 生产者消费者模式(多线程)
- 其他模式
ii. 核心API - Object类
- String类
iii. JDBC/SOCKET编程
iv. Spring核心 - IOC容器设计原理
- AOP设计原理
- Spring注解驱动开发
- SpringMVC与Struts2对比分析
- Spring5新特性
v. Struts2原理
vi. MyBatis
四、 前端技术
i. HTML5与CSS
ii. HTTP/HTTPS协议
iii. Javascript与Juqery
iv. Ajax请求与后台交互方式
v. Angular.js与Vue.js
五、 工程化技能需求
i. MyEclipse与Maven
ii. swagger
iii. Idea与Git
六、 企业级Java web应用开发
i. SSH
ii. SSM
iii. MVC、SpringMVC与MVVM
七、 互联网分布式系统架构设计
i. 集群与分布式
ii. 分布调度中心-Zookeeper
iii. 消息中间件-Kafa与MQ
iv. 分布式缓存-Redis
v. 基于Java的Hadoop
vi. 分布式架构项目实践
八、 移动互联网与微服务
i. Android & ios
ii. Spring Cloud
iii. Spring Boot - SpringBoot特性
- SpringBoot项目环境搭建
iv. Dubbo应用及源码
v. Docker虚拟化技术
九、 性能优化
i. 性能优化的性能基准和衡量维度
ii. JVM调优
iii. Tomcat调优
iv. MySQL调优
附录
一、 J2EE基础
i. 关键字的使用
-
Static
-
作用:
(1) 为特定的数据类型或对象分配单一的存储空间.
(2) 实现某个方法或属性与关联在一起. -
使用:
(1) static成员变量
属于类的变量,只要static变量所属类被加载,变量就会被分配空间。
引用方式:类.静态变量;对象.静态变量.
(2) static成员方法
I.static方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用.
II.static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法.因为当static方法被调用时,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法.同理,static方法也不能访问非static类型的变量.
static一个很重要的用途就是实现单例设计模式,单例模式的特点是该类只能有一个实例,为了实现这一功能,必须隐藏类的构造函数,即把构造函数声明为private,并提供一个创建对象的方法,由于构造对象被声明为private,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象,要达到这样的目的只能把创建对象的方法声明为static. -
abstract
1、 含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。
2、 抽象类不能被实例化。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
3、 抽象方法只需声明,而不需实现某些功能。
4、 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。 -
访问修饰符public,private,protected,以及不写(默认)时的区别
类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。
-
Final、finally、finalize的用法区别
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 -
Transient
为了数据安全;只能修饰变量。当对象被序列化时,被transient关键字修饰的变量不会被序列化到目标文件;当对象从序列化文件重构对象时(反序列化过程),被transient字段修饰的变量不会被恢复。 -
Volatile
volatile是变量修饰符,其修饰的变量具有可见性,可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值。在Java中为了加快程序的运行效率,对一些变量的操作通常是在该线程的寄存器或是CPU缓存上进行的,之后才会同步到主存中,而加了volatile修饰符的变量则是直接读写主存。 -
This/Super
-
Serializable序列化的作用
ii. JVM内存分配与GC
- 内存分配
- pc寄存器(包括程序寄存器)
PC寄存器里保存有当前正在执行线程的JVM指令的地址。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。是线程非共享的。 - 虚拟机栈(java栈)
保存该线程中Java方法调用的状态——包括它的局部变量、被调用时传入的参数、它的返回值、以及运算的中间结果。(—— 深入JAVA虚拟机2)
保存局部基本类型变量和引用变量的地址。
Java栈的区域很小,只有1M,特点是存取速度很快,所以在stack中存放的都是快速执行的任务,基本数据类型的数据,和对象的引用。
JVM只会直接对JavaStack(Java栈)执行两种操作:①以帧为单位的压栈或出栈;②通过-Xss来设置大小,若不够会抛出StackOverflowError异常。是线程非共享的。 - 本地方法栈(Nativemethodstack)
保存native方法进入区域的地址。线程非共享。 - 堆(heap)
保存Java对象和成员变量。
JVM将所有对象的实例(即用new创建的对象)的内存都分配在堆上,堆所占内存的大小由-Xmx指令和-Xms指令来调节。线程共享。 - 方法区
method(方法区)又叫静态区,存放所有的①类(class)(模板)的信息,②静态变量(static变量),③静态方法,④常量和⑤成员方法的信息。线程共享。
方法区的大小由-XX:PermSize和-XX:MaxPermSize来调节,类太多有可能撑爆永久代。静态变量或常量也有可能撑爆方法区。Jdk1.8后永生代被换为元空间,静态变量和静态方法存储在了元空间,元空间实在对内存中,类的加载信息存在了本地。 - 运行时常量池
这儿的“静态”是指“位于固定位置”。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。
这个区域属于方法区。该区域存放类和接口的常量,除此之外,它还存放成员变量和成员方法的所有引用。当一个成员变量或者成员方法被引用的时候,JVM就通过运行常量池中的这些引用来查找成员变量和成员方法在内存中的的实际地址。 - 一个java程序的工作过程
一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),每个java程序都需要运行在自己的JVM上(JVM可以理解为解释型),然后告知 JVM 程序的运行入口,再被 JVM 通过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?
概括地说来,JVM初始运行的时候都会分配好 Method Area(方法区) 和Heap(堆),而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器),VM Stack(虚拟机栈)和Native Method Stack(本地方法栈),当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。非线程共享的三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说只发生在Heap上)的原因。 - GC的方法与使用时机
1、 引用计数器算法
2、 根搜索算法(JAVA):设立若干种根对象,当任何一个根对象到某一个对象均不可达时,则认为这个对象是可以被回收的。
3、 垃圾回收算法
a) 标记-清除算法
b) 标记-清除算法
c) 复制算法 - JVM初始化参数
-Xms / -Xmx — 堆的初始大小 / 堆的最大大小
-Xmn — 堆中年轻代的大小
-XX:-DisableExplicitGC — 让System.gc()不产生任何作用
-XX:+PrintGCDetails — 打印GC的细节
-XX:+PrintGCDateStamps — 打印GC操作的时间戳
-XX:NewSize / XX:MaxNewSize — 设置新生代大小/新生代最大大小
-XX:NewRatio — 可以设置老生代和新生代的比例
-XX:PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布
-XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:设置老年代阀值的初始值和最大值
-XX:TargetSurvivorRatio:设置幸存区的目标使用率 - Java内存泄露问题
理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。
iii. 面向对象编程
- 面向对象的特征
1、 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
2、 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类)