[英]Void Class in HashMap as a Value object
我知道HasMap
是一个键-值对的基本知识,但是我想拥有一个仅包含键的HashMap (无值)
我想在我的复杂方法(即仅具有键且没有与这些键相关联的值的HashMap
下的Java代码段下放置。 我的要求是我正在处理重复记录List
,并且在比较期间,我在HasMap
仅保留一个标识符值(来自重复项组),以后可以比较系统是否已经处理了它。
这是代码段(由于Void类无法实例化,导致编译时错误)。
Map<Integer,Void> map=new HashMap<Integer, Void>();
//Some Logic goes here
map.put("ss",new Void());
欢迎任何仅具有HasMap的无价值的建议/帮助。
如果我理解正确,则需要一个可以在其中添加密钥的列表,但该列表不应允许添加重复的密钥。 然后的解决方案是使用Set
( Oracle文档 ):
Set<Integer> mySet = new TreeSet<Integer>();
Java还提供了一个Hashset
( Oracle Documentation )
Set<Integer> mySet = new HashSet<Integer>();
您可能还需要自己的Comparator
。
通常,您可以使用Set来解决此类问题,因为根本不使用值时就不需要键-值结构。
正确的解决方案
Set<String> uniqueValues = new HashSet<String>();
uniqueValues.add( "a" );
uniqueValues.add( "a" );
assert uniqueValues.size() == 1;
请注意,这只是出于完整性的考虑,我将始终使用Set来满足您的要求,其余的则更多是为了使学习/使人困惑:
由于Void具有私有构造函数,因此您无法使用新的关键字创建实例。
但是,至少有两种可能性可以在地图中放置某些内容。 解决方案之一是将null添加为值。 因为无论如何您都不需要它。 第二个将使用反射来忽略Void类的私有构造函数。
破解方案
Map<String, Void> map = new HashMap<String,Void>();
Constructor<Void> constructor= (Constructor<Void>) Void.class.getDeclaredConstructors()[0];
constructor.setAccessible(true);
Void voidObj = constructor.newInstance();
map.put( "a", voidObj );
map.put( "a", voidObj );
assert map.size() == 1;
为什么不只使用另一个列表? 如果出于任何原因确实需要使用HashMap,则可以添加null值而不是void。
Map<Integer,Object> map=new HashMap<Integer, Object>();
map.put("ss", null);
请不要这样做。 HashMap
是作为键值对的Map
。 一个Map
没有价值不是Map
。
如果你想存储的值没有重复使用Set
-一个的HashSet的例子。
首先, Void
类的构造函数是private ,因此编译器会将new Void()
标记为错误。 接下来,为防止重复,您可以使用Set
。 为什么不使用HashSet
?
这是javadoc关于Void
说法->
Void类是一个无法实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.