概述
当一个方法需返回两个值、并且两个值都有重要意义时,我们一般会用Map的key、value来表达。
但是如果仅返回两个值,就用管理一堆key/value键值对的HashMap等结构,有点大材小用,增加了数据结构的复杂度。所以便出现了pair这个结构来表达这种情况
还有一种情况是:当key和value都保存具体信息时,便需要使用Pair
Pair是一个抽象类,这个类是定义基本API的抽象实现,它指的是左右两个元素,它也实现了Map.Entry接口,也就是key是左元素,value是右元素;
构造方法
配对(Pair)。配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用。
Apache Commons Lang
:- 定义在
org.apache.commons.lang3.tuple.Pair 包
中。 - 需要引入 Apache Commons Lang 库作为依赖。
- 定义在
JavaFX
:- 定义在
javafx.util.Pair 包
中。 - 需要引入 JavaFX SDK,且不再包含在 JDK 中
(从 JDK 11 开始不再包含在 JDK 的标准库中)
- 定义在
由于Pair 类在 JDK 11 开始便不可用,所以下面将使用 Apache Commons Lang 的 Pair来做说明和介绍
实例化:实例化时可以使用MutablePair(可变二元组)和ImmutablePair(不可变二元组),一个可变,一个不可变
- 在不可变元组中,存储值的属性均被final修饰,因而不可变。
Pair<Integer, String> pair = new MutablePair<>(3, "Three");
pair.setValue("New Three");// 如果去set的话,程序运行便会报错
ImmutablePair<Integer, String> pair = new ImmutablePair<>(2, "Two");
Integer key = pair.getKey();
String value = pair.getValue();// 方式2
Pair<Integer,String> pair = Pair.of(1,"2");
System.out.println(pair.getKey());//1
System.out.println(pair.getValue());//"2"
System.out.println(pair.getLeft());//1
System.out.println(pair.getRight());//"2"
和Map的区别
- 数据结构
- Pair:
存储一对相关的值,通常用于表示两个元素之间的关系
。每个pair 可以存储两个值。这两种值的类型没有限制,也可以将自己写的类放进去。适合用于简单的键值对场景,尤其是当只需要存储两个值时
。
- Map: 存储多个键值对,允许通过键快速访问对应的值。
- 适合用于需要
存储和查找多个元素的场景
。
- 适合用于需要
- Pair:
- 元素数量
- Pair:
只能存储两个元素(左值和右值)
。- 适合表示简单的关系,如坐标点、键值对等。
- Map: 可以存储任意数量的键值对。
- 适合表示更复杂的数据结构,如字典、配置项等。
- Pair:
- 访问方式
- Pair:通过 getLeft() 和 getRight() 方法访问元素。
Pair<Integer, String> myPair = Pair.of(1, "Hello"); System.out.println(myPair.getLeft()); // 输出 1 System.out.println(myPair.getRight()); // 输出 Hello
- Map:通过键访问对应的值,使用 get(key) 方法。
- Pair:通过 getLeft() 和 getRight() 方法访问元素。
- 键的唯一性
- Pair: 不涉及键的概念,只有两个值,
没有唯一性的问题
。 - Map:
每个键必须是唯一的,不能重复
。如果插入相同的键,后插入的值会覆盖之前的值。
- Pair: 不涉及键的概念,只有两个值,
- 使用场景
- Pair: 适合用于简单的场景,如返回两个相关的值、表示坐标等。
- Map: 适合用于需要存储和查找多个元素的场景,如配置项、字典、频率统计等。
实现原理
org.apache.commons.lang3.tuple下面的Pair:Pair是一个抽象类,这个类是定义基本API的抽象实现,它指的是左右两个元素,它也实现了Map.Entry接口,也就是key是左元素,value是右元素
- 子类实现的是可能是可变的也可能是不可变的,然而对存储的对象类型是没有限制的,如果可变的对象存储在Pair中,那么Pair对象也会变为可变的;
- 关系如下