Java 9+
在Java 9中,您可以简单地编写:Map.entry(key, value)
创建不可变对。
注意:此方法不允许键或值为null。例如,如果要允许空值,则要将其更改为: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;
}
龙目岛将在构造函数中,吸气剂,填充equals()
,hashCode()
和toString()
方法自动生成的字节码为您服务。如果要使用静态工厂方法而不是构造函数(例如a)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;
}
}