Java 9+
在 Java 9 中,您可以简单地写成:Map.entry(key, value)
创建一个不可变对。
注意:此方法不允许键或值为空。例如,如果您想允许空值,您需要将其更改为:Map.entry(key, Optional.ofNullable(value))。
Java 8+
在 Java 8 中,您可以使用更通用的 javafx.util.Pair 来创建不可变的、可序列化的对。这个类确实允许空键和空值。 (在 Java 9 中,此类包含在 javafx.base 模块中)。 编辑:从 Java 11 开始,JavaFX 已与 JDK 分离,因此您需要额外的 maven 工件 org.openjfx:javafx-base。
Java 6+
在 Java 6 及更高版本中,您可以将更详细的 AbstractMap.SimpleImmutableEntry 用于不可变对,或者将 AbstractMap.SimpleEntry 用于其值可以更改的对。这些类还允许空键和空值,并且是可序列化的。
安卓
如果您正在为 Android 编写代码,只需使用 Pair.create(key, value) 创建一个不可变对。
Apache Commons
Apache Commons Lang 提供有用的Pair.of(key, value) 来创建不可变、可比较、可序列化的对。
Eclipse 集合
如果您使用包含原语的对,Eclipse Collections 提供了一些非常有效的原语对类,可以避免所有低效的自动装箱和自动拆箱。
例如,您可以使用PrimitiveTuples.pair(int, int) 创建IntIntPair,或使用PrimitiveTuples.pair(float, long) 创建FloatLongPair。
龙目岛计划
使用Project Lombok,您可以简单地通过编写来创建一个不可变对类:
@Value
public class Pair<K, V> {
K key;
V value;
}
Lombok 会在生成的字节码中自动为您填写构造函数、getter、equals()、hashCode() 和toString() 方法。如果您想要静态工厂方法而不是构造函数,例如 Pair.of(k, v),只需将注解更改为:@Value(staticConstructor = "of")。
否则
如果上述解决方案都没有让您的船浮起来,您可以简单地复制并粘贴以下代码(与接受的答案中列出的类不同,它可以防止 NullPointerExceptions):
import java.util.Objects;
public class Pair<K, V> {
public final K key;
public final V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public boolean equals(Object o) {
return o instanceof Pair && Objects.equals(key, ((Pair<?,?>)o).key) && Objects.equals(value, ((Pair<?,?>)o).value);
}
public int hashCode() {
return 31 * Objects.hashCode(key) + Objects.hashCode(value);
}
public String toString() {
return key + "=" + value;
}
}