Java程序设计
java语言的发展历史
- 早期发展阶段1991-1995:Java语言主要用于开发消费类电子产品的嵌入式软件
- 快速发展阶段1996-2000:Java语言随着互联网的兴起而迅速发展,成为互联网应用开发的主流语言之一
- 稳定发展阶段2001-2010:Java语言的应用范围不断扩大,应用于越来越多的领域,例如移动开发、桌面开发、企业应用开
发等 - 创新发展阶段2011至今:Java语言不断创新,引入了许多新特性,例如Lambda表达式、Stream API等,以适应时代发展
的需求
java语言的应用领域
- Web开发
- 桌面开发
- 移动开发
- 企业应用开发
Java基础知识
基本数据类型
- 整数:byte:8位,范围:-128127;short:16位,范围:-32768-32767;int:32位,范围:-21474836482147483647;long:64位,范围:-9223372036854775808~9223372036854775807;默认值:0
- 浮点数:float:32位,范围:1.401298e-45~3.402823e+38;double:64位,范围:4.9000000e-324 ~1.797693e+308;默认值:0.0
- 字符:字符类型用于存储单个字符,使用 char 类型表示,占2个字节。默认值:“”
- 布尔:布尔类型用于存储布尔值,即真或假,使用 boolean 类型表示,占1个字节。
- 空类型:null
引用数据类型
方法与函数
方法的定义和使用
方法是Java语言中用于封装代码块并重复使用的代码单元,方法可以包含一系列语句,用于完成特定的功能。
要素
- 修饰符
- 返回值类型
- 方法名
- 参数列表
- 方法体
使用
- 直接调用
- 通过对象调用
- 通过反射调用
注意事项
- 方法名要符合命名规范,便于阅读和理解。
- 方法的参数类型要与实际传入的参数相匹配。
- 在调用方法之前要确保方法已经被定义。
- 要注意方法的返回值,如果方法有返回值,需要在调用方法后处理返回值。
参数传递
值传递
- 将参数的值传递给方法,方法内部对参数值的修改不会影响到参数本身的值。
- Java中基本类型参数都是值传递
引用传递
- 将参数的引用传递给方法,方法内部对参数值的修改会影响到参数本身的值。
- Java中引用类型参数都是引用传递
方法重载
定义:
方法重载是指在同一个类中定义多个同名的方法,但这些方法的参数列表不同。
特点
- 方法名相同
- 参数列表不同
- 返回值类型可以相同也可以不同
注意事项
方法重载不能只改变返回值类型方法重载不能改变参数的顺序
函数式编程
定义
函数式编程是一种编程范式,它将计算视为对不可变值的函数求值。图数式编程强调函数的应用和组合,并避免使用状态和副作用
函数式编程特性
- Lambaa表达式
- 方法引用
- Stream API
优点
- 代码简洁
- 易于测试
- 并发性
文件处理与字符集
文件处理
Java 提供了 java.io 包用于文件处理,该包包含以下类:
- File:表示文件或目录。
- InputStream:从数据源读取数据。
- OutputStream:将数据写入数据目标。
- Reader:从字符流读取字符
- Writer:将字符写入字符流
字符集
字符集用于将字符编码为字节Java 支持多种字符集,包括:
- UTF-8:默认字符集,支持大多数字符。
- GB18030:国标规定的变长多字节字符集。
面向对象编程
类与对象的概念
定义:
Java 类是用来描述具有相同属性和方法的一组对象的模板
要素
- 修饰符
- 类名
- 接口(可选)
- 成员变量
- 父类(可选)成员方法
类使用
- 创建对象
- 访问成员变量
- 调用成员方法
注意事项:
- 类名要符合命名规范,便于阅读和理解。
- 类中的成员变量和成员方法应该具有良好的封装性,避免4对外暴露不必要的信息和细节。
- 在使用类之前要确保类已经被定义。
对象的创建与销毁
- 使用new关键字
- 使用克隆
对象销毁
在 Java 中,对象的销毁由垃圾回收器自动完成。垃圾回收器会跟踪对象的引用,当对象不再被任何引用指向时,垃圾回收器就会将其销毁。
影响对象销毁的因素
- 对象的引用
- 对象的生存期
- 垃圾回收器的策略
注意事项
可以通过显式调用 finalize()方法来强制销毁对象(不推荐)可以通过设置 JVM 参数来调整垃圾回收器的行为。
类与对象的成员
类成员
- 成员变量:用于定义类的属性
- 成员方法:用于定义类的行为
- 构造方法:用于创建类的实例
- 内部类:用于定义嵌套在类中的类
对象成员
- 对象属性:对象的属性是成员变量在对象实例中的具体值
- 对象方法:对象的方法是成员
- 方法在对象实例上的具体实现
成员访问权限
- public:可以在任何地方访问
- protected:可以在同一个类及其子类中访问
- private:只能在同一个类中访问
- 默认(包访问权限):同一个包内的类可以访问
封装、继承、多态
封装的好处
- 提高代码的安全性:隐藏对象的内部实现细节
- 提高代码的可维护性:将对象的属性和方法组合在一起
- 提高代码的可重用性:隐藏对象的内部实现细节
实现封装
- 使用访问修饰符:public、protected 和private
- 使用抽象类和接口
注意事项
- 类的成员变量和成员方法应该具有良好的封装性,避免对外暴露不必要的信息和细节
- 在使用成员之前要确保成员已经被定义
继承的好处
- 代码重用:通过继承,可以避免代码重复,提高代码的重用性
- 代码维护:通过继承,可以使代码更加易于理解和维护
- 代码扩展:通过继承,可以方便地扩展代码的功能
实现继承
通过 extends 关键字来实继承
注意事项
- 单继承:一个类只能继承一个直接父类
- 多重继承:一个类可以继承多个父类
- 层次继承:多个类形成一个继承层次
- 接口继承:一个类可以继承多个
注意事项
- 继承会导致类之间的耦合性增强,需要谨慎使用
- 子类不能直接访问父类的私有成员
- 子类可以重写父类的方法,但不能重写父类的构造方法。
接口与抽象类
接口的定义和使用
Java 接口是一种特殊的抽象类,它用于定义一组相关的方法和常量,而不需要实现它们。
接口提供了一种规范,描述了类应该具有哪些方法和常量,但不关注具体的实现细节。
接口定义
Java 接口是一种特殊的抽象类它用于定义一组相关的方法和常量而不需要实现它们。接口提供了-种规范,描述了类应该具有哪些方法和常量,但不关注具体的实现细节。
接口的优势
- 提高代码的灵活性
- 提高代码的扩展性
- 提高代码的重用性
注意事项
- 接口不能实例化对象
- 接口中的所有方法都是抽象方法,不能有方法体
- 接口可以包含常量,包括静态常量和最终常量
- 接口可以继承自另一个接口
常用设计模式
单例模式
- 实现方式
- 饿汉式
- 懒汉式
- 双重检查锁静态内部类
- 枚举
应用场景
- 数据库连接池
- 配置文件管理
- 日志管理
- 缓存管理
优点
- 节省资源:可以避免重复创建对象,节省系统资源
- 提高效率:可以提高对象访问的效率
- 控制全局状态:可以方便地控制全局状
缺点
。降低灵活性
。增加测试难度
工厂模式
实现方式
- 简单工厂模式:通过一个工厂类来创建所有对象
- 工厂方法模式:定义一个创建对象的接口,让子类决定创建哪种对象抽象工厂模式:提供一个创建一系列相关对象的接口
- 抽象工厂模式:提供一个创建一系列相关对象的接口
应用场景
- 数据库连接池
- 配置文件管理
- 日志管理
- 缓存管理
优点
- 解耦:将对象的创建逻辑与使用逻辑分离,从而提高代码的解耦性
- 灵活性:可以根据需要动态地创建不同的对象
- 可扩展性:可以很容易地添加新的对象类型
缺点
- 增加复杂性:需要创建额外的工厂类或方法
- 降低性能:在创建对象时需要进行额外的操作
- 降低可读性:需要使用工厂类或方法来创建对象,而不是直接使用构造函数
代理模式
实现方式
- 静态代理:在编译时就创建代理类
- 动态代理:在运行时创建代理类
应用场景
- 远程访问
- 虚拟代理
- 保护代理
- 缓存代理
优点
- 解耦:将对象的创建逻辑与使用逻辑分离
- 灵活性:根据需要动态地更换代理对象
- 可扩展性:很容易地添加新的代理类型
- 保护目标对象:使其免受直接访问
- 增强目标对象:代理模式可以为目标对象提供额外的功能
缺点
- 增加复杂性:代理模式会增加代码的复杂性,因为需要创建额外的代理类或方法。
- 降低性能:代理模式可能会降低性能,因为在访问目标对象时需要进行额外的操作。
观察者模式
实现方式
- 直接实现:被观察者直接维护观察者列表,并负责通知观察者
- 使用事件监听器:被观察者定义事件,观察者注册事件监听器,当事件发生时触发事件监听器
- 使用 Java 标准库中的Observable 类:0bservable 类提供了观察者模式的实现,可以直接使用
应用场景
- 订阅发布系统
- GUI开发
- MVC模式
- 多线程编程
- 日志系统
优点
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系
- 符合依赖倒置原则
- 目标与观察者之间建立了一套触发机制
缺点
- 降低了代码的执行效率。
- 增加了代码的复杂度。
- 可能导致循环引用
Java编程语言的高级特性
Java虚拟机
Java虚拟机(JVM)简介JVM是Java语言的核心,它是一个虚拟的计算机,可以执行Java字节码。
JVM主要功能加载和执行Java字节码
- 管理内存
- 提供安全机制
- 提供垃圾回收机制
- 支持多线程
Java虚拟机的优势
- 跨平台性
- 安全性
- 自动内存管理
- 高性能
JVM主要部分
- 类加载器:负责加载Java字节码到JVM内存中
- 执行引擎:负责解释和执行Java字节码
- 内存管理:负责分配和回收Java对象的内存
- 运行时数据区:存储Java程序运行时的数据
JVM常见问题与实践
JVM 调优
Java 应用运行一段时间后出现性能问题,如响应速度变慢、CPU 使用率过高、内存占用过大等
JVM 内存溢出
Java 应用在运行过程中分配的内存超过了 JVM的最大堆大小,导致内存溢出
JVM 卡顿
Java 应用在运行过程中,出现卡顿现象,如界面响应不及时、操作延迟等
JVM 死锁
Java 应用在运行过程中出现死锁现象,即多个线程互相等待,导致程序无法继续运行
垃圾回收
垃圾回收的概念
- 垃圾回收是指由 Java 虚拟机(JVM)自动管理内存回收不再使用的对象所占用的内存空间。
垃圾回收的必要性
- Java 程序员无需手动管理内存,简化了编程
- 避免了内存泄漏,提高了程序的稳定性
垃圾回收的主要目标
- 自动管理内存:减轻程序员手动管理内存的负担
- 避免内存泄漏:提高程序的稳定性和可靠性
- 提高性能:有效利用内存资源
回收过程
- 标记:识别不再使用的对象
- 清除:回收标记为“垃圾”的对象所占用的内存空间
- 整理:将存活的对象移动到一起,以便更好地利用内存空间
垃圾回收算法
- 标记-清除算法:最基本的垃圾回收算法,效率不高
- 复制算法:将存活的对象复制到新的内存空间中,然后回收旧的内存空间
- 标记-整理算法:在标记-清除算法的基础上增加了整理步骤,提高了内存空间的利用率
- 分代收集算法:根据对象的存活时间将内存划分为不同的区域,并对不同的区域使用不同的垃圾回收算法
常用垃圾收集器
- Serial GC:串行收集器,单线程执行垃圾回收
- Parallel GC:并行收集器,多线程执行垃圾回收
- CMS GC:并发标记-清除收集器,在程序运行时并发执行垃圾回收
- G1 GC:最新的垃圾收集器,基于分代收集算法,具有良好的性能和可扩展性
多线程与线程池
多线程的概念
多线程的优势
- 提高程序的执行效率
- 提高程序的响应速度
- 提高程序的可扩展性
- 多线程的实现
- 继承 Thread 类:创建子类并继承 Thread 类,重写 run()方法来定义线程要执行的任务
- 实现 Runnable 接口:创建类并实现 Runnable 接口,重写 run()方法来定义线程要执行的任务
多线程的解决方案
- 使用同步机制:例如 synchronized 关键字、Lock 接口等来保证线程安全
- 避免死锁:例如使用死锁检测和预防机制
- 避免饥饿:例如使用优先级调度算法
多线程的常见问题
- 线程安全:多个线程同时访问同一个共享资源时可能导致数据不一致
- 死锁:两个或多个线程相互等待对方释放资源,导致程序无法继续执行
- 饥饿:一个线程一直无法获得资源,导致程序无法正常运行
线程的创建与销毁
线程同步
定义:线程同步是指多个线程访问同一个共享资源时,通过某种机制来保证数据的正确性和一致性。
线程同步的必要性:
避免数据不一致。
避免线程安全问题。
注意事项:
同步会降低程序的性能,因此应该尽量减少同步的范围
使用 synchronized 关键字时应该注意锁对象的选取
线程同步的实现方式:
synchronized 关键字:最常用的同步机制,可以修饰方法或代码块
Lock 接口:提供更细粒度的同步控制
ReentrantLock 类:可重入锁,可以解决递归锁的问题
Semaphore 类:用于控制对资源的访问数量
Condition类:用于线程之间的通讯
线程池
线程池是指一组线程的集合,它可以管理线程的生命周期,并提供线程的创建、销毁、调度等功能
线程池的优势
- 提高线程的利用率
- 减少线程的创建和销毁开销
- 提高程序的性能和可扩展性
线程池的实现:Java 中可以使用java.util,concurrent.ExecutorService 接口来创建线程池
常用线程池类型:
- FixedThreadPool:创建固定数量的线程池
- CachedThreadPool:创建一个可缓存的线程池,线程数量可根据需要动态增长
- ScheduledThreadPool:创建一个可定时执行任务的线程池
线程池的配置参数:
- 核心线程数:线程池中始终保持的线程数量
- 最大线程数:线程池中允许的最大线程数量
- 队列容量:任务队列的容量
- 拒绝策略:当任务队列满时,线程池拒绝新任务的策略
JDBC
JDBC简介:JDBC(Java Database Connectivity)是 Java 语言中用来连接数据库的API,它提供了一套标准的Java接口,允许Java程序访问各种数据库。
常用的JDBC类和接口
- DriverManager
- Connection
- Statement
- ResultSet
特点
- 标准化 API
- 方便使用
- 强大功能
- 不同数据库的 JDBC 驱动程序可能存在差异
public class Main
{
public static void main(String[] args)throws Exception
{
// 加载 JDBC 驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库连接
Connection connection=
DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicod^-true&characterEncoding=utf8","root"."root");
// 创建 Statement 对象
Statement statement = connection.createStatement();
// 执行 SQL 语句
ResultSet resultSet = statement.executeQuery("SELECT * FROM user");
// 遍历结果集
while (resultSet.next())
{
System.out.println(resultSet.getString("name"));
}
// 关闭资源
resultSet.close();
statement.close();
connection.close();
}
}
JDBC事务
JDBC 事务是指一组数据库操作,要么全部成功,要么全部失败。事务保证了数据库数据的完整性和一致性。
JDBC 事务的实现
- 自动提交:JDBC默认会
- 自动提交每个SQL语句
- 手动提交:可以通过关闭自动提交来手动提交事务
特性
- 原子性
- 一致性
- 隔离性
- 持久性
Java企业应用程序实战
Java核心类库
HTTP客户端OkHttp:OkHttp 是一个优秀的 HTTP 客户端框架,由Square 开发并开源
主要功能
- 支持 HTTP/2 和 SPDY
- 使用连接池减少请求延迟
- 透明的 GZIP 压缩
- 请求缓存
- 支持多种身份验证方式
- 支持代理
- 支持断点续传
- 支持异步请求
特点:高效、易用、强大
Lombok:Lombok 能以简单的注解形式来简化java代码,提高开发人员的开发效率
Lombok 是一个 Java 库,可以自动插入编辑器并构建工具,简化Java 开发。通过添加注解的方式,不需要为类编写 getter 或 setter方法,同时可以自动化日志变量。简而言之:Lombok 能以简单的注解形式来简化 java 代码,提高开发人员的开发效率。
特点:简化代码、提高效率、增强安全性
常用注解:@Getter、 @Setter、 @Data、 @NoArgsConstructor、 @RequiredArgsConstructor
Guava:Guava 的目标是为 Java 开发人员提供一个更高效、更易用的工具集。
Guava 是 Google 开源的一个 Java 库,它提供了一些 Google 内部使用的核心工具,例如集合、缓存、原语类型、并发库、注解、字符串处理、I/0 等。Guava 的目标是为 Java 开发人员提供一个更高效、更易用的工具集。
常用的 Guava 类
- Collections
- Cache
- I/O
- Concurrency
特点
- 丰富的工具类
- 提高开发效率
- 提高代码质量
开发并开源
主要功能
- 支持 HTTP/2 和 SPDY
- 使用连接池减少请求延迟
- 透明的 GZIP 压缩
- 请求缓存
- 支持多种身份验证方式
- 支持代理
- 支持断点续传
- 支持异步请求
特点:高效、易用、强大
Lombok:Lombok 能以简单的注解形式来简化java代码,提高开发人员的开发效率
Lombok 是一个 Java 库,可以自动插入编辑器并构建工具,简化Java 开发。通过添加注解的方式,不需要为类编写 getter 或 setter方法,同时可以自动化日志变量。简而言之:Lombok 能以简单的注解形式来简化 java 代码,提高开发人员的开发效率。
特点:简化代码、提高效率、增强安全性
常用注解:@Getter、 @Setter、 @Data、 @NoArgsConstructor、 @RequiredArgsConstructor
Guava:Guava 的目标是为 Java 开发人员提供一个更高效、更易用的工具集。
Guava 是 Google 开源的一个 Java 库,它提供了一些 Google 内部使用的核心工具,例如集合、缓存、原语类型、并发库、注解、字符串处理、I/0 等。Guava 的目标是为 Java 开发人员提供一个更高效、更易用的工具集。
常用的 Guava 类
- Collections
- Cache
- I/O
- Concurrency
特点
- 丰富的工具类
- 提高开发效率
- 提高代码质量