Java程序设计

一 Java基础知识

1 Java语言概述

1.1 发展历史

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/56b83540eb0340d2937a4db59892a681.png

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 程序员无需手动管理内存,简化了编程
  • 避免了内存泄漏,提高了程序的稳定性

垃圾回收的主要目标

  • 自动管理内存:减轻程序员手动管理内存的负担
  • 避免内存泄漏:提高程序的稳定性和可靠性
  • 提高性能:有效利用内存资源

垃圾回收步骤

  1. 标记:识别不再使用的对象
  2. 清除:回收标记为“垃圾”的对象所占用的内存空间
  3. 整理:将存活的对象移动到一起,以便更好地利用内存空间

垃圾回收算法

  • 标记-清除算法:最基本的垃圾回收算法,效率不高 复制算法:将存活的对象复制到新的内存空间中,然后回收旧的内存空间
  • 标记-整理算法:在标记-清除算法的基础上增加了整理步骤,提高了内存空间的利用率
  • 分代收集算法:根据对象的存活时间将内存划分为不同的区域,并对不同的区域使用不同的垃圾回收算法

常用垃圾收集器

  • 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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3DEXPERIENCE DELMIA Role: RVN - Robotics Virtual Commissioning Analyst

Discipline: Robotics Role: RVN - Robotics Virtual Commissioning Analyst 通过准确地模拟连接到PLC程序的机器人、设备和传感器&#xff0c;在制造虚拟孪生上执行虚拟调试情景 为任何机器人角色的多周期情景创建传感器&#xff0c;生成和变换零件启用 PLC 程序的虚拟验证和…

visio中画乘法器加法器符号

情景&#xff1a;在进行rtl设计时&#xff0c;需要画出简单的电路实现图&#xff0c;需要用到加法器&#xff0c;乘法器的符号。 位置&#xff1a;在visio的更多形状中&#xff0c;找到如下图的位置&#xff0c;进行添加&#xff0c;即可 最终效果&#xff1a; 可以满足我们日…

0基础认识C语言(理论+实操 2)

小伙伴们大家好&#xff0c;今天也要撸起袖子加油干&#xff01;万事开头难&#xff0c;越学到后面越轻松~ 话不多说&#xff0c;开始正题~ 前提回顾&#xff1a; 接上次博客&#xff0c;我们学到了转义字符&#xff0c;最后留下两个转义字符不知道大家有没有动手尝试了一遍&a…

【5.基础知识和程序编译及调试】

一、GCC概述&#xff1a;是GUN推出的多平台编译器&#xff0c;可将C/C源程序编译成可执行文件。编译流程分为以下四个步骤&#xff1a; 1、预处理 2、编译 3、汇编 4、链接 注&#xff1a;编译器根据程序的扩展名来分辨编写源程序所用的语言。根据不同的后缀名对他们进行相…

鸿蒙时间滑动选择器弹窗

例子&#xff1a; Button(打开弹窗).fontSize(14).width(106).height(32).padding({ left: 0, right: 0 }).fontColor(#999).onClick(()>{DatePickerDialog.show({selected:new Date(),onDateAccept:(value)>{AlertDialog.show({ message:JSON.stringify(value) })}})}) …

react使用react-quill富文本编辑器自定义上传图片,添加handlers后编辑器不显示问题

Quill介绍 Quill 是一款 API 驱动、功能强大的现代富文本编辑器。它具有易于拓展、各平台表现一致性等优点。Quill 官方 1.0 版本于 2016 年 9 月发布&#xff0c;目前在 Github 上有41.8k Star。 官网地址&#xff1a;Quill - Your powerful rich text editor github仓库地…

增强团队建设和创造力的 6 个敏捷游戏

加入敏捷框架提供了对资源的访问和支持&#xff0c;可以帮助你的组织最大限度地发挥敏捷的优势。它还提供了一个与其他敏捷从业者联系的平台&#xff0c;以共享最佳实践并相互学习。 实践敏捷工作方法可以让团队按照自己的节奏&#xff0c;尽可能多地发挥创造力来追求目标&…

自动驾驶路径决策算法——动态规划

文章内容来自b站up主忠厚老实的老王&#xff0c;视频链接如下&#xff1a; 自动驾驶决策规划算法第二章第二节(中) 参考线算法_哔哩哔哩_bilibili 其中host是自车位置&#xff0c;以host在参考线的投影为坐标原点&#xff0c;建立frenet坐标&#xff0c;此时host的坐标是(0,L0…

