一 Java基础知识
1 Java语言概述
1.1 发展历史
1.2 Java应用领域
- Web开发:电子商务网站、内部管理系统、社交网络、门户网站
- 移动开发:Android开发
- 桌面开发:办公软件、游戏、工具软件
- 企业应用开发:客户关系管理、企业资源计划、供应链管理
2 数据类型与变量
2.1 基本数据类型
(1)整数
- byte:8位,范围-128~127
- short:16位,范围-32768~32767
- int:32位,范围-2147483648~2147483648
- long:64位,范围- 2 64 2^{64} 264~ 2 64 2^{64} 264
(2) 浮点型
- float:32位
- double:64位
(3) 字符
- char:2个字节
(4)布尔
- boolean:1个字节
2.2 引用数据类型
定义: 是指通过引用来访问数据的类型。引用数据类型的变量实际上是一个指向对象的指针,而不是对象本身.
区别: 与基本数据类型不同,引用数据类型的变量不直接存储数据,而是存储对象的引用。意味着两个引用数据类型的变量可以指向同一个对象
常见类型:
- 类
- 字符串
- 接口
- 日期时间
- 数组
- 集合
特点: 可变性 非原子性 垃圾回收
注意事项: 对象引用、内存泄漏
2.3 变量的定义和使用
定义: 变量是指在程序中用来存储数据的命名空间
语法: 数据类型 变量名 = 初始值
int age = 18;
String name = "John Doe";
Date now = new Date();
使用:
- 赋值
- 运算
- 输出
作用域:
- 局部变量
- 成员变量
- 全局变量
注意事项:
- 变量名要符合命名规范,便于阅读和理解
- 变量的数据类型要与存储的数据相匹配
- 在使用变量之前要确保变量已经赋值
- 要注意变量的作用域,避免在错误的作用域使用变量
参考示例:
//1.定义byte类型的变量
byte a = 10;
//2.定义short类型的变量
short b = 20;
//3.定义int类型的变量
int c= 30;
//4.定义long类型的变量
long d = 2131231241412314L;
//5.定义float类型的变量
float e = 10.1F;
//6.定义double类型的变量
double f =20.3;
//7.定义char类型的变量
char g = 'a';
//8.定义boolean类型的变量
boolean h =true;
2.4 集合
定义:
Java集合是一种用于存储和组织对象的容器,它提供了比数组更强大的功能,例如动态添加和删除元素、按特定顺序排列元素以及根据条件查找元素
分类:
- 普通集合、线程不安全的集合,适合单线程环境使用,List,Set,Map,Queue
- 并发集合、线程安全的集合,适合多线程环境使用
并发集合:
(1)ConcurrentHashMap:
- 一个线程安全的HashMap变体,允许多个线程同时进行读写操作
- 通过内部分段锁机制来提供高并发性能
(2)CopyOnWriteArrayList
- 一个线程安全的List实现,适用于读多写少的场景
- 每次写操作都会复制整个数组,因此写操作性能比较低
(3)CopyOnWriteSet
- 基于CopyOnWriteArrayList的线程安全集合,适用于集合中的元素不需要索引的场景
- 同样在写操作时复制数组
3 方法与函数
3.1 方法
定义:
方法是Java语言中用于封装代码块并重复使用的代码单元,方法可以包含一系列语句,用于完成特定的功能。
语法:
修饰符 返回值类型 方法名(参数列表){
方法体
}
举例:
public static void printHello(){
system.out.println("Hello World");
}
方法要素:
- 修饰符
public 对所有类公开
private 只能在定义它的类内部访问
protected 允许在本包及其子类中访问
- 返回值类型
void 无返回值
- 方法名
- 参数名
- 方法体
方法的使用:
- 直接调用
- 通过对象调用
- 通过反射调用
使用注意事项:
- 方法名要符合方法规范,便于阅读和理解
- 方法的参数类型要与实际传入的参数相匹配
- 在调用方法之前要确保方法已经被定义
- 要注意方法的返回值,如果方法有返回值,需要在调用方法后处理返回值
3.2 参数传递
(1)值传递
将参数的值传递给方法,方法内部对参数值的修改不会影响到参数本身的值
(Java中基本类型参数都是值传递)
(2)引用传递
将参数的引用传递给方法,方法内部对参数值的修改会影响到参数本身的值
(Java中引用类型参数都是引用传递)
3.3 方法重载
定义:
方法重载是指在同一类中定义多个同名的方法,但这些方法的参数列表不同
特点:
- 方法名相同
- 参数列表不同
- 返回值类型可以相同也可不同
注意事项:
- 方法重载不能只改变返回值类型
- 方法重载不能只改变参数顺序
示例:
public int add(int a,int b){
return a+b;
}
public double add(double a,double b){
return a+b;
}
3.4 函数式编程
定义:
函数式编程是一种编程范式,它将计算视为对不可变值的函数求值。函数式编程强调函数的应用和组合,并避免使用状态和副作用
函数值编程特性:
- Lambad表达式
- 方法引用
- Stream API
优点:
- 代码简洁
- 易于测试
- 并发性
4 文件处理与字符集
4.1 文件处理
Java提供了java.io包用于文件处理,该包包含一下类:
- File:表示文件或目录
- InputStream:从数据源读取数据
- OutputStream:将数据写入数据目标
- Reader:从字符流读取字符
- Writer:将字符写入字符流
4.2 字符集
字符集用于将字符编码位字节,Java支持多种字符集,包括:
- UTF-8:默认字符集,支持大多数字符
- GB18030: 国标规定的变长多字节字符集
二 Java面向对象编程
1 类与对象的概念
1.1类的定义与使用
定义:
Java类是用来描述具有相同属性和方法的一组对象的模板
要素:
- 修饰类
- 接口(可选)
- 类名
- 成员变量
- 父类(可选)
- 成员方法
注意事项
- 类名要符合命名规范,便于阅读和理解
- 类中的成员变量和成员方法应该具有良好的封装性,避免对外暴露不必要的信息和细节
- 在使用类之前要确保类已经被定义
1.2 对象的创建与销毁
1.2.1 对象的创建
- 使用new关键字
Person person = new Person("John Doe",21);
- 使用反射
Class<?> class = Class.forName(com.example.Person);
Person person = (Person) class.newInstance();
- 使用克隆
Person person1 = new Person("John Doe",21);
Person person2 = (Person) person1.clone(); //浅复制
1.2.2 对象销毁
在Java中,对象的销毁由垃圾回收器自动完成。垃圾回收器会跟踪对象的引用,当对象不再被任何引用指向时,垃圾回收器就会将其销毁
影响对象销毁的因素
- 对象的引用
- 对象的生存期
- 垃圾回收器的策略
注意事项
- 可以通过显式调用finalize()方法来强制销毁对象(不推荐)
- 可以通过设置JVM参数来调整垃圾回收机制的行为( -Xmx)
1.3 类与对象的成员
1.3.1 类成员
- 成员变量:用于定义类的属性
- 成员方法:用于定义类的行为
- 构造方法:用于创建类的实例
- 内部类:用于定义嵌套在类中的类
1.3.2 对象成员
- 对象属性:对象的属性是成员变量在对象实例中的具体值
- 对象方法:对象的方法是成员方法在对象示例上的具体实现
1.3.3 成员访问权限
- public:可以在任何地方访问
- protected:可以在同一个类及其子类中访问
- private:只能在同一个类中访问
- 默认:同一个包内的类可以访问
2 封装、继承、多态
2.1 封装
封装好处:
- 提高代码的安全性:隐藏对象的内部实现细节
- 提高代码的可维护性:将对象的属性和方法组合在一起
- 提高代码的可重用性:隐藏对象的内部实现细节
实现封装:
- 使用访问修饰符:public、protected和private
- 使用抽象类和接口
注意事项: - 类的成员变量和成员方法应该具有良好的封装性,避免对外暴露不必要的信息和细节
- 在使用成员之前要确保成员已经被定义
2.2 继承
继承的好处
- 代码重用:通过继承,可以避免代码重复,提高代码的重用性
- 代码维护:通过继承,可以使代码更加易于理解和维护
- 代码扩展:通过继承,可以方便地扩展代码的功能
实现继承
通过extends关键字来实现继承
注意事项
- 单继承:一个类只能继承一个直接父类
- 多重继承:一个类可以继承多个父类
- 层次继承:多个类形成一个继承层次
- 接口继承:一个类可以继承多个接口
- 继承会导致类之间的耦合性增强,需要谨慎使用
- 子类不能直接访问父类的私有成员
- 子类可以重写父类的方法,但不能重写父类的构造方法(@override)
2.3 多态
多态的好处:
- 代码简洁:通过多态,可以避免代码重复,提高代码的复用性
- 代码扩展:通过多态,可以方便地扩展代码地功能
- 代码维护:通过多态,可以使代码更加易于理解和维护
实现多态:
- 方法重写:子类可以重写父类地方法,从而实现不同地行为
- 方法重载:同一个类中可以定义多个具有相同名称但参数不同地方法,从而实现不同地行为
- 接口:接口可以定义一组方法,而不同地类可以实现这些方法,从而实现不同地行为
注意事项:
- 多态会导致类之间地耦合性增强
- 子类不能重写父类地私有方法
- 子类重写父类地方法时,需要使用@Override注解
3 接口与抽象类
3.1 接口定义和使用
接口定义:
Java 接口是一种特殊的抽象类。它用于定义一组相关的方法和常量而不需要实现它们。接口提供了一种规范,描述了类应该具有哪些方法和常量,但不关注具体的实现细节。
接口的优势
- 提高代码的灵活性
- 提高代码的扩展性
- 提高代码的重用性
注意事项:
- 接口不能实例化对象
- 接口中的所有方法都是抽象方法,不能有方法体
- 接口可以包含常量,包括静态常量和最终常量
- 接口可以继承自另一个接口
3.2 抽象类的定义和使用
抽象类定义:
Java抽象类是一种特殊的类,它不能被实例化,但可以被继承。抽象类用于定义一组相关的方法和常量,而不需要去实现它们。抽象类提供了一种规范,描述了类应该具有哪些方法和常量,但不关注具体的实现细节
抽象类的优势:
- 提高代码的灵活性
- 提高代码的扩展性
- 提高代码的复用性
注意事项:
- 抽象类不能实例化对象
- 抽象类中的抽象方法不能有方法体
- 抽象类可以包含常量,包括静态常量和最终常量
- 抽象类可以继承自另一个抽象类或非抽象类
4 常用设计模式
4.1 单例模式
定义:
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
实现方式:
- 饿汉式 (类加载时就初始化,线程安全)
- 懒汉式 (第一次调用才初始化,避免内存浪费)
- 双重检查锁
- 静态内部类
- 枚举
应用场景:
- 数据库连接池
- 配置文件管理
- 日志管理
- 缓存管理
优点:
- 节省资源:可以避免重复创建对象,节省系统资源
- 提高效率:可以提高对象访问的效率
- 控制全局状态:可以方便地控制全局状
缺点
- 降低灵活性
- 增加测试难度
4.2 工厂模式
实现方式:
- 简单工厂模式:通过一个工厂类来创建所有对象
- 工厂方法模式:定义一个创建对象的接口,让子类决定创建哪种对象
- 抽象工厂模式:提供一个创建一系列相关对象的接口
应用场景:
- 数据库连接池
- 配置文件管理
- 日志管理
- 缓存管理
优点:
- 解耦:将对象的创建逻辑与使用逻辑分离,从而提高代码的解耦性
- 灵活性:可以根据需要动态地创建不同的对象
- 可扩展性:可以很容易地添加新的对象类型
缺点
- 增加复杂性:需要创建额外的工厂类或方法
- 降低性能:在创建对象时需要进行额外的操作
- 降低可读性:需要使用工厂类或方法来创建对象,而不是直接使用构造函数
4.3 代理模式
定义:
代理模式是指为其他对象提供一种代理,以控制对这个对象的访问。代理对象在访问对象和目标对象之间起到中介作用。
实现方式:
- 静态代理:在编译时就创建代理类
- 动态代理:在运行时创建代理类
应用场景:
- 远程访问
- 虚拟代理
- 保护代理
- 缓存代理
优点:
-
解耦:将对象的创建逻辑与使用逻辑分离
-
灵活性:根据需要动态地更换代理对象
-
可扩展性:很容易地添加新的代理类型
-
保护目标对象:使其免受直接访问
-
增强目标对象:代理模式可以为目标对象提供额外的功能
缺点
- 增加复杂性:代理模式会增加代码的复杂性,因为需要创建额外的代理类或方法。
- 降低性能:代理模式可能会降低性能,因为在访问目标对象时需要进行额外的操作。
4.4 观察者模式
定义:
观察者模式,又叫发布-订阅(Publish/Subscribe)模式,模型-视图(Model/View)模式,源-监听器(Source/Listener)模式或从属者(Dependents)模式。定义一种一对多的依赖关系,一个主题对象可被多个观察者同时监听,使得每当主题对象状态变化时,所有依赖于它的对象都会得到通知并被自动更新。
实现方式:
- 直接实现:被观察者直接维护观察者列表,并负责通知观察者
- 使用事件监听器:被观察者定义事件,观察者注册事件监听器,当事件发生时触发事件监听器
- 使用 Java 标准库中的Observable 类:Observable 类提供了观察者模式的实现,可以直接使用
应用场景:
- 订阅发布系统
- GUI开发
- MVC模式
- 多线程编程
- 日志系统
优点:
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系
- 符合依赖倒置原则
- 目标与观察者之间建立了一套触发机制
缺点
- 降低了代码的执行效率
- 增加了代码的复杂度
- 可能导致循环引用
三 Java高级特性
3.1 异常处理
3.1.1 常见的异常类型
(1)检查性异常
检查性异常是编译时异常,必须在编译前进行处理
- -SQLException
SQL异常 - IOException
IO异常,在对流操作时有可能会出现的异常 - FileNotFoundException
找不到某个文件时,会抛出该异常 - ClassNotFoundException
找不到某个类时,会抛出该异常 - EOFException 输入过程中意外地到达文件尾或流尾,会抛出该异常,常见于对流的操作
(2)非检查性异常
检查性异常是运行时异常,可以在运行时进行处理
3.1.2 异常的产生与处理
异常的产生
- 程序代码错误
语法错误、逻辑错误、空指针异常等 - 运行时环境错误
内存不足、文件未找到等 - 外部因素
用户输入错误、硬件故障等
异常的处理
Java异常处理主要使用以下关键字:
- try:用于指定要被监视的代码块
- catch:用于捕获异常并处理
- finally:用于无论发生异常都会执行的代码块
注意事项
- try-catch必须成对出现
- catch可以捕获多个异常
- finally可以省略
- 应该使用具体的异常类型来捕获异常
- 应该在异常处理代码块中进行必要的清理工作
3.1.3 自定义异常
原因
在java中,已经定义了大量的异常类型来处理常见的错误情况。但是在某些情况下,这些内置异常类型无法满足我们的需求。
具体操作
自定义异常需要继承Throwable类及其子类,例如Exception、RuntimeException
注意事项
- 自定义异常应该继承自Throwable类及其子类
- 自定义异常应该提供构造方法来设置异常值及原因
- 自定义异常应该提供清晰的异常信息,以便于程序员理解和使用
3.2 JVM与垃圾回收
3.2.1 Java虚拟机(JVM)
Java虚拟机(JVM)简介JVM是Java语言的核心,它是一个虚拟的计算机,可以执行Java字节码。
功能
- 管理内存
- 提供安全机制
- 提供垃圾回收机制
- 支持多线程
Java虚拟机的优势
- 跨平台性
- 安全性
- 自动内存管理
- 高性能
JVM主要部分
- 类加载器:负责加载Java字节码到JVM内存中
- 执行引擎:负责解释和执行Java字节码
- 内存管理:负责分配和回收Java对象的内存
- 运行时数据区:存储Java程序运行时的数据
常见问题及解决指导
-
JVM 调优
问题 \color{#FF0000}{问题} 问题:Java 应用运行一段时间后出现性能问题,如响应速度变慢、CPU 使用率过高、内存占用过大等
解决方式 \color{#00FF00}{解决方式} 解决方式:
(1)全面体检:采用JVisualVM、JProfiler、YourKit等专业工具对应用进行剖析
(2)资源优化,调整JVM配置
(3)代码优化:减少不必要的内存分配和对象创建 -
JVM 内存溢出
问题 \color{#FF0000}{问题} 问题:Java 应用在运行过程中分配的内存超过了 JVM的最大堆大小,导致内存溢出
解决方式 \color{#00FF00}{解决方式} 解决方式:
(1)内存泄漏跟踪:通过MAT或JProfiler等工具找出对象
(2)扩大内存空间:适当增加堆内存空间、调整内存分配策略等
(3)消除内存浪费:检查是否存在集合类无限扩容、数据结构无序增长等 -
JVM 卡顿
问题 \color{#FF0000}{问题} 问题: Java 应用在运行过程中,出现卡顿现象,如界面响应不及时、操作延迟等
解决方式 \color{#00FF00}{解决方式} 解决方式 :
(1)CPU性能分析:通过CPU profiler找出CPU资源消耗过热的热点方法并优化代码逻辑
(2)线程调度检查:审视线程池是否合理,排查是否存在线程结和线程死锁的情况
(3)垃圾回收优化:密切关注GC日志,发现并解决内存碎片过多 -
JVM 死锁
问题 \color{#FF0000}{问题} 问题: Java 应用在运行过程中出现死锁现象,即多个线程互相等待,导致程序无法继续运行
解决方式 \color{#00FF00}{解决方式} 解决方式:
(1)线程同步规则:强制线程按照固定顺序获取锁资源,避免死锁循环
(2)超时解锁机制:设置线程获取锁资源的超时时间
(3)死锁检测与诊断:通过jstack命令或JMX接口获取线程Dump信息,分析线程状况和锁资源持有情况、
3.2.1 垃圾回收
垃圾回收是指由 Java 虚拟机(JVM)自动管理内存回收不再使用的对象所占用的内存空间。
必要性
- Java 程序员无需手动管理内存,简化了编程
- 避免了内存泄漏,提高了程序的稳定性
垃圾回收的主要目标
- 自动管理内存:减轻程序员手动管理内存的负担
- 避免内存泄漏:提高程序的稳定性和可靠性
- 提高性能:有效利用内存资源
垃圾回收步骤
- 标记:识别不再使用的对象
- 清除:回收标记为“垃圾”的对象所占用的内存空间
- 整理:将存活的对象移动到一起,以便更好地利用内存空间
垃圾回收算法
- 标记-清除算法:最基本的垃圾回收算法,效率不高 复制算法:将存活的对象复制到新的内存空间中,然后回收旧的内存空间
- 标记-整理算法:在标记-清除算法的基础上增加了整理步骤,提高了内存空间的利用率
- 分代收集算法:根据对象的存活时间将内存划分为不同的区域,并对不同的区域使用不同的垃圾回收算法
常用垃圾收集器
- Serial GC:串行收集器,单线程执行垃圾回收
- Parallel GC:并行收集器,多线程执行垃圾回收
- CMS GC:并发标记-清除收集器,在程序运行时并发执行垃圾回收
- G1 GC:最新的垃圾收集器,基于分代收集算法,具有良好的性能和可扩展性
3.3 多线程和线程池
3.3.1 多线程的概念
指在一个程序中同时执行多个线程
多线程的优势
- 提高程序的执行效率
- 提高程序的响应速度
- 提高程序的可扩展性
多线程的实现
- 继承 Thread 类:创建子类并继承 Thread 类,重写 run()方法来定义线程要执行的任务
- 实现 Runnable接口:创建类并实现 Runnable 接口,重写 run()方法来定义线程要执行的任务
多线程的解决方案
- 使用同步机制:例如 synchronized 关键字、Lock 接口等来保证线程安全
- 避免死锁:例如使用死锁检测和预防机制
- 避免饥饿:例如使用优先级调度算法
多线程的常见问题
- 线程安全:多个线程同时访问同一个共享资源时可能导致数据不一致
- 死锁:两个或多个线程相互等待对方释放资源,导致程序无法继续执行
- 饥饿:一个线程一直无法获得资源,导致程序无法正常运行
3.3.2 线程的创建和销毁
3.3.3 线程同步
定义:线程同步是指多个线程访问同一个共享资源时,通过某种机制来保证数据的正确性和一致性。
线程同步的必要性:
- 避免数据不一致
- 避免线程安全问题
注意事项:
-
同步会降低程序的性能,因此应该尽量减少同步的范围
-
使用 synchronized 关键字时应该注意锁对象的选取
线程同步的实现方式:
-
synchronized 关键字:最常用的同步机制,可以修饰方法或代码块
-
Lock 接口:提供更细粒度的同步控制
-
ReentrantLock 类:可重入锁,可以解决递归锁的问题
-
Semaphore 类:用于控制对资源的访问数量
-
Condition类:用于线程之间的通讯
3.3.4 线程池
线程池是指一组线程的集合,它可以管理线程的生命周期,并提供线程的创建、销毁、调度等功能
线程池的优势
- 提高线程的利用率
- 减少线程的创建和销毁开销
- 提高程序的性能和可扩展性
线程池的实现:
Java 中可以使用java.util.concurrent.ExecutorService 接口来创建线程池
常用线程池类型:
- FixedThreadPool:创建固定数量的线程池
- CachedThreadPool:创建一个可缓存的线程池,线程数量可根据需要动态增长
- ScheduledThreadPool:创建一个可定时执行任务的线程池
线程池的配置参数:
- 核心线程数:线程池中始终保持的线程数量
- 最大线程数:线程池中允许的最大线程数量
- 队列容量:任务队列的容量
- 拒绝策略:当任务队列满时,线程池拒绝新任务的策略
3.4 JDBC
简介
JDBC(Java Database Connectivity)是 Java 语言中用来连接数据库的API,它提供了一套标准的Java接口,允许Java程序访问各种数据库。
常用的JDBC类和接口
- DriverManager
用来管理JDBC驱动程序,主要用于跟踪和加载驱动程序并负责选取数据库驱动程序和建立新的数据库连接。 - Connection
用来连接应用程序与指定的数据库。 - Statement
用来执行静态SQL语句,并得到SQL语句执行后的结果。 - ResultSet
提供对数据库表的访问,执行查询后返回结果集。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?useUnicode=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企业应用程序实战(常用核心类库)
J a v a 核心类库 \color{#FF0000}{Java核心类库} Java核心类库
1 OkHttp
OkHttp 是一个优秀的 HTTP 客户端框架,由Square 开发并开源,OkHttp是一个默认有效的HTTP客户端,有效地执行HTTP可以加快您的负载并节省带宽
主要功能
- 支持 HTTP/2 和 SPDY
- 使用连接池减少请求延迟
- 透明的 GZIP 压缩
- 请求缓存
- 支持多种身份验证方式
- 支持代理
- 支持断点续传
- 支持异步请求
特点:
- 高效
- 易用
- 强大
示例
/**
* 以get方式调用第三方接口
* @param url
*/
public static void doGet(String url) throws IOException {
OkHttpClient okHttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url(url)
.get()//默认就是GET请求,可以不写
.build();
Response response = okHttpClient.newCall(request).execute();
String string = response.body().string();
System.out.println(string);
}
2 Lombok
Lombok 是一个 Java 库,可以自动插入编辑器并构建工具,简化Java 开发。通过添加注解的方式,不需要为类编写 getter 或 setter方法,同时可以自动化日志变量。简而言之:Lombok 能以简单的注解形式来简化 java 代码,提高开发人员的开发效率。
特点:
- 简化代码
- 提高效率
- 增强安全性
常用注解:
- @Getter
- @Setter
- @Data
- @NoArgsConstructor、
- @RequiredArgsConstructor
示例
@Data:
该注解相当于同时加上以下注解@Setter,@Getter,@ToString,@EqualsAndHashCode,作用于类中使用
@Data
public class Person {
private String name;
private String address;
private String city;
private String state;
private String zip;
private Date brithday;
}
3 Guava
Guava 是 Google 开源的一个 Java 库,它提供了一些 Google 内部使用的核心工具,例如集合、缓存、原语类型、并发库、注解、字符串处理、I/0 等。Guava 的目标是为 Java 开发人员提供一个更高效、更易用的工具集。
常用的 Guava 类
- Collections
- Cache
- I/O
- Concurrency
特点
- 丰富的工具类
- 提高开发效率
- 提高代码质量
示例
//使用Guava的集合类
List<String> list = ImmutableList.of("a","b","c");
//使用Guava的缓存框架
Cache<String,Object> cache = CacheBuilder.newBuilder().build();
//使用Guava的原语类型工具类
int sum=Ints.sum(1,2,3);
//使用Guava的Joiner类将list连接成字符串
String str = Joiner.on(",").join(list);