如何检测URL对象是否指向与Collection中的另一个URL对象相同的路径

时间:2011-03-16 18:10:25

标签: java url set contains

我需要写这样的东西:

private Set processedLinks = new HashSet();

public boolean isProcessed(String url) throws MalformedURLException {

        return processedLinks.contains(new URL(url));
    }

这不起作用,因为创建的URL是除集合中的URL之外的另一个对象。我需要比较主机和创建的URL文件与HashSet中的URL的匹配。什么是最好的方法?

我想用我的类扩展URL并覆盖equals(),但URL是最终的。所以我的第二个想法就是创建类似URLHashSet的东西,扩展HashSet并覆盖contains方法。但我不确定它是否会对性能产生负面影响,因为HashSet将包含数万个元素。

您有什么想法解决这个问题吗?感谢。

4 个答案:

答案 0 :(得分:1)

我建议使用URI代替网址。

应该避免

URL.equals。从docs您将看到它需要名称解析(这是一个阻止操作)并且“已知与HTTP中的虚拟主机不一致”。 URI更有意义,因为您实际上并不比较物理位置,只是标识符。

答案 1 :(得分:0)

尝试使用URL对象的String表示。

答案 2 :(得分:0)

我不希望这听起来很苛刻,但我认为你对equals / hashCode的理解是有缺陷的。

即使对象引用是两个独立的对象,URL也应该散列并进行相同的比较。

我会尝试使用相同的字符串URL值创建两个单独的URL对象的简单测试。

以下测试应该给你答案:

u1 == u2 => false
u1.equals(u2) => true
u2.equals(u1) => true
u1.hashCode() == u2.hashCode() => true

除非我对您的问题的理解不正确。

答案 3 :(得分:0)

您可以使用合成而不是继承,例如:

class MyUrl {

  private Url url;

  public boolean equals (MyUrl otherUrl) {
  }

}

并制作一套MyUrl。