企业如何打造通证经济生态闭环详解(下)

一、原始账户&#xff1a;用户注册即生成【原始账户】【托管账户】。 原始账户用于存储用户所获取的通证积分&#xff0c;原始账户的公钥与私钥由用户所有&#xff0c;安全、私密、去中心化。 通过原始账户&#xff0c;用户可进行转账、收款的点对点传输&#xff0c;并可查看…

Vue——事件修饰符

文章目录 前言阻止默认事件 prevent阻止事件冒泡 stop 前言 在官方文档中对于事件修饰符有一个很好的说明&#xff0c;本篇文章主要记录验证测试的案例。 官方文档 事件修饰符 阻止默认事件 prevent 在js原生的语言中&#xff0c;可以根据标签本身的事件对象进行阻止默认事件…

如何编写高效的单片机代码?

单片机的程序比软开少一些&#xff0c;真正想编写出高效的代码&#xff0c;还是要积累很多年的。 在做研发工程师的10年里&#xff0c;我经历过几个公司&#xff0c;看过很多工程师写的代码&#xff0c;但真正能让我跪着看完的&#xff0c;极少。哪怕是大厂工程师&#xff0c;也…

详解 Spark 的运行架构

一、核心组件 1. Driver Spark 驱动器节点&#xff0c;用于执行 Spark 任务中的 main 方法&#xff0c;负责实际代码的执行工作主要负责&#xff1a; 将用户程序转化为作业 (job)在 Executor 之间调度任务 (task)跟踪 Executor 的执行情况通过 UI 展示查询运行情况 2. Exec…

centos8系统如何安装宝塔面板

我这边购买了一台Hostease的VPS云主机产品&#xff0c;想要安装宝塔面板&#xff0c;但是我这边是安装时遇到错误&#xff0c;如图&#xff1a; 这边尝试检查了似乎时yum 有问题&#xff0c; 无法通过yum 安装。因此联系了Hostease技术人员帮助&#xff0c;他们告知自2022年1月…

详解Spring IoCDI(一)

目录 1.什么是IoC 2.IoC应用场景&#xff08;案例分析&#xff09; 2.1传统程序开发 2.2问题分析 2.3解决方案 2.4IoC 优势 3. DI概念 4.IoC详解 4.1Bean的存储 4.2Controller&#xff08;控制器存储&#xff09; 4.3获取Bean 4.4Bean相关注解 1.什么是IoC Spring…

统计计算五|MCMC( Markov Chain Monte Carlo)

系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法&#xff08;Expectation-Maximization Algorithm&#xff0c;期望最大化算法&#xff09; 统计计算三|Cases for EM 统计计算四|蒙特卡罗方法&#xff08;Monte Carlo Method&#xff09; 文章目录 系列文章目录一…

echarts性能优化

echarts数据量多的时候优化方案&#xff1a; 渲染的数据太多时&#xff0c;渲染的速度会变慢。 let data [];for (let i 0; i < 100000; i) {let style {};if (i % 2 0) {style.color "red";}data.push({value: i,itemStyle: style,}); } myEcharts init(c…

STM32-13-MPU

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 文章目录 STM32-12-MPU1. 内存保护单元MPU1. M…

交换机的三层交换技术

现有pc1与pc2不在同一个网段之下&#xff0c;通过交换机相连接。 进人交换机1&#xff0c;创建两个vlan 10和vlan 20 &#xff0c;进入串口2设置串口模式为access&#xff0c;并且设置默认vlan为10.进入串口3设置串口模式为access&#xff0c;并且设置默认vlan为20. 进入串口1…

深度解析搜索引擎广告(SEM)与社交媒体广告(SMM):NetFarmer助力企业数字化出海

在当今数字化时代&#xff0c;企业出海已经成为了一个必然趋势。然而&#xff0c;如何有效地在海外市场中推广品牌、吸引潜在客户&#xff0c;成为了众多企业面临的重要挑战。搜索引擎广告&#xff08;SEM&#xff09;和社交媒体广告&#xff08;SMM&#xff09;作为两种主要的…

如何下载b站(哔哩哔哩bilibili)的学习视频教程

方法1&#xff1a; 打开粘贴视频链接下载即可哔哩哔哩(bilibili)视频解析下载 - 保存B站视频到手机、电脑哔哩哔哩高清视频解析下载工具是一个免费的B站视频在线解析提取工具,支持提取B站APP和bilibili网站上的任何视频,提取出来的视频无水印.我们可以借助此下载器方便地将视频…