Java 是否可以创建一个地图,其中每个关键点指向相同的值?
(在Java中)是否可以创建一个映射,在该映射中,无论我要搜索哪个键,我都会检索相同的值?我们可以假设键的数量是有限的,也可以是无限的 我考虑了大小为1、加载因子为1.0的映射,其中存储了该值,但我几乎肯定hashmap实现将识别冲突,并返回null 我还考虑了这样一种可能性:如果我为一个变量创建了自己的hashfunction,或者甚至为实现Map的新数据类型创建了hashfunction,那么我应该能够做到这一点,但这可能有点混乱。也许不是Java 是否可以创建一个地图,其中每个关键点指向相同的值?,java,hashtable,Java,Hashtable,(在Java中)是否可以创建一个映射,在该映射中,无论我要搜索哪个键,我都会检索相同的值?我们可以假设键的数量是有限的,也可以是无限的 我考虑了大小为1、加载因子为1.0的映射,其中存储了该值,但我几乎肯定hashmap实现将识别冲突,并返回null 我还考虑了这样一种可能性:如果我为一个变量创建了自己的hashfunction,或者甚至为实现Map的新数据类型创建了hashfunction,那么我应该能够做到这一点,但这可能有点混乱。也许不是 当然,简单地将值映射到每个键将是非常低效的(除非有
当然,简单地将值映射到每个键将是非常低效的(除非有一个内置的方法,我忽略了),而且远没有听到SO的答案那么有趣。我不太确定您在这里想要完成什么,但您需要做的就是实现。例如:
import java.util.Collection;
import java.util.Map;
import java.util.Set;
public class ImmutableMap<K, V> implements Map<K, V> {
private final V immutableValue;
public ImmutableMap(final V immutableValue) {
this.immutableValue = immutableValue;
}
@Override
public int size() {
return 0;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean containsKey(Object key) {
return false;
}
@Override
public boolean containsValue(Object value) {
if (value == immutableValue)
return true;
return false;
}
@Override
public V get(Object key) {
return immutableValue;
}
@Override
public V put(K key, V value) {
throw new UnsupportedOperationException();
}
@Override
public V remove(Object key) {
throw new UnsupportedOperationException();
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
throw new UnsupportedOperationException();
}
@Override
public void clear() {
throw new UnsupportedOperationException();
}
/**
* Below are some unnecessary methods for the purpose of this class.
* You may decide their action.
*/
@Override
public Set<K> keySet() {
return null;
}
@Override
public Collection<V> values() {
return null;
}
@Override
public Set<java.util.Map.Entry<K, V>> entrySet() {
return null;
}
}
import java.util.Collection;
导入java.util.Map;
导入java.util.Set;
公共类ImmutableMap实现了映射{
私有最终V不可变值;
公共不可变映射(最终V不可变值){
this.immutableValue=immutableValue;
}
@凌驾
公共整数大小(){
返回0;
}
@凌驾
公共布尔值为空(){
返回false;
}
@凌驾
公共布尔containsKey(对象键){
返回false;
}
@凌驾
公共布尔包含值(对象值){
如果(值==不可变值)
返回true;
返回false;
}
@凌驾
public V get(对象键){
返回不可变值;
}
@凌驾
公共V输入(K键,V值){
抛出新的UnsupportedOperationException();
}
@凌驾
公共V删除(对象密钥){
抛出新的UnsupportedOperationException();
}
@凌驾
public void putAll(Map我认为使用现有API实现这一点最合理的方法如下:
// Java 6/7
new TreeMap<K, V>(new Comparator<K>() {
@Override
public int compare(K lhs, K rhs) {
return 0;
}
});
// Java 8+
new TreeMap<K, V>((a, b) -> 0);
因此,您可能会记住这一点,例如,如果您计划检查入口集
我不确定您要完成什么,我想带有默认值的映射应该适合您。这是非常标准的模式
您可以使用apachecommons实现
在Java8中,可以使用Map.getOrDefault
您始终可以实现自己的
是的,这正是我所考虑的。这似乎是一个不太理想的情况,因为它创建了一个只能使用一次的类。你应该实现Map而不是HashMap,并正确地实现所有方法。我无法理解immutableValue
没有映射到任何键,put
函数是no不可用。因此它类似于普通的dto
,可以保存相同的数据,而不扩展到HashMap。如果我的理解有任何地方出错,请纠正我。创造性的回答!我没有想到比较器,因为我以前从未在实践中使用过比较器。我会尝试一下,谢谢。使用自定义比较器的TreeMap可以做到这一点有很多有趣的东西。
m.put("abc", "123");
m.put("def", "456");
// prints something like {abc=456}
System.out.println(m);