为什么java.net.URL';将主机解析为IP的哈希代码?
第一次解决方案后的想法是否依赖于操作系统缓存?但这似乎效率低下,而且在多个域解析到同一IP的情况下,这是不正确的。我缺少什么?不要使用为什么java.net.URL';将主机解析为IP的哈希代码?,java,url,Java,Url,第一次解决方案后的想法是否依赖于操作系统缓存?但这似乎效率低下,而且在多个域解析到同一IP的情况下,这是不正确的。我缺少什么?不要使用java.net.URL。这就是你问题的简单答案。改用java.net.URI,这样做不会解析主机名。很多人认为这是一个非常糟糕的主意 下面是一些来自媒体的解释。 这也很有用。hashCode()与equals()密切相关。equals()的文档中对此行为的解释如下: 如果发生以下情况,则认为两台主机是等效的 两个主机名都可以解析为 相同的IP地址;否则,如果有的
java.net.URL
。这就是你问题的简单答案。改用java.net.URI
,这样做不会解析主机名。很多人认为这是一个非常糟糕的主意
下面是一些来自媒体的解释。
这也很有用。hashCode()
与equals()
密切相关。equals()
的文档中对此行为的解释如下:
如果发生以下情况,则认为两台主机是等效的
两个主机名都可以解析为
相同的IP地址;否则,如果有的话
无法解析主机名,主机
名字必须是平等的,不分性别
案例或者两个主机名都等于
空
资料来源:文件
为什么java.net.URL的哈希代码将主机解析为IP
有两个原因。第一个是:
类的行为被设计为将URL建模为网络可访问资源的定位器。具体地说,URL
和equals
被设计成两个hashCode()
实例,如果它们位于相同的资源,则它们是相等的。这要求将DNS名称解析为IP地址李>URL
URL.equals
方法无法可靠地确定两个URL字符串是否为同一资源的定位器。原因包括虚拟主机、HTTP 30x转发和服务器内部URL映射等URL.equals
和URL.hashcode
的IP解析行为对于没有经验的Java程序员来说是一个陷阱,尽管有明确的文档记录URL.equals
的IP解析也可能会对性能造成意外(不必要)的影响URL
设计的这一方面是一个错误
这就引出了第二个更重要的原因
的行为是很久以前定义的,如果不破坏(可能)数百万已部署的Java应用程序,现在就不可能改变它。这排除了Sun(现在的Oracle)改变它的任何可能性URL.equals(Object)
当我在上面说“不能”时,我的意思是理论上不可能。处理一些更困难的情况需要更改HTTP协议。即使HTTP的某个(假设的)未来版本“修复”了这个问题,20年后我们仍将处理遗留HTTP服务器。。。因此,
URL.equals
仍然会被破坏。这到底是如何回答这个问题的?使用java.net.URI
只是避免了这个问题。@Dolph:“医生,当我触摸这里时,它会痛!”“那么,不要触摸它!”很可爱,但问题是“它为什么痛?”我们最终使用.toString()作为hashmap键+1来回答为什么URL
函数会这样,尽管我仍然认为使用URL
是错误的,即使它的设计初衷是好的。支持/反对使用URL
/URI
也会偏离这个问题。“如果不破坏(可能)数百万已部署的Java应用程序,现在就不可能改变”——可以说,依赖此行为的应用程序已经被破坏了。@Dolda2000-可能。但即便如此,甲骨文(IMO)通过“修复”URI类,也不可能冒险让一部分客户的情况变得更糟。对甲骨文来说,这将适得其反。(向现有应用程序未损坏的客户付款的好处是零。这只会帮助人们编写新的应用程序,而对Oracle的好处是微乎其微的。)(显然,我的意思是“修复URL类”。URI类没有损坏。)