我需要写这样的东西:
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将包含数万个元素。
您有什么想法解决这个问题吗?感谢。
答案 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。