Java 9 +
在Java 9中,您可以简单地编写:Map。条目(关键字,值)
创建一个不可变的pair。
注意:此方法不允许键或值为空。例如,如果您希望允许空值,则需要将其更改为:Map。条目(关键Optional.ofNullable(值))。
Java 8 +
在Java 8中,您可以使用更通用的javafx.util.Pair来创建不可变的、可序列化的pair。这个类允许空键和空值。(在Java 9中,该类包含在javafx中。基础模块)。编辑:从Java 11开始,JavaFX已经从JDK中解耦了,所以您需要额外的maven构件org.openjfx: JavaFX -base。
Java 6 +
在Java 6及更高版本中,您可以使用更详细的AbstractMap。不可变对或AbstractMap的SimpleImmutableEntry。SimpleEntry的值可以被更改。这些类还允许空键和空值,并且是可序列化的。
安卓
如果你正在为Android编写程序,那就使用Pair。Create (key, value)创建一个不可变的pair。
Apache Commons
Apache Commons Lang提供了有用的Pair。(key, value)来创建不可变的、可比较的、可序列化的对。
Eclipse集合
如果您正在使用包含原语的对,Eclipse Collections提供了一些非常有效的原语对类,可以避免所有低效的自动装箱和自动拆箱。
例如,您可以使用PrimitiveTuples。pair(int, int)来创建一个IntIntPair或PrimitiveTuples。(float, long)来创建一个FloatLongPair。
手卷的实现
从Java 16开始,记录已经脱离预览状态,所以您现在可以执行以下操作:
public record Pair<K, V>(K key, V value) {
public static <K, V> Pair<K, V> of(K key, V value) {
return new Pair<>(key, value);
}
}
上面的实现在未来将有很大的优势,因为它将允许您进行记录解构。
在Java 16之前,您可以使用Project Lombok实现相同的语义:
@Value(staticConstructor = "of")
public class Pair<K, V> {
K key;
V value;
}
或者,使用下面的冗长(与已接受的答案中列出的类不同,它可以防止nullpointerexception,并且具有与Records1相同的健壮的hashCode()实现):
import java.util.Objects;
public class Pair<K, V> {
public final K key;
public final V value;
private Pair(K key, V value) {
this.key = key;
this.value = value;
}
public static <K, V> Pair<K, V> of(K key, V value) {
return new Pair<>(key, 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;
}
}
1在OpenJDK 17上测试