Java HashSet和HashMap上contains方法的一致性
如果对哈希集调用remove,为什么哈希集上的containsAll方法不保持一致,而哈希映射上的containsValue方法在移除值后保持一致 从HashSet containsAll中删除值后,即使所有值都存在,containsValue方法也会返回false,其中与HashMap一样,containsValue方法返回正确的值Java HashSet和HashMap上contains方法的一致性,java,hashmap,hashset,Java,Hashmap,Hashset,如果对哈希集调用remove,为什么哈希集上的containsAll方法不保持一致,而哈希映射上的containsValue方法在移除值后保持一致 从HashSet containsAll中删除值后,即使所有值都存在,containsValue方法也会返回false,其中与HashMap一样,containsValue方法返回正确的值 public static void main(String[] args) { HashSet<String> lookup=ne
public static void main(String[] args)
{
HashSet<String> lookup=new HashSet<String>();
HashMap<Integer,String> findup=new HashMap<Integer,String>();
String[] Alltokens={"This","is","a","programming","test","This","is","a","any","language"};
for(String s:Alltokens)
lookup.add(s);
String[] tokens={"This","is","a"};
Collection<String> tok=Arrays.asList(tokens);
lookup.remove(Alltokens[5]);
if(lookup.containsAll(tok))
System.out.print("found");
else
System.out.print("NOT found");
Integer i=0;
for(String s:Alltokens)
findup.put(i++,s);
boolean found=true;
findup.remove(Alltokens[0]);
findup.remove(5); //Edit : trying to remove value whose key is 5
for(String s:tokens)
if(!findup.containsValue(s))
found=false;
System.out.print("\nIn map " + found);
}
//如果删除了一个已经存在的值,那么这将是真的,因为它是假的
可能是因为HashMaps中的键和HashSet中的键没有关系。您能解释一下它们是如何工作的吗?删除了基于键的映射
由于您使用Integer
对象作为键(put(i++,s)
),因此在调用findup.remove(Alltokens[0])时不会删除任何内容。
!检查其返回值以查看是否返回false
删除基于键的映射
由于您使用
Integer
对象作为键(put(i++,s)
),因此在调用findup.remove(Alltokens[0])时不会删除任何内容。
!检查其返回值,查看它是否将返回false
查找后缺少某些内容。删除(Alltokens[5])代码>。以上代码将不会编译。您应该发布实际的代码,并且应该添加{}
,而不是让单行语句为您造成这些问题,因为您重构了代码,代码从一行变为多行。@JoachimSauer很抱歉if条件丢失。现在编辑它查找后缺少一些内容。删除(Alltokens[5])代码>。以上代码将不会编译。您应该发布实际的代码,并且应该添加{}
,而不是允许单行语句为您造成这些问题,因为您重构了代码,代码从一行变为多行。@JoachimSauer很抱歉,if条件丢失。立即编辑它我将其更改为findup.remove(5)即使这样,它也会返回true。此外,如果我传递了一个键或一个值,这将如何计算出来。如果该方法将一个键作为参数,它不会在findup.remove(Alltokens[0])1.5=“this”和“this”在映射中包含两次:一次在0,一次在5。因此,即使删除了5,“This”仍然包含在映射的值中,2。)不,一个字符串
永远不会等于一个整数
,因此它永远不会删除任何内容。Java在大多数情况下都不会为您执行automagic类型转换。如果在删除Alltokens[5]后出现哈希集,因为它不包含重复项,“This”不再存在,并且返回false。但是为什么不findup.remove(Alltokens[0])呢给出一个错误。将字符串传递给接受整数的函数不是一个错误吗?编译的原因是remove()
接受对象,不管键类型是什么。大多数情况下,传入不属于您的密钥类型的内容是错误的,但不幸的是,该决定是固定的,无法轻易更改。我将其更改为findup.remove(5)即使这样,它也会返回true。此外,如果我传递了一个键或一个值,这将如何计算出来。如果该方法将一个键作为参数,它不会在findup.remove(Alltokens[0])1.5=“this”和“this”在映射中包含两次:一次在0,一次在5。因此,即使删除了5,“This”仍然包含在映射的值中,2。)不,一个字符串
永远不会等于一个整数
,因此它永远不会删除任何内容。Java在大多数情况下都不会为您执行automagic类型转换。如果在删除Alltokens[5]后出现哈希集,因为它不包含重复项,“This”不再存在,并且返回false。但是为什么不findup.remove(Alltokens[0])呢给出一个错误。将字符串传递给接受整数的函数不是一个错误吗?编译的原因是remove()
接受对象,不管键类型是什么。大多数情况下,传入不属于您的密钥类型的内容是错误的,但不幸的是,该决定是固定的,不能轻易更改。
lookup.remove("Alltokens[5]");
if(lookup.containsAll(tok))