Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java.net.URL';将主机解析为IP的哈希代码?_Java_Url - Fatal编程技术网

为什么java.net.URL';将主机解析为IP的哈希代码?

为什么java.net.URL';将主机解析为IP的哈希代码?,java,url,Java,Url,第一次解决方案后的想法是否依赖于操作系统缓存?但这似乎效率低下,而且在多个域解析到同一IP的情况下,这是不正确的。我缺少什么?不要使用java.net.URL。这就是你问题的简单答案。改用java.net.URI,这样做不会解析主机名。很多人认为这是一个非常糟糕的主意 下面是一些来自媒体的解释。 这也很有用。hashCode()与equals()密切相关。equals()的文档中对此行为的解释如下: 如果发生以下情况,则认为两台主机是等效的 两个主机名都可以解析为 相同的IP地址;否则,如果有的

第一次解决方案后的想法是否依赖于操作系统缓存?但这似乎效率低下,而且在多个域解析到同一IP的情况下,这是不正确的。我缺少什么?

不要使用
java.net.URL
。这就是你问题的简单答案。改用
java.net.URI
,这样做不会解析主机名。

很多人认为这是一个非常糟糕的主意

下面是一些来自媒体的解释。 这也很有用。

hashCode()
equals()
密切相关。
equals()
的文档中对此行为的解释如下:

如果发生以下情况,则认为两台主机是等效的 两个主机名都可以解析为 相同的IP地址;否则,如果有的话 无法解析主机名,主机 名字必须是平等的,不分性别 案例或者两个主机名都等于 空

资料来源:文件

为什么java.net.URL的哈希代码将主机解析为IP

有两个原因。第一个是:

  • URL
    类的行为被设计为将URL建模为网络可访问资源的定位器。具体地说,
    equals
    hashCode()
    被设计成两个
    URL
    实例,如果它们位于相同的资源,则它们是相等的。这要求将DNS名称解析为IP地址
事后诸葛亮,我们知道以下几点:

  • URL.equals
    方法无法可靠地确定两个URL字符串是否为同一资源的定位器。原因包括虚拟主机、HTTP 30x转发和服务器内部URL映射等

  • URL.equals
    URL.hashcode
    的IP解析行为对于没有经验的Java程序员来说是一个陷阱,尽管有明确的文档记录

  • 即使在得到正确答案的情况下,
    URL.equals
    的IP解析也可能会对性能造成意外(不必要)的影响

  • 简言之。。。
    URL
    设计的这一方面是一个错误

    这就引出了第二个更重要的原因

    • URL.equals(Object)
      的行为是很久以前定义的,如果不破坏(可能)数百万已部署的Java应用程序,现在就不可能改变它。这排除了Sun(现在的Oracle)改变它的任何可能性
    也许Java类库(假设的)继承者的设计者可以解决这个问题(以及其他问题)。当然,要实现这一点,必须将与现有Java程序的向后兼容性排除在外

    最后,Java应用程序开发人员的真正答案是简单地使用URI类。(真正的软件工程是尽可能地完成工作,而不是抱怨提供给你的工具。)



    当我在上面说“不能”时,我的意思是理论上不可能。处理一些更困难的情况需要更改HTTP协议。即使HTTP的某个(假设的)未来版本“修复”了这个问题,20年后我们仍将处理遗留HTTP服务器。。。因此,
    URL.equals
    仍然会被破坏。

    这到底是如何回答这个问题的?使用
    java.net.URI
    只是避免了这个问题。@Dolph:“医生,当我触摸这里时,它会痛!”“那么,不要触摸它!”很可爱,但问题是“它为什么痛?”我们最终使用.toString()作为hashmap键+1来回答为什么
    URL
    函数会这样,尽管我仍然认为使用
    URL
    是错误的,即使它的设计初衷是好的。支持/反对使用
    URL
    /
    URI
    也会偏离这个问题。“如果不破坏(可能)数百万已部署的Java应用程序,现在就不可能改变”——可以说,依赖此行为的应用程序已经被破坏了。@Dolda2000-可能。但即便如此,甲骨文(IMO)通过“修复”URI类,也不可能冒险让一部分客户的情况变得更糟。对甲骨文来说,这将适得其反。(向现有应用程序未损坏的客户付款的好处是零。这只会帮助人们编写新的应用程序,而对Oracle的好处是微乎其微的。)(显然,我的意思是“修复URL类”。URI类没有损坏。)