快速业务通道

Java谜题选 - II - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20

Java谜题选 - II

时间:2011-01-29 yeeyan 译: 易晓斓

题目2:关于Sets的更多Fun。

对了,这个题目表面上看也是关于Sets的...

程序

import java.net.*; public class UrlSet {   private static final String[] URL_NAMES = {     "http://javapuzzlers.com",     "http://apache2-snort.skybar.dreamhost.com",     "http://www.google.com",     "http://javapuzzlers.com",     "http://findbugs.sourceforge.net",     "http://www.bianceng.cn"    };   public static void main (string[] args)             throws MalformedURLException {       Set<URL> favorites = new HashSet<URL>();       for (String urlName : URL_NAMES)           favorites.add(new URL(urlName));       System.out.println(favorites.size());   } }

答案

(a) 4

(b) 5

(c) 6

(d) None of the above

译者序:

因为最近忙,这个第二集的答案出得太晚了点,希望大家见谅。

另:程序中的一行忘记了括号,Set<URL> favorites = new HashSet<URL>(); 我已经加上了,多谢读者的细心。

谜题一之答案,分析过程,以及经验教训

答案

(d) None of the above

分析过程

如果运行此程序所在的机器与互联网相接,那么答案将是(a) 4。为什么呢?因为URL接口的equals和hashCode方法彻底搞错了。

"http://javapuzzlers.com"和"http://apache2-snort.skybar.dreamhost.com",这两个完全不同的网址,解析成的IP地址竟是完全相同的!(译者注:寄存这两个不同网址的web服务器显然只有一个,用的是以名称为基础的共享IP网络寄存技术,这显然是出题者有意为之,即所谓的Virtual Host)

根据URL类的技术文档,两个URL对象将被认为相等,如果以下条件得到满足:

使用同样的通信协议,引用相当的寄存服务器,使用同样的端口,同样的文件或同样的一部分文件。

两个寄存服务器被认为是相等的,如果两个名称被解析成同一个IP地址,或者两个名称都不可被解析,或者两个名称同为空(null)。

因此,如果运行此程序所在的机器不与互联网相接,得到的结果将是1,应为所有名称都不可被解析。这个题的答案因此是(d) None of the above。不同网络环境下的运行,就有不同的结果,这实在是比较糟糕的。

URL类的equals方法是不支持Virtual Host(虚拟寄存)功能的。93年URL类被加进java平台时,基本是没有虚拟寄存这个技术的。

经验教训

URL类有bug,不要使用URL,应该使用URI类。

URI类的equals方法只会进行字符的比较。程序改成Set<URI> favorites = new HashSet<URI>(); 打印出来的结果就是5了,因为有两个"http://javapuzzlers.com"的缘故。

同时,favorites.add(new URL(urlName))这行程序也要改成favorites.add(URI.create(uriname));

注意这里用的是更好的静态工厂的模式,而不是一般的创建,这也是URI所不同于URL的。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号