Java谜题选 - II

题目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的。

时间: 2024-12-02 17:48:52

Java谜题选 - II的相关文章

Java谜题选 - I

题目1:Sets的乐趣程序 public class ShortSet{ public static void main(String args[]) { Set<Short> s = new HashSet<Short>(); for (short i=0; i<100; i++) { s.add(i); s.remove(i-1); } System.out.println(s.size()); } } 选项 (a) 1 (b) 100 (c) Throws except

java中复选框修改时值的回显怎么实现

问题描述 [color=#FF00FF]例如.新增时一个人选择爱好ABCDEFGH中,选择了ABC.但在修改个人信息时,在爱好这一栏选择是ABC复选框要默认选中,这些爱好的绑定值是在一张爱好表上,通过后台数据回显的.这个怎么实现,Whocantellme?[/color] 解决方案 解决方案二:document.getElementsByName("checkbox").checked=true;就可以了解决方案三:如果用的是struts标签直接在页面的value值取的Form里查出的

关于JAVA核心技术卷II中一个例子的问题,大家一起看下[

问题描述 本人在看这个例子,发现一个问题,也就是在写入文件存在问题,导致它读出的时候不是按我们设想的那样,大家看看问题存在哪,现附上源代码: import java.io.*;import java.util.*;public class RandomFileTest {public static void main(String[] args) throws IOException {Empolyee[] staff = new Empolyee[3];staff[0] = new Empol

java的复选框

复选框提供一个制造单一选择开关的方法:它包括一个小框和一个标签.典型的复选框有一个小的"X"(或者它设置的其它类型)或是空的,这依靠项目是否被选择来决定的. 我们会使用构建器正常地创建一个复选框,使用它的标签来充当它的自变量.如果我们在创建复选框后想读出或改变它,我们能够获取和设置它的状态,同样也能获取和设置它的标签.注意,复选框的大写是与其它的控制相矛盾的. 无论何时一个复选框都可以设置和清除一个事件指令,我们可以捕捉同样的方法做一个按钮.在下面的例子里使用一个文字区域枚举所有被选中

java 求助

问题描述 请问我没有任何编程和语言基础学习JAVA的看什么书啊????还有想通过这个找到需要学些什么感谢!!!!!!!!!!!!!!!!!! 解决方案 解决方案二:隨便找本書就行-解决方案三:java核心技术解决方案四:java核心技术适合入门?解决方案五:引用3楼mengye1221的回复: java核心技术适合入门? java核心技术讲的很细致,有些内容很深入,作者将java与c++做了些比较,有c++基础的学起来应该很快,一卷初学者学还行,二卷有些难度.不过我当年度的是javahowtop

java的列表框

列表框与选择框有完全的不同,而不仅仅是当我们在激活选择框时的显示不同,列表框固定在屏幕的指定位置不会改变.另外,一个列表框允许多个选择:如果我们单击在超过一个的项目上,未选择的则表现为高亮度,我们可以选择象我们想要的一样的多.如果我们想察看项目列表,我们可以调用getSelectedItem()来产生一个被选择的项目列表.要想从一个组里删除一个项目,我们必须再一次的单击它.列表框,当然这里有一个问题就是它默认的动作是双击而不是单击.单击从组中增加或删除项目,双击调用action().解决这个问题

java中的常用的输入输出

问题描述 java中的常用的输入输出 初学java,面对众多的输入输出类,还有字节流字符流,有点头晕,想知道经常使用的是哪些,并且能不能给一些例子 解决方案 字节流inputStrea ,outputstream.文件流FileInputStream,FileOutputStream用的比较多.不用担心这个,用的时候,写个间的DEMO测试下,实现需要的结果就OK.然后再改写成你的逻辑. 其他的如字符流.管道流.转换流其实也是常用的.这个实现方法很多,看个人爱好,可以挑选你喜欢的流来实现就行. 解

Android复选框对话框用法实例简析_Android

本文实例分析了Android复选框对话框用法.分享给大家供大家参考,具体如下: /** * 创建筛选复选框对话框 * @param guoguanglist 联赛名 * @param flags 是否选择 * @create_time 2011-10-26 下午3:59:54 */ private void initFilterDialog(String[] iNamelist, final boolean[] iFlags) { Builder builder = new android.ap

Android Studio在线调试Android Framework Java代码

一.准备工作 1.下载最新的Android Studio版本 https://developer.android.com/studio/index.html 当前最新的大版本是2.2 2.下载Android系统源码 这里比较灵活,可以下载公司内部机型的代码,也可以下载原生AOSP的代码 环境配置参考 https://source.android.com/source/initializing.html 源码下载参考 https://source.android.com/source/downlo