如何更改Java集';s Retainal方法是否使用equals方法而不是==运算符?

如何更改Java集';s Retainal方法是否使用equals方法而不是==运算符?,java,string,set,equality,set-intersection,Java,String,Set,Equality,Set Intersection,我试图测试字符串的两个哈希集是否包含相同的字符串。Java集合的retainAll()方法(据我所知,它实现了集合接口)是检查两个集合的交集的好方法。但是,此方法似乎使用=样式检查它们是否引用了相同的内存对象来测试相等性,而不是使用字符串的equals()方法来检查内容是否相同。有没有一种方法可以得到像Retainal这样的东西,但是使用equals()方法 我试图编写代码来检查一个字符串是否包含来自另一个字符串的超过一定长度的子字符串。我的策略是为每个字符串创建一个哈希集,其中包含该长度的所有

我试图测试
字符串的两个
哈希集
是否包含相同的
字符串
。Java集合的
retainAll()
方法(据我所知,它实现了集合接口)是检查两个集合的交集的好方法。但是,此方法似乎使用
=
样式检查它们是否引用了相同的内存对象来测试相等性,而不是使用字符串的
equals()
方法来检查内容是否相同。有没有一种方法可以得到像Retainal这样的东西,但是使用
equals()
方法

我试图编写代码来检查一个字符串是否包含来自另一个字符串的超过一定长度的子字符串。我的策略是为每个字符串创建一个哈希集,其中包含该长度的所有子字符串,然后检查这些集是否包含公共字符串

我当前的解决方案是创建我自己的静态方法,它实现我希望Retainal方法完成的任务

static boolean containsEqualElement(Set SetOne, Set SetTwo) {
    Iterator it = SetOne.iterator();
    while (it.hasNext()) {
        Object thisComp = it.next();
        Iterator it2 = SetTwo.iterator();
        while (it2.hasNext()) {
            if (it2.next().equals(thisComp)) {
                return true;
            }
        }
    }
    return false;
}

我不确定该方法的效率与保留方法相比如何。

实际上保留所有使用包含的使用本身等于,至少是标准版本。也许您实际上使用了一个IdentityHashMap,它确实会使用内存引用来表示相等,但这是因为您需要它

public boolean  [More ...] retainAll(Collection<?> c) {
        boolean modified = false;
        Iterator<E> e = iterator();
        while (e.hasNext()) {
            if (!c.contains(e.next())) {
                e.remove();
                modified = true;
            }
        }
        return modified;
    }

     public boolean  [More ...] contains(Object o) {
         Iterator<E> e = iterator();
        if (o==null) {
            while (e.hasNext())
                if (e.next()==null)
                    return true;
        } else 
            while (e.hasNext()
                if (o.equals(e.next()))
                    return true;
        }
        return false;
    }
public boolean[More…]retainal(集合c){
布尔修改=假;
迭代器e=迭代器();
while(e.hasNext()){
如果(!c.contains(e.next())){
e、 删除();
修改=真;
}
}
修改返回值;
}
公共布尔值[More…]包含(对象o){
迭代器e=迭代器();
如果(o==null){
while(e.hasNext())
如果(如next()==null)
返回true;
}否则
while(e.hasNext()
如果(o.equals(e.next()))
返回true;
}
返回false;
}

下次,请考虑使用调试器进行双重检查(甚至是来自JDK的代码)或谷歌IT(如HasSt.保留代码源),您会发现类似的情况:

这就是我对您的问题所做的回答。

如果您检查,您可以看到retainAll()使用:

public boolean retainal(集合c){
对象。要求不完整(c);
布尔修改=假;
迭代器it=迭代器();
while(it.hasNext()){
如果(!c.contains(it.next())){
it.remove();
修改=真;
}
}
修改返回值;
}
contains()的文档说明:

如果此集合包含指定的元素,则返回true。更正式地说,当且仅当此集合包含至少一个元素e时,才返回true,即(o==null?e==null:o.equals(e))


因此,retainAll()基于equals()检查,这是您想要的。

您的问题中的以下陈述:

但是,此方法似乎使用==样式检查它们是否引用了相同的内存对象,而不是使用字符串的equals()方法检查内容是否相同来测试相等性

是错误的。
retainAll
确实使用了
contains
,而contains又使用了
equals

我不完全理解您的用例,但我认为您可能会发现该方法比
retainal
更有用

如果两个指定集合没有共同的元素,则返回
true

您可以这样使用它:

if (!Collections.disjoint(setOne, setTwo)) {
    // sets have at least one element in common
}

我建议您使用此方法是因为
retainAll
修改了调用它的集合。实际上,它删除了此集合中不包含在参数集合中的所有元素。从您的代码中,您似乎不希望出现此行为。

此方法似乎使用==样式ch测试是否相等eck:不,它没有。它使用equals()。它肯定使用equals
。你忘了实现hashCode?我当前的解决方案是这样的:静态布尔containsEqualElement(Set SetOne,Set SetTwo){Iterator it=SetOne.Iterator();while(it.hasNext()){Object thisComp=it.next();迭代器it2=SetTwo.Iterator();而(it2.hasNext()){if(it2.next().equals(thisComp)){return true;}}}}}return false;}我在包含静态方法的类和调用该方法的可执行代码的类中导入了HashSet和Set,但在这两个类中都没有实现hashCode。集合的全部目的是提供一个快速的contain()方法。迭代所有元素并将它们与equals()进行比较违背了整个目的。你的方法和Retainal做的事情完全不同,因此它们不可比较。此外,你应该真正学习Java命名约定,并使用泛型。我们不再是2005年了。你指的是过时的OpenJDK 6。它仍然基于equals()但是代码是不同的。很高兴知道,但我想用实际使用的版本进行调试对提出问题的人会有很大帮助;)
if (!Collections.disjoint(setOne, setTwo)) {
    // sets have at least one element in common
}