Java HashSet和HashMap上contains方法的一致性

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

如果对哈希集调用remove,为什么哈希集上的containsAll方法不保持一致,而哈希映射上的containsValue方法在移除值后保持一致 从HashSet containsAll中删除值后,即使所有值都存在,containsValue方法也会返回false,其中与HashMap一样,containsValue方法返回正确的值

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))