Java程序设计

news2024/11/15 16:50:32

一 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.coloradmin.cn/o/1714903.html

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

相关文章

长难句打卡5.29

Today, professors routinely treat the progressive interpretation of history and progressive public policy as the proper subject of study while portraying conservative or classical liberal ideas — such as free markets and self-reliance — as falling outsid…

学习笔记——动态路由协议——OSPF(OSPF网络类型1)

五、OSPF网络类型 网络类型&#xff1a;是指运行OSPF网段的二层链路类型。 1、OSPF网络类型简介 (1) OSPF网络类型 MA(Multi-Access &#xff0c;多路访问)在一个网段内的节点数量不限制(一条链路上有多个访问点)。MA的网络一般分为两种&#xff1a; 1)广播式多路访问网络…

vue3学习(四)

前言 接上篇学习笔记&#xff0c;分享3个内置组件&#xff1a;动态组件、缓存组件、分发组件基本用法。大家一起通过code的示例&#xff0c;从现象理解,注意再次理解生命周期。 一、code示例 组件A&#xff1a;CompA <script setup> import {onMounted, onUnmounted} f…

市场巨变,移动开发行业即将迎来“第二春”?

随着鸿蒙生态的不断壮大&#xff0c;越来越多的企业开始加入其中&#xff0c;对鸿蒙OS开发工程师的需求也越来越迫切。 年初时还只有200个APP宣布加入鸿蒙生态&#xff0c;而最近华为也已经官宣&#xff0c;已经有4000多个应用加入鸿蒙&#xff0c;短短三个月就增加了20倍。 …

.NET 直连SAP HANA数据库

前言 上个项目碰到的需求&#xff0c;IT部门要求直连SAP的HANA数据库&#xff0c;以只读的权限读取SAP部门开发的CDS视图&#xff0c;是个有点复杂的工程&#xff0c;需要从成品一直往前追溯到原材料的产地&#xff0c;和交货单、工单、采购订单有相当程度上的关联 IT部门要求…

MySQL的安全性

给root用户设置密码 点击用户--下面三个账号双击--进行编辑 修改密码--修改完进行保存 关闭数据库后连接不上 重新编辑&#xff0c;设置密码 新建账号 填入信息--保存&#xff08;主机哪里要选择%&#xff09; 连接这个新的账号 点击连接--填写连接的名称&#xff0c;地址&…

使用moquette mqtt发布wss服务

文章目录 概要一、制作的ssl证书二、配置wss小结 概要 moquette是一款不错的开源mqtt中间件&#xff0c;github地址&#xff1a;https://github.com/moquette-io/moquette。我们在发布mqtt服务的同时&#xff0c;是可以提供websocket服务器的&#xff0c;有些场景下需要用到&a…

多激光雷达ip与端口配置

首先是雷达的ip 我们连上雷达&#xff0c;想要进入雷达的上位机的时候&#xff0c;需要对本机ip进行一些配置&#xff1a; 第一个是ip&#xff0c;第二个是掩码&#xff0c;第三个是网关。 其中ip可以通过wireshark来进行读取&#xff0c;一般就是192.168.102(雷达默认) 然后掩…

一种基于高德Web API实现沿路画面的实现

概述 本文在mapboxGL框架下&#xff0c;分享一种基于高德Web API实现沿路画面的实现。 实现效果 实现 1. 实现思路 通过点击获取路径的起点和终点&#xff1b;将多次规划路径的结果连成一条线&#xff1b;当鼠标点击回到第一个点的时候结束绘制&#xff1b;绘制结束后将路径…

Linux: network: tcp spurious retrans 的一个原因

最近分析问题的时候&#xff0c;从wireshark里看有&#xff1a;tcp spurious retrans 的包&#xff0c;309这个是307 的retransmission&#xff0c;而且在308 回复了ACK。那为什么会重传&#xff1f; 从网上找了一些&#xff0c;比如 https://www.packetsafari.com/blog/2021…

# 解决 win11 连接共享打印机,报错 0x00000709 问题

解决 win11 连接共享打印机&#xff0c;报错 0x00000709 问题 一、问题描述&#xff1a; 当我们连接一台共享打印机&#xff0c;出现报错 0x00000709 时&#xff0c;这是由于本机注册表本配置 RPC 远程调用&#xff0c;我们需要对自己的电脑进行修改&#xff0c;而不是主机&a…

3DEXPERIENCE DELMIA Role: RVN - Robotics Virtual Commissioning Analyst

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

【C语言习题】25.求两个数二进制中不同位的个数

文章目录 作业标题作业内容2.解题思路3.具体代码4.代码讲解 作业标题 求两个数二进制中不同位的个数 作业内容 编程实现&#xff1a;两个int&#xff08;32位&#xff09;整数m和n的二进制表达中&#xff0c;有多少个位(bit)不同&#xff1f; 输入例子: 1999 2299 输出例…

算法——链表

一、重新排队——蓝桥杯3255 1.2题解 思路 对1-n的数字进行m次操作得到的结果&#xff08;每次移动的是x&#xff09; 代码 #include <iostream> using namespace std; int main() {// 请在此输入您的代码int n,m;cin>>n>>m;int i1;int a[m][3];for(i;i…

数据结构(八)二叉树、哈希查找

文章目录 一、树&#xff08;一&#xff09;概念1. 前序遍历&#xff1a;根左右2. 中序遍历&#xff1a;左根右3. 后序遍历&#xff1a;左右根4. 层序遍历&#xff1a;需要借助队列实现 &#xff08;二&#xff09;代码实现&#xff1a;二叉树1. 结构体定义2. 创建二叉树1. 注意…

探析GPT-4o:技术之巅的跃进

如何评价GPT-4o? 简介&#xff1a;最近&#xff0c;GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价&#xff0c;包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。 随着人工智能领域的不断发展&#xff0c;GPT系列模型一直处于行业的前沿。最近&#xff0c;GPT-4…

基于51单片机的温度+烟雾报警系统设计

一.硬件方案 本设计采用51单片机为核心控制器&#xff0c;利用气体传感器MQ-2、ADC0832模数转换器、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片&#xff0c;当环境中可燃气体浓度或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号&#xff0c;以此来…

2018 年山东省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书

2018年山东省职业院校技能大赛高职组 “信息安全管理与评估”赛项任务书 赛项时间 8:30-13:00&#xff0c;共计4小时30分钟&#xff0c;含赛题发放、收卷时间。 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备配置防护 …

【MATLAB源码-第217期】基于matlab的16QAM系统相位偏移估计HOS算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 高阶统计量&#xff08;HOS&#xff09;频偏估计算法 高阶统计量&#xff08;Higher Order Statistics, HOS&#xff09;频偏估计算法是一种先进的信号处理技术&#xff0c;广泛应用于现代数字通信系统中&#xff0c;以应对…

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

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