以String[]为键的ImmutableMap无法匹配正确键返回对应值
问题原因与解决方案
核心问题
你遇到的问题根源在于:Java数组的equals()方法默认比较的是对象引用,而非数组内容。即使两个String[]的元素完全一致,只要它们是不同的数组对象,equals()就会返回false,导致ImmutableMap无法匹配到对应的键值对。
可行解决方案
1. 使用不可变列表作为键(推荐)
Guava的ImmutableList的equals()方法是基于内容比较的,而且本身不可变,完全符合Map键的要求:
// 初始化ImmutableMap ImmutableMap<ImmutableList<String>, String> map = ImmutableMap.of( ImmutableList.of("1234"), "目标值" ); // 获取对应值 String targetValue = map.get(ImmutableList.of("1234"));
2. 自定义数组包装类
通过自定义类包装数组,并重写equals()和hashCode()方法,让它们基于数组内容比较:
import java.util.Arrays; class StringArrayKey { private final String[] array; public StringArrayKey(String[] array) { // 拷贝数组,避免外部修改内部状态 this.array = Arrays.copyOf(array, array.length); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; StringArrayKey that = (StringArrayKey) o; return Arrays.equals(array, that.array); } @Override public int hashCode() { return Arrays.hashCode(array); } } // 使用示例 ImmutableMap<StringArrayKey, String> map = ImmutableMap.of( new StringArrayKey(new String[]{"1234"}), "目标值" ); String targetValue = map.get(new StringArrayKey(new String[]{"1234"}));
3. 复用同一个数组引用(不推荐)
如果必须使用数组作为键,要确保获取值时使用与初始化Map时完全相同的数组引用:
String[] key = new String[]{"1234"}; ImmutableMap<String[], String> map = ImmutableMap.of(key, "目标值"); // 必须用同一个引用获取 String targetValue = map.get(key);
这种方式耦合性极高,一旦引用丢失或被修改就会出问题,不建议在实际业务中使用。
内容的提问来源于stack exchange,提问作者Maxsteel
相关产品推荐
相关产品推荐

