﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-zhyiwww -随笔分类-java basic</title><link>http://www.blogjava.net/zhyiwww/category/8510.html</link><description>用平实的笔，记录编程路上的点点滴滴………</description><language>zh-cn</language><lastBuildDate>Thu, 07 Apr 2011 08:51:27 GMT</lastBuildDate><pubDate>Thu, 07 Apr 2011 08:51:27 GMT</pubDate><ttl>60</ttl><item><title>eclipse上显示代码打印边线</title><link>http://www.blogjava.net/zhyiwww/archive/2011/04/07/347805.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Thu, 07 Apr 2011 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2011/04/07/347805.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/347805.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2011/04/07/347805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/347805.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/347805.html</trackback:ping><description><![CDATA[在代码编写过程中，需要主要代码规则，如一行不能太长，在eclipse中可以设置显示打印边线。<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/Eclipse/eclipse_column.png" border="0" />
<img src ="http://www.blogjava.net/zhyiwww/aggbug/347805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2011-04-07 16:30 <a href="http://www.blogjava.net/zhyiwww/archive/2011/04/07/347805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中什么时候使用finalize()方法</title><link>http://www.blogjava.net/zhyiwww/archive/2010/11/26/339105.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Fri, 26 Nov 2010 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2010/11/26/339105.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/339105.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2010/11/26/339105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/339105.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/339105.html</trackback:ping><description><![CDATA[在java中，垃圾回收不需要我们自己执行，而是由系统自动执行。<br />
这一点给了我们发开发人员省了不少心，但是finalize()方法一直是个困惑。<br />
虚拟机在执行垃圾回收之前都会执行对象的finalize(),那么finalize()到底有什么用呢？<br />
其实finalize()主要是给其他调用而创建的空间在对象回收时页同步回收而设置的。<br />
比如，你调用了C语言，使用了mallow()开辟了一段内存空间。在你释放java对象的时候，虚拟机只能释放java对象占用的空间，而不能释放C开辟的内存空间，所你你在释放此对象之前要先回收你在C语言中开辟的空间。<br />
这各时候才用到finalize()方法。<br />
平时的时候不要随便使用finalize()方法。<br />
<br />
以上理解是《java编程思想中的理论》，详细深入的理解请参考此书 。<br />
<br />
<br />
<img src ="http://www.blogjava.net/zhyiwww/aggbug/339105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2010-11-26 10:12 <a href="http://www.blogjava.net/zhyiwww/archive/2010/11/26/339105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在linux上安装JDK</title><link>http://www.blogjava.net/zhyiwww/archive/2009/06/24/283938.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 24 Jun 2009 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2009/06/24/283938.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/283938.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2009/06/24/283938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/283938.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/283938.html</trackback:ping><description><![CDATA[[1]下载JDK<br />jdk-6u14-linux-x64.bin<br /><br />[2]添加执行权限<br />chmod a+x jdk-6u14-linux-x64.bin<br /><br />[3]执行安装<br />./jdk-6u14-linux-x64.bin<br />默认的安装路径是/usr/java/jdk-1.6.0_14<br /><br />[4]最关键的一步，配置环境变量<br />vim /etc/profile<br />添加如下内容：<br />设置PATH<br /><br />PATH=$PATH:/usr/java/jdk-1.6.0_14/bin<br />export PATH<br /><br />设置JAVA_HOME<br />export JAVA_HOME=/usr/java/jdk-1.6.0_14<br /><br />[5]让你的设置生效<br />source /etc/profile<br /><br />[6]检查你的设置效果<br />[XXX java]$ echo $PATH<br />/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/zhangyi/bin:/usr/java/jdk1.6.0_14/bin<br />[XXX java]$ <br /><br />[XXX java]$ echo $JAVA_HOME<br />/usr/java/jdk1.6.0_14<br />[XXX java]$ <br /><br />[XXX java]$ java<br />Usage: java [-options] class [args...]<br />           (to execute a class)<br />   or  java [-options] -jar jarfile [args...]<br />           (to execute a jar file)<br /><br />where options include:<br />    -d32          use a 32-bit data model if available<br /><br />    -d64          use a 64-bit data model if available<br />    -server      to select the "server" VM<br />                  The default VM is server.<br />                  <br />    -cp &lt;class search path of directories and zip/jar files&gt;<br />。。。。。。。。。。。。<br /><br /><br />[XXX java]$ javac<br />用法：javac &lt;选项&gt; &lt;源文件&gt;<br />其中，可能的选项包括：<br />  -g                         生成所有调试信息<br />  -g:none                    不生成任何调试信息<br />  -g:{lines,vars,source}     只生成某些调试信息<br />  -nowarn                    不生成任何警告<br />  -verbose                   输出有关编译器正在执行的操作的消息<br />  -deprecation               输出使用已过时的 API 的源位置<br />  -classpath &lt;路径&gt;            指定查找用户类文件和注释处理程序的位置<br />  -cp &lt;路径&gt;                   指定查找用户类文件和注释处理程序的位置<br />  -sourcepath &lt;路径&gt;           指定查找输入源文件的位置<br />  -bootclasspath &lt;路径&gt;        覆盖引导类文件的位置<br />  -extdirs &lt;目录&gt;              覆盖安装的扩展目录的位置<br />。。。。。。。。。。。。。。。。<br /><br />如果你能看到上面的额内容，那么你的JDK就安装和配置成功了。<br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/283938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2009-06-24 14:53 <a href="http://www.blogjava.net/zhyiwww/archive/2009/06/24/283938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何取得ResultSet的行数</title><link>http://www.blogjava.net/zhyiwww/archive/2009/06/19/283265.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Fri, 19 Jun 2009 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2009/06/19/283265.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/283265.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2009/06/19/283265.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/283265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/283265.html</trackback:ping><description><![CDATA[如果你想的取得一个结果集的行数，怎么办？<br />在ResultSet对象里面，我们找不到取得结果行数的办法。<br />其实我们通常的解决方法无非有一下几种：<br /><br />[1]<br />Connection con=....<br />Statement stmt = con.createStatement();<br />   <br /> String sqlStr = "count(*) as total ";<br /> ResultSet rst = stmt.executeQuery(sqlStr);<br /> <br /> rst.next();<br />int total =  rst.getInt("total");<br /><br />缺点：如果想要遍历结果集，你不得不在执行一次查询，取得结果集。<br /><br />[2]<br /><br />            String accQrySql = "select * from accounts";<br />            Connection con = DBUtils.getConnection();<br />            Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);<br />            <br />                    ResultSet rst = stmt.executeQuery(accQrySql);<br /><br />                       你可以通过下面的方法来取得结果集的记录数目<br />                       rst.last();<br />                       int total = rst.getRow();<br /><br />                       这时，你可以取得记录数目。<br /><br />                       如果<br />while(rst.next()){<br />........<br />}      <br /><br />int total = rst.getRow();<br />你将得到的total是0<br /><br />因为，getRow是在遍历结果集的时候的指针，也是在结果集内移动的指针，也就是说，指向了当前的记录索引号，所以，在进行结果集的遍历前和后都被重置成0。<br />所以，想取得记录的条数，可以把指针移到最后一条记录，然后取得当前记录的编号就是记录的条数。<br />所以，必须用<br />rst.last();<br />之后才能用 rst.getRow()来取得，才能取到值。<br /><br />注意：想要用这种方法来取得结果集的行数，必须用 可滚动结果集      <br />    Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);<br />否则，你就不能执行<br />rst.last()<br />也就不能取得结果集的条数。<br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/283265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2009-06-19 17:25 <a href="http://www.blogjava.net/zhyiwww/archive/2009/06/19/283265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate多对多删除和更新中间表</title><link>http://www.blogjava.net/zhyiwww/archive/2009/02/16/254872.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Mon, 16 Feb 2009 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2009/02/16/254872.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/254872.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2009/02/16/254872.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/254872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/254872.html</trackback:ping><description><![CDATA[
		<br />这几天，在多队多的中间表的操作上遇到了点麻烦，总是不能删除和更新中间表，因为，我使用的是一队多的关联，<br />映射的是中间表，所以，我虽然操作了set,但是总是不能反映到中间表上去。<br /><br />后来使用如下的方法来解决，看如下的例子：<br /><br />（1）三个表<br /><br /><font color="#0000ff" size="2">CREATE TABLE `poi` (<br />  `poi_id` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,<br />  `poi_name` VARCHAR(45) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',<br />  PRIMARY KEY (`poi_id`),<br />  UNIQUE KEY `poi_name` (`poi_name`)<br /><br />)ENGINE=InnoDB<br />AUTO_INCREMENT=15 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'<br />COMMENT='InnoDB free: 3072 kB';</font><br /><br /><font color="#0000ff" size="2">CREATE TABLE `user` (<br />  `user_id` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,<br />  `username` VARCHAR(45) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',<br />  `password` VARCHAR(45) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',<br />  PRIMARY KEY (`user_id`),<br />  UNIQUE KEY `username` (`username`)<br /><br />)ENGINE=InnoDB<br />AUTO_INCREMENT=16 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'<br />COMMENT='InnoDB free: 3072 kB';</font><font color="#0000ff"><br /></font><br />关联表<br /><font color="#ffff00" size="2"><br /><font color="#9acd32">CREATE TABLE `user_poi` (<br />  `user_id` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,<br />  `poi_id` INTEGER(10) UNSIGNED NOT NULL,<br />  KEY `FK_user_pois_poiid` (`poi_id`),<br />  KEY `FK_user_pois_userid` (`user_id`),<br />  CONSTRAINT `FK_user_pois_poiid` FOREIGN KEY (`poi_id`) REFERENCES `poi` (`poi_id`) ON DELETE CASCADE ON UPDATE CASCADE,<br />  CONSTRAINT `FK_user_pois_userid` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE<br /><br />)ENGINE=InnoDB<br />AUTO_INCREMENT=3 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'<br />COMMENT='InnoDB free: 3072 kB; (`poi_id`) REFER `demo/poi`(`poi_id`) ON UPDATE CASCADE; (';</font></font><br /><br />（2）POJO<br /><br /><font color="#ff0000"><br />/**<br /> * @hibernate.class table="user" <br /> */<br />public class User implements java.io.Serializable {<br /><br />    // Fields<br /><br />    private Integer userid;<br />    private String username;<br />    private String password;<br /><br />    /**<br />     * Poi set <br />     */<br />    private Set&lt;Poi&gt; pois = new HashSet();<br />    <br />    <br />    <br />    // Constructors<br /><br />    /**<br />     * @hibernate.set table="user_poi" cascade="all" <br />     * @hibernate.collection-key column="user_id" <br />     * @hibernate.collection-many-to-many column="poi_id" class="org.zy.pro.pd.dao.Poi" <br />     */<br />    public Set getPois() {<br />        return pois;<br />    }<br /><br />    public void setPois(Set pois) {<br />        this.pois = pois;<br />    }<br /><br />    public User() {<br />    }<br /><br />    /** full constructor */<br />    public User(String username, String password) {<br />        this.username = username;<br />        this.password = password;<br />    }<br /><br />    // Property accessors<br /><br /><br />    /**<br />     * @hibernate.id column="user_id" generator-class="increment"<br />     */<br />    public Integer getUserid() {<br />        return this.userid;<br />    }<br /><br />    public void setUserid(Integer userid) {<br />        this.userid = userid;<br />    }<br /><br />    /**<br />     * @hibernate.property column="username"<br />     * @return<br />     */<br />    public String getUsername() {<br />        return this.username;<br />    }<br /><br />    public void setUsername(String username) {<br />        this.username = username;<br />    }<br /><br />    /**<br />     * @hibernate.property column="password"<br />     * @return<br />     */<br />    public String getPassword() {<br />        return this.password;<br />    }<br /><br />    public void setPassword(String password) {<br />        this.password = password;<br />    }<br /><br />}</font><br /><font color="#0000ff" size="2"><br />/**<br /> * @hibernate.class table="poi" <br /> */<br />public class Poi  implements java.io.Serializable {<br /><br /><br />    // Fields    <br /><br />     private Integer poiId;<br />     private String poiName;<br /><br /><br />    // Constructors<br /><br />    /** default constructor */<br />    public Poi() {<br />    }<br /><br />    /** minimal constructor */<br />    public Poi(String poiName) {<br />        this.poiName = poiName;<br />    }<br /><br /><br />    /**<br />     * @hibernate.id column="poi_id" generator-class="increment"<br />     */<br />    public Integer getPoiId() {<br />        return this.poiId;<br />    }<br />    <br />    public void setPoiId(Integer poiId) {<br />        this.poiId = poiId;<br />    }<br /><br />    /**<br />     * @hibernate.property column="poi_name"<br />     * @return<br />     */<br />    public String getPoiName() {<br />        return this.poiName;<br />    }<br />    <br />    public void setPoiName(String poiName) {<br />        this.poiName = poiName;<br />    }<br />}</font><br /><br /><br />（3）hibernate mapping<br /><br />利用xDolect根据bean生成映射<br /><br />Poi.hbm.xml<br /><font color="#008000" size="2"><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br /><br />&lt;!DOCTYPE hibernate-mapping PUBLIC<br />    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" <br />    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br /><br />&lt;hibernate-mapping<br />&gt;<br />    &lt;class<br />        name="org.zy.pro.pd.dao.Poi"<br />        table="poi"<br />    &gt;<br /><br />        &lt;id<br />            name="poiId"<br />            column="poi_id"<br />            type="java.lang.Integer"<br />        &gt;<br />            &lt;generator class="increment"&gt;<br />     <br />            &lt;/generator&gt;<br />        &lt;/id&gt;<br /><br />        &lt;property<br />            name="poiName"<br />            type="java.lang.String"<br />            update="true"<br />            insert="true"<br />            column="poi_name"<br />        /&gt;<br /><br />    &lt;/class&gt;<br /><br />&lt;/hibernate-mapping&gt;</font><br /><br />User.hbm.xml<br /><font color="#0000ff"><br /></font><font color="#808080" size="2"><font color="#0000ff">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br /><br />&lt;!DOCTYPE hibernate-mapping PUBLIC<br />    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" <br />    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br /><br />&lt;hibernate-mapping<br />&gt;<br />    &lt;class<br />        name="org.zy.pro.pd.dao.User"<br />        table="user"<br />    &gt;<br /><br />        &lt;id<br />            name="userid"<br />            column="user_id"<br />            type="java.lang.Integer"<br />        &gt;<br />            &lt;generator class="increment"&gt;<br /><br />            &lt;/generator&gt;<br />        &lt;/id&gt;<br /><br />        &lt;set<br />            name="pois"<br />            table="user_poi"<br />            lazy="false"<br />            cascade="all"<br />            sort="unsorted"<br />        &gt;<br /><br />            &lt;key<br />                column="user_id"<br />            &gt;<br />            &lt;/key&gt;<br /><br />            &lt;many-to-many<br />                class="org.zy.pro.pd.dao.Poi"<br />                column="poi_id"<br />                outer-join="auto"<br />             /&gt;<br /><br />        &lt;/set&gt;<br /><br />        &lt;property<br />            name="username"<br />            type="java.lang.String"<br />            update="true"<br />            insert="true"<br />            column="username"<br />        /&gt;<br /><br />        &lt;property<br />            name="password"<br />            type="java.lang.String"<br />            update="true"<br />            insert="true"<br />            column="password"<br />        /&gt;<br /><br /><br /><br />    &lt;/class&gt;<br /><br />&lt;/hibernate-mapping&gt;</font><br /></font><br />（4）关联添加<br />        UserDAO ud = new UserDAO();<br />        List l = ud.findAll();<br />        assertNotNull(l);<br />        <br />        User u = ud.findById(2);<br />        assertNotNull(u);<br />        <br />        Set pois = u.getPois();<br />        <br />        Poi p = new Poi("Moc"+new java.util.Random().nextInt(1000000));<br />        System.out.print(p.getPoiId());<br />        <br />        <br />        pois.add(p);<br /><br />//关联删除<br />//        u.setPois(null);<br />        <br />        Poi pp = pd.findById(12);<br />        pois.remove(pp);<br />        <br />        <br />        ud.begin();<br />        ud.merge(u);<br />        ud.commit();<br /><br /><br />// 关联更新也可以，只要改变set就可以了。<br /><br /><br /><br />使用总结<br />［1］使用多对多关系<br />    在映射的是时候要使用many-to-many<br />    所以，在user的set集合里面直接存放的是Poi的对象，而不是user_poi表的对象<br />［2］reverse : false<br />    允许反转操作<br />［3］casecade : all<br />    只要允许级联操作才可以实现级联的删除和更新<br /><br />如果使用一对多，就只能更新中间表的普通字段，不能更新主键字段，也不能删除中间表记录<br />所以只能维护中间表的关联,但是不能更新中间表的信息。<br /><br /><br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/254872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2009-02-16 13:14 <a href="http://www.blogjava.net/zhyiwww/archive/2009/02/16/254872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant运行java不能输出log4j日志问题的解决</title><link>http://www.blogjava.net/zhyiwww/archive/2008/12/19/247297.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Fri, 19 Dec 2008 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2008/12/19/247297.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/247297.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2008/12/19/247297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/247297.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/247297.html</trackback:ping><description><![CDATA[我的程序使用log4j做日志输出。<br />
程序在eclipse下运行，日志输出正常。我的build.xml文件如下：<br /><font color="#0000ff" size="2">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;project name="USSD" basedir="." default="compile"&gt;<br />
    &lt;property name="src.dir" value="src"/&gt;<br />
    &lt;property name="build.dir" value="bin"/&gt;<br />
    &lt;property name="lib.dir" value="F:\OPEN-LIB"/&gt;<br />
    &lt;path id="compile.lib"&gt;<br />
        &lt;fileset dir="${lib.dir}"&gt;<br />
            &lt;include name="ojdbc14.jar"/&gt;            <br />
            &lt;include name="log4j-1.2.12.jar"/&gt;<br />
            &lt;include name="commons-dbcp-1.2.2.jar"/&gt;<br />
            &lt;include name="commons-pool-1.3.jar"/&gt;    <br />
        &lt;/fileset&gt;<br />
        &lt;pathelement path="${build.dir}"/&gt;    <br />
    &lt;/path&gt;<br />
    &lt;target name="initdir"&gt;<br />
        <br />
    &lt;/target&gt;<br />
    &lt;target name="compile"&gt;<br />
        &lt;javac srcdir="${src.dir}" destdir="${build.dir}"&gt;<br />
            &lt;classpath refid="compile.lib"/&gt;<br />
        &lt;/javac&gt;<br />
    &lt;/target&gt;<br />
    &lt;target name="run" depends="compile"&gt;<br />
        &lt;java dir="${build.dir}" classname="com.cybersoftchina.ussd.PushMain"&gt;<br />
            &lt;classpath refid="compile.lib"/&gt;<br />
        &lt;/java&gt;<br />
    &lt;/target&gt;<br />
&lt;/project&gt;<br /></font><br />
我的第一次分析，就觉得可能是，ant系统在运行的时候没有找到配置文件log4j.properties.<br />
所以，我就把src\log4j.properties 复制到 工程的根目录，然后再运行，发现还是不行。<br /><br />
所以，我就想到是src下的配置文件，在编译之后应该复制到了和classes目录下相对应的路径。<br />
所以，我就到bin目录下找，果然没有。<br />
因为我在build.xml文件中，compile的时候，并没有把配置文件log4j.properties复制到其对应目录。<br />
所以，复制src\log4j.properties到bin\log4j.properties。<br />
再运行，OK了。<br /><br />
解决方案：<br />
把src目录的所有配置文件（此处是log4j.properties配置文件）复制到classes目录的对应目录。<br /><br />
修改build.xml如下：<br /><font color="#008000" size="2">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;project name="USSD" basedir="." default="compile"&gt;<br />
    &lt;property name="src.dir" value="src"/&gt;<br />
    &lt;property name="build.dir" value="bin"/&gt;<br />
    &lt;property name="lib.dir" value="F:\OPEN-LIB"/&gt;<br />
    &lt;path id="compile.lib"&gt;<br />
        &lt;fileset dir="${lib.dir}"&gt;<br />
            &lt;include name="ojdbc14.jar"/&gt;            <br />
            &lt;include name="log4j-1.2.12.jar"/&gt;<br />
            &lt;include name="commons-dbcp-1.2.2.jar"/&gt;<br />
            &lt;include name="commons-pool-1.3.jar"/&gt;    <br />
        &lt;/fileset&gt;<br />
        &lt;pathelement path="${build.dir}"/&gt;    <br />
    &lt;/path&gt;<br />
    &lt;target name="initdir"&gt;<br />
        <br />
    &lt;/target&gt;<br />
    &lt;target name="compile"&gt;<br />
        &lt;javac srcdir="${src.dir}" destdir="${build.dir}"&gt;<br />
            &lt;classpath refid="compile.lib"/&gt;<br />
        &lt;/javac&gt;<br />
    &lt;/target&gt;<br />
    &lt;target name="run" depends="compile"&gt;<br />
        &lt;java dir="${build.dir}" classname="com.cybersoftchina.ussd.PushMain"&gt;<br />
            &lt;classpath refid="compile.lib"/&gt;<br />
        &lt;/java&gt;<br />
    &lt;/target&gt;<br />
&lt;/project&gt;<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;project name="USSD" basedir="." default="compile"&gt;<br />
    &lt;property name="src.dir" value="src"/&gt;<br />
    &lt;property name="build.dir" value="bin"/&gt;<br />
    &lt;property name="lib.dir" value="F:\OPEN-LIB"/&gt;<br />
    &lt;path id="compile.lib"&gt;<br />
        &lt;fileset dir="${lib.dir}"&gt;<br />
            &lt;include name="ojdbc14.jar"/&gt;            <br />
            &lt;include name="log4j-1.2.12.jar"/&gt;<br />
            &lt;include name="commons-dbcp-1.2.2.jar"/&gt;<br />
            &lt;include name="commons-pool-1.3.jar"/&gt;    <br />
        &lt;/fileset&gt;<br />
        &lt;pathelement path="${build.dir}"/&gt;    <br />
    &lt;/path&gt;<br />
    &lt;target name="initdir"&gt;<br />
        <br />
    &lt;/target&gt;<br />
    &lt;target name="compile"&gt;<br />
        &lt;javac srcdir="${src.dir}" destdir="${build.dir}"&gt;<br />
            &lt;classpath refid="compile.lib"/&gt;<br />
        &lt;/javac&gt;<br /><b><font color="#000080" size="4">        &lt;copy todir="${build.dir}"&gt;<br />
            &lt;fileset dir="${src.dir}"&gt;<br />
                &lt;include name="**/*.properties"/&gt;    <br />
                &lt;include name="**/*.xml"/&gt;<br />
            &lt;/fileset&gt;<br />
        &lt;/copy&gt;</font></b><br />
    &lt;/target&gt;<br />
    &lt;target name="run" depends="compile"&gt;<br />
        &lt;java dir="${build.dir}" classname="com.cybersoftchina.ussd.PushMain"&gt;<br />
            &lt;classpath refid="compile.lib"/&gt;<br />
        &lt;/java&gt;<br />
    &lt;/target&gt;<br />
&lt;/project&gt;<br /><font color="#000000"><br />
上面的深蓝色的部分是新添加的部分。这样，在编译的时候就把所有的配置文件也一同复制到了class文件夹下面了。<br /><br />
再ant run ,就在文件中有日志了。<br /><br /></font><br /><br /><br /><br /><br /></font><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/247297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2008-12-19 11:41 <a href="http://www.blogjava.net/zhyiwww/archive/2008/12/19/247297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我自己写的一个Ant通用模板build.xml</title><link>http://www.blogjava.net/zhyiwww/archive/2008/10/28/237200.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 28 Oct 2008 12:12:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2008/10/28/237200.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/237200.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2008/10/28/237200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/237200.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/237200.html</trackback:ping><description><![CDATA[这个模板应用于Web系统<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;project name="Push_Demo" basedir="." default=""&gt;<br /> <br /> &lt;!-- project properties --&gt;<br />    &lt;property name="pro.name" value="push" /&gt;<br />    &lt;property name="pro.dir" value="." /&gt;<br /><br /> &lt;!-- tomcat properties --&gt;<br />    &lt;property name="tomcat.home" value="/green/apache-tomcat-6.0.14" /&gt;<br />    &lt;property name="tomcat.lib" value="${tomcat.home}/lib" /&gt;<br /> <br /><br /> &lt;!-- dirctionary properties --&gt;<br />    &lt;property name="src.dir" value="src" /&gt;<br />    &lt;property name="web.dir" value="WebRoot" /&gt;<br />    &lt;property name="lib.dir" value="${web.dir}\WEB-INF\lib" /&gt;<br />    &lt;property name="classes.dir" value="${web.dir}\WEB-INF\classes" /&gt;<br />    &lt;property name="deploy.dir" value="${tomcat.home}\webapps\${pro.name}" /&gt;<br /> <br /> &lt;!-- lib properties  --&gt;<br />    &lt;path id="compile.lib"&gt;<br />        &lt;fileset dir="${lib.dir}"&gt;<br />            &lt;include name="*.jar" /&gt;<br />        &lt;/fileset&gt;<br />        &lt;fileset dir="${tomcat.lib}"&gt;<br />            &lt;include name="*.jar" /&gt;<br />        &lt;/fileset&gt;<br />    &lt;/path&gt;<br /> <br /> &lt;!-- --&gt;<br />    &lt;target name="compile.mkdir"&gt;<br />        &lt;mkdir dir="${classes.dir}" /&gt;<br />    &lt;/target&gt;<br /> <br /> &lt;!-- --&gt;<br />    &lt;target name="compile.rmdir"&gt;<br />        &lt;delete dir="${classes.dir}" /&gt;<br />    &lt;/target&gt;<br /> &lt;!-- initialize deploy directory --&gt;<br />    &lt;target name="deploy.init"&gt;<br />        &lt;delete dir="${deploy.dir}" /&gt;<br />        &lt;mkdir dir="${deploy.dir}" /&gt;<br />    &lt;/target&gt;<br /> <br /> &lt;!-- compile java source files --&gt;<br />    &lt;target name="compile"&gt;<br />        &lt;echo&gt;compiling the java code&lt;/echo&gt;<br />        &lt;javac srcdir="${src.dir}" destdir="${classes.dir}" encoding="UTF-8"<br />            debug="on"&gt;<br />            &lt;classpath refid="compile.lib" /&gt;<br />        &lt;/javac&gt;<br />    &lt;/target&gt;<br />    &lt;target name="build.copy" depends="compile"&gt;<br />        &lt;copy todir="${classes.dir}"&gt;<br />            &lt;fileset dir="${src.dir}"&gt;<br />                &lt;include name="**/*.properties" /&gt;<br />                &lt;include name="**/*.xml" /&gt;<br />            &lt;/fileset&gt;<br />        &lt;/copy&gt;<br />    &lt;/target&gt;<br />    &lt;target name="deploy.copy"&gt;<br />        &lt;copy todir="${deploy.dir}"&gt;<br />            &lt;fileset dir="${web.dir}"&gt;<br />                &lt;include name="**/*.*"/&gt;<br />            &lt;/fileset&gt;<br />        &lt;/copy&gt;<br />    &lt;/target&gt;<br />    <br />    &lt;target name="build" depends="compile,build.copy" /&gt;<br />    &lt;target name="rebuild" depends="compile.rmdir,compile.mkdir,build" /&gt;<br />    <br />    &lt;target name="deploy" depends="build,deploy.copy" /&gt;<br />    &lt;target name="redeploy"    depends="deploy.init,deploy" /&gt;<br />    <br />&lt;/project&gt;<img src ="http://www.blogjava.net/zhyiwww/aggbug/237200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2008-10-28 20:12 <a href="http://www.blogjava.net/zhyiwww/archive/2008/10/28/237200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql+Hibernate+JSP中文乱码问题的解决</title><link>http://www.blogjava.net/zhyiwww/archive/2008/09/09/227986.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 09 Sep 2008 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2008/09/09/227986.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/227986.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2008/09/09/227986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/227986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/227986.html</trackback:ping><description><![CDATA[应该在以下几个地方检查：<br /><br />1：检查mysql安装目录下的配置文件my.ini,<br /><br />[mysql]<br />默认的default-character-set=latin1<br />改为default-character-set=utf8（不是utf-8）<br /><br />(注意，如果需要导数据，请先修改完编码，再进行数据导入，同时，注意你的源数据的格式，需要是utf8的编码）<br /><br />2：检查你的连接：<br />jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;amp;characterEncoding<b>=<font color="#008000" size="4">utf8</font></b>（不是utf-8）<br />连接数据库的编码也要设置为utf8<br /><br />3: 检查你的页面<br />&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;<br />设置文件的编码<br /><br />&lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"&gt;<br />设置内容编码<br /><br />如果这几个地方都统一了，应该就没有什么问题了。<br /><br />中文检索的实现：<br />在保证上面编码问题正确的情况下进行。<br /><br />首先，如果jsp页面到action,需要进行编码的转换<br />因为，jsp的页面form提交到action时，默认的是iso-8859-1的编码，需要转换成utf-8编码<br />代码如下：<br />String keyStr = request.getParameter("key");<br />        <br />        String pageStr = request.getParameter("page");<br />        String pageSizeStr = request.getParameter("pageSize");<br />        <br />        <br />        String key="";<br />        try {<br />            key = (keyStr==null?"":new String(keyStr.getBytes("iso-8859-1"),"utf-8"));<br />        } catch (UnsupportedEncodingException e2) {<br />            // TODO Auto-generated catch block<br />            e2.printStackTrace();<br />        }<br />        <br />这样，能保证，在jsp到action的编码不会出现乱码。<br />然后，在dao端，通过HQL进行中文模糊匹配检索，代码如下：<br />    public List findLikeKey(String key) {<br />        log.debug("finding all Pois instances");<br />        try {<br />            //'%"+key+"%'<br />            String queryString = "from Pois as poi where poi.poiname like <font color="#008000"><b><font size="5">'%"+key+"%'</font></b></font>";<br />            Query queryObject = getSession().createQuery(queryString);<br />            <br />//            queryObject.setString(0, "'%"+key+"'");<br />            <br />            log.info("query String is : "+queryObject.getQueryString());<br />            <br />            return queryObject.list();<br />        } catch (RuntimeException re) {<br />            log.error("find all failed", re);<br />            throw re;<br />        }<br />    }<br /><br />这样就可以实现检索的模糊匹配。<br />这样就OK了。<br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/227986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2008-09-09 16:40 <a href="http://www.blogjava.net/zhyiwww/archive/2008/09/09/227986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String和StringBuffer的区别</title><link>http://www.blogjava.net/zhyiwww/archive/2008/04/25/195993.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Fri, 25 Apr 2008 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2008/04/25/195993.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/195993.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2008/04/25/195993.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/195993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/195993.html</trackback:ping><description><![CDATA[看JAVA源代码，发现了string和stringBuffer操作的区别，总结如下：<br />从对象实现上来说，都是通过char[]来实现的。<br />如果new String(),那么数组的长度为0，如果new String("String")，那么char[]数组的长度就是你创建的字符串的长度。<br />这个char[]在字符串创建以后是不会改变的。<br />如果你只对这个串本身进行查找等对字符串无改变的操作的话，对于此数组本身是没有影响的。但是如果，你要执行的是一个对此字符串本身有改变的操作的话，那么，是不可以的。<br />但是Strin对象为我们提供了此类操作的方法，比如concat()方法，源代码如下：<br />    public String concat(String s) {<br />        int i = s.length();<br />        if (i == 0) {<br />            return this;<br />        } else {<br />            char ac[] = new char[count + i];<br />            getChars(0, count, ac, 0);<br />            s.getChars(0, i, ac, count);<br />            return new String(0, count + i, ac);<br />        }<br />    }<br />由此，我们可以知道，其实，此方法给我们返回的已经不是当前的字符串了，而是又创建了一个新的字符串，然后返回。<br />其他的方法也类似。<br /><br />StringBuffer的实现，也是通过char[]来实现的。但是，默认的情况下，其自己创建了一个缓存数组，长度是16，这一点，我们可以通过StringBuffer的构造器来知道：<br />    public StringBuffer() {<br />    super(16);<br />    }<br />这个方法初始化了，char[]数组的长度是16。<br />其父类构造器如下：<br />    AbstractStringBuilder(int capacity) {<br />        value = new char[capacity];<br />    }<br />也就是说，默认的数组长度是16。<br />很多的时候，容量16对于我们需要的串来说，可能远远不够。怎么办呢？<br />在进行串的append的时候，StringBuffer会检测剩余容量，并会重新扩充至当前容量的2倍。<br />    public AbstractStringBuilder append(String str) {<br />    if (str == null) str = "null";<br />        int len = str.length();<br />    if (len == 0) return this;<br />    int newCount = count + len;<br />    if (newCount &gt; value.length)<br />        expandCapacity(newCount);<br />    str.getChars(0, len, value, count);<br />    count = newCount;<br />    return this;<br />    }<br /><br />而扩容的同时，会创建一个新的数组，并将原来的数组内容复制到新的数组里面。<br />由此可见，如果容量不足的话，那么每一次扩容，都会耗掉大量的资源，尽管，你可能扩充的容量也很小。如果，数组的长度很大，耗掉的资源就会更多。<br />所以，我们在使用stringbuffer的时候，要一次在创建对象的时候给与足够多的空间，这样会提高性能。<br />有利必有弊，这个性能是以空间为代价。但是相对于性能的丧失来说，应该还是值得的。<br /><br />如果不需要扩容的话，那么所有的操作都是基于同一个数组，那么像对于string的操作来说，不需要每一次都创建对象了，省去了创建对象的时间，性能是要好很多的，同时，String的串操作，会用去很多的空间，对于虚拟机来说，也增加了很大的压力。<br /><br /><br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/195993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2008-04-25 15:37 <a href="http://www.blogjava.net/zhyiwww/archive/2008/04/25/195993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对hashCode的一点简单认识</title><link>http://www.blogjava.net/zhyiwww/archive/2008/04/22/194845.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 22 Apr 2008 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2008/04/22/194845.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/194845.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2008/04/22/194845.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/194845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/194845.html</trackback:ping><description><![CDATA[hashcode,一个不太好理解，也常被我们忽视的一个概念。然而，hashcode还有对我们有用的东西。<br />java给我们提供了两种判断对象对等的方式。如果我们判断两个对象是否相等，那么直接用“==”运算就可以了。然而，判断两个对象对等，就没有那么简单了。<br />在java中，我们常常通过equals（）方法来判断两个对象的对等。其实，我么还可以通过hashCode()来判断两个对象的对等。<br /><br />看下面的例子：<br /><br />import java.util.List;<br /><br />public class MyBag{<br />    float money;<br />    List books;    <br />}<br />我们如何判断两个MyBag对象是对等的呢？也就是说，如果有两个MyBag的对象bag1和bag2，通过什么的办法能说明这个两个对象是相同的呢？<br />先声名两个概念：<br />两个对象相等，指的是，两个引用指向了同一个对象，也就是说，指向了内存中的同一个地址。<br />两个对象相同（对等），指得是两个对象的任何属性都相等，但是，不是一个对象。<br /><br />所以，对于上面的MyBag的对象对等，那么，两个对象的money要一样，同时，books要对等。那么如何去判断呢？我们通常会自己去实现equals（）方法去判断，方法如下：<br /><br />    public boolean equals(Object obj) {<br />        if (this == obj)<br />            return true;<br />        if (obj == null)<br />            return false;<br />        if (getClass() != obj.getClass())<br />            return false;<br />        final MyBag other = (MyBag) obj;<br />        if (books == null) {<br />            if (other.books != null)<br />                return false;<br />        } else if (!books.equals(other.books))<br />            return false;<br />        if (Float.floatToIntBits(money) != Float.floatToIntBits(other.money))<br />            return false;<br />        return true;<br />    }<br /><br />我们也可以通过实现hashCode()来实现：<br />    public int hashCode() {<br />        final int prime = 31;<br />        int result = 1;<br />        result = prime * result + ((books == null) ? 0 : books.hashCode());<br />        result = prime * result + Float.floatToIntBits(money);<br />        return result;<br />    }<br /><br />那么我们判断两个对象对等时，就可以这样来实现了：<br />if(bag1.equals(bag2)){<br />    // 对等<br />}<br /><br />或者<br />if(bag1.haseCode(）==bag2.hashCode()){<br />    // 对等<br />}<br /><br />为什么这种方式也能判断两个对象对等呢?<br />因为，任何一个对象的hashCode是唯一的，并且和气对象属性按照一定的规则相关的。<br /><br />比如，一个Integer的hashCode值就是其整数值，因为Integer的haseCode()是这样实现的：<br />    public int hashCode() {<br />        return value;<br />    }<br />    public boolean equals(Object obj) {<br />        if (obj instanceof Integer)<br />            return value == ((Integer) obj).intValue();<br />        else<br />            return false;<br />    }<br /><br />由此可以看到，也对象的HashCode是和其属性有一定的联系，规则和属性的值有一定的联系，这个规则决定了有相同的hashcode，就有两个对象的属性对等。<br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/194845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2008-04-22 18:03 <a href="http://www.blogjava.net/zhyiwww/archive/2008/04/22/194845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从类的改造小谈内部类</title><link>http://www.blogjava.net/zhyiwww/archive/2007/10/25/155806.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Thu, 25 Oct 2007 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/10/25/155806.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/155806.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/10/25/155806.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/155806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/155806.html</trackback:ping><description><![CDATA[今天在看<br /><a href="/raylong1982/archive/2007/10/24/155439.html">http://www.blogjava.net/raylong1982/archive/2007/10/24/155439.html</a><br />中关于内部类的介绍和分析的时候，就想到了我刚写的那个<a href="/zhyiwww/archive/2007/10/24/155590.html">回答面试问题的简单代码</a>，是不是也可以改用内部类来实现呢？<br />所以就做了一个简单的改进，代码如下：<br />package org.zy.demo;<br /><br />import java.io.BufferedReader;<br />import java.io.IOException;<br />import java.io.InputStreamReader;<br />import java.net.MalformedURLException;<br />import java.net.URL;<br />import java.util.Timer;<br />import java.util.TimerTask;<br />import java.util.regex.Matcher;<br />import java.util.regex.Pattern;<br /><br />public class ParseUrlUsingInnerClass {<br />    <br />    <br />    <br /><font color="#0000ff"><b>    public static void main(String[] args){<br />        Timer t = new Timer();<br />        t.schedule(new ParseTask(),0,5*60*60);            <br />    }<br />    <br />    <br />    class ParseTask extends TimerTask{</b></font><br />        public void run(){<br />            System.out.println("runing");<br />            try {<br />                // create url object<br />                URL url = new URL("http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC");<br />                // get the input stream reader from the url<br />                InputStreamReader isr = new InputStreamReader(url.openStream());<br />                // buffered the reader<br />                BufferedReader br = new BufferedReader(isr);<br />                <br />                // store the temp string<br />                StringBuffer sb = new StringBuffer(10000);<br />                // temporary variable for each read<br />                String tmp="";<br />                <br />                // read the content from reader<br />                while((tmp=br.readLine())!=null){<br />                    sb.append(tmp);<br />                }<br />                System.out.println(sb.toString());<br />                // match from the orginal string using  reglex express<br />                Pattern p = Pattern.compile("&lt;&lt;.*异人.*&gt;&gt;");<br />                Matcher m = p.matcher(sb.toString());                <br />                <br />                <br />            } catch (MalformedURLException e) {<br />                // TODO Auto-generated catch block<br />                e.printStackTrace();<br />            } catch (IOException e) {<br />                // TODO Auto-generated catch block<br />                e.printStackTrace();<br />            }<br />        }<br />    }<br />}<br /><br />看蓝色代码部分，很显然，我直接作了一个最简单的修改，就是直接把外面定义的拿给类拿到了public类的里面，其他的代码都没有改变。<br />但是代码却出现了问题。<br /><font color="#0000ff"><b>    public static void main(String[] args){<br />
        Timer t = new Timer();<br />
        t.schedule(new ParseTask(),0,5*60*60);            <br /></b>
    }<br /><font color="#000000">上面的这段代码就出现了问题，为什么呢?<br />我们知道，一个static的方法，只能使用static属性和方法和static类，那么</font></font><font color="#0000ff"><font color="#000000">new ParseTask()能行吗？</font><b><br /></b><font color="#000000">问题就出在这，此处不能创建一个非静态类的对象。<br />所以，我们就只能在类的定义前面添加一个static，让其成为一个静态类就可以了。<br /></font></font><font color="#0000ff"><font color="#000000">修改后的代码如下：</font><b><br />static class ParseTask extends TimerTask{<br /></b><font color="#000000">一般情况下，我们不创建static类，这个地方是因为我们在static main 方法里面直接使用，所以就只能创建静态类。<br />我们的代码还可以改变：<br />可以把调用部分封装成一个方法，然后在此方法里面调用内部类，就可以不用定义静态类了，代码如下：</font><b><br /></b></font><font color="#000000">package org.zy.demo;<br /><br />import java.io.BufferedReader;<br />import java.io.IOException;<br />import java.io.InputStreamReader;<br />import java.net.MalformedURLException;<br />import java.net.URL;<br />import java.util.Timer;<br />import java.util.TimerTask;<br />import java.util.regex.Matcher;<br />import java.util.regex.Pattern;<br /><br />public class ParseUrlUsingInnerClass1 {<br />    <br />  <b><font color="#008000">  public void parseUrl(){<br />        Timer t = new Timer();<br />        t.schedule(new ParseTask(),0,5*60*60);        <br />    }<br />    <br />    public static void main(String[] args){<br />        ParseUrlUsingInnerClass1 puic = new ParseUrlUsingInnerClass1();<br />        puic.parseUrl();<br />    }<br />    <br />    <br />    class ParseTask extends TimerTask{</font></b><br />        public void run(){<br />            System.out.println("runing");<br />            try {<br />                // create url object<br />                URL url = new URL("http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC");<br />                // get the input stream reader from the url<br />                InputStreamReader isr = new InputStreamReader(url.openStream());<br />                // buffered the reader<br />                BufferedReader br = new BufferedReader(isr);<br />                <br />                // store the temp string<br />                StringBuffer sb = new StringBuffer(10000);<br />                // temporary variable for each read<br />                String tmp="";<br />                <br />                // read the content from reader<br />                while((tmp=br.readLine())!=null){<br />                    sb.append(tmp);<br />                }<br />                System.out.println(sb.toString());<br />                // match from the orginal string using  reglex express<br />                Pattern p = Pattern.compile("&lt;&lt;.*异人.*&gt;&gt;");<br />                Matcher m = p.matcher(sb.toString());                <br />                <br />                <br />            } catch (MalformedURLException e) {<br />                // TODO Auto-generated catch block<br />                e.printStackTrace();<br />            } catch (IOException e) {<br />                // TODO Auto-generated catch block<br />                e.printStackTrace();<br />            }<br />        }<br />    }<br />}<br />看绿色代码部分就可以知道了。<br />对于方法的改进，我们可以给parseUrl加上一个参数URL,那么，其他的相对应的部分也要做一些简单的修改，代码如下：<br />package org.zy.demo;<br /><br />import java.io.BufferedReader;<br />import java.io.IOException;<br />import java.io.InputStreamReader;<br />import java.net.MalformedURLException;<br />import java.net.URL;<br />import java.util.Timer;<br />import java.util.TimerTask;<br />import java.util.regex.Matcher;<br />import java.util.regex.Pattern;<br /><br />public class ParseUrlUsingInnerClass2 {<br />    <br />   <font color="#ee82ee"> public void parseUrl(URL url){<br />        Timer t = new Timer();<br />        t.schedule(new ParseTask(url),0,5*60*60);        <br />    }</font><br />    <br />    public static void main(String[] args){<br />        ParseUrlUsingInnerClass2 puic = new ParseUrlUsingInnerClass2();<br />        <br /><font color="#ffa500">        try {<br />           </font></font><font color="#ffa500">URL url</font><font color="#000000"><font color="#ffa500"> = new URL("http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC");<br />            puic.parseUrl(url);</font><br />        } catch (MalformedURLException e) {<br />            // TODO Auto-generated catch block<br />            e.printStackTrace();<br />        }<br />    <br />    }<br />    <br />    <br />    class ParseTask extends TimerTask{<br /><font color="#0000ff">        URL url;<br />        public ParseTask(URL url){<br />            this.url = url;<br />        }</font><br />        public void run(){<br />            System.out.println("runing");<br />            try {<br />                // create url object<br />                //URL url = new URL("http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC");<br />                // get the input stream reader from the url<br />                InputStreamReader isr = new InputStreamReader(this.url.openStream());<br />                // buffered the reader<br />                BufferedReader br = new BufferedReader(isr);<br />                <br />                // store the temp string<br />                StringBuffer sb = new StringBuffer(10000);<br />                // temporary variable for each read<br />                String tmp="";<br />                <br />                // read the content from reader<br />                while((tmp=br.readLine())!=null){<br />                    sb.append(tmp);<br />                }<br />                System.out.println(sb.toString());<br />                // match from the orginal string using  reglex express<br />                Pattern p = Pattern.compile("&lt;&lt;.*异人.*&gt;&gt;");<br />                Matcher m = p.matcher(sb.toString());                <br />                <br />                <br />            } catch (MalformedURLException e) {<br />                // TODO Auto-generated catch block<br />                e.printStackTrace();<br />            } catch (IOException e) {<br />                // TODO Auto-generated catch block<br />                e.printStackTrace();<br />            }<br />        }<br />    }<br />}<br /><br />上面在用到此URL的地方和参数传递的地方都要做相应的修改，比如说</font><font color="#000000">ParseTask类的构造器，都要做些修改。<br />上面的类的定义和方法的定义，已经可以实现减少部分耦合了。其实在run方法里面，如果从代码重用的角度来看的话，那么我们还可以进行代码改进和重构。<br />就上面的一个demo,我们也可以简单的看到在类的设计中，我们还是有很多的问题要考虑，还是有很多的细节可以注意，来提高我们的代码质量。<br />以上仅是一点简单的理解。<br /><br /></font><font color="#000000"><br /><br /></font><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/155806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-10-25 11:19 <a href="http://www.blogjava.net/zhyiwww/archive/2007/10/25/155806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>就一个面试题做的一个小小Demo</title><link>http://www.blogjava.net/zhyiwww/archive/2007/10/24/155590.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 24 Oct 2007 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/10/24/155590.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/155590.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/10/24/155590.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/155590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/155590.html</trackback:ping><description><![CDATA[题目如下:引自http://www.blogjava.net/zhoudq/archive/2007/10/23/155363.html<br /><br /><font style="font-size: medium; line-height: 1.3em;" color="#008000" size="2">每5分钟遍历一下页面(</font><font color="#008000" size="2"><a href="http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC" target="_blank"><font style="font-size: medium; line-height: 1.3em;">http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC</font><wbr></wbr></a></font><font style="font-size: medium; line-height: 1.3em;" color="#008000" size="2">), </font><font color="#008000" size="2"><br /></font><div class="post"><font style="font-size: medium; line-height: 1.3em;" color="#008000" size="2">请统计页面中"《"和"》"之间有多少个"异人"这两个字,将这数值弹出一个alert并且发信给指定的邮件地址 </font><wbr><font color="#008000" size="2"><br /></font><font style="font-size: medium; line-height: 1.3em;" color="#008000" size="2">获取页面内所有地方的以"&lt;&lt; &gt;&gt;"为标示的这个符号代表书名号,获取之中的内容 </font><wbr><font color="#008000" size="2"><br /></font><font style="font-size: medium; line-height: 1.3em;" color="#008000" size="2">&lt;&lt;使用正则表达式&gt;&gt;</font><wbr><font color="#008000" size="2"><br /></font><font style="font-size: medium; line-height: 1.3em;" color="#008000" size="2">功能点: </font><wbr><font color="#008000" size="2"><br /></font><font style="font-size: medium; line-height: 1.3em;" color="#008000" size="2">1)URL抓取页面 </font><wbr><font color="#008000" size="2"><br /></font><font style="font-size: medium; line-height: 1.3em;" color="#008000" size="2">2)正则表达式匹配 </font><wbr><font color="#008000" size="2"><br /></font><font style="font-size: medium; line-height: 1.3em;" color="#008000" size="2">3)邮件系统调用 </font><wbr><font color="#008000" size="2"><br /></font><font style="font-size: medium; line-height: 1.3em;"><font color="#008000" size="2">请注意设计思路和代码规范 </font><font size="2"><br /></font><br />就这个问题我写了一个Demo,代码如下：<br />package org.zy.demo;<br /><br />import java.io.BufferedInputStream;<br />import java.io.BufferedReader;<br />import java.io.IOException;<br />import java.io.InputStreamReader;<br />import java.io.Reader;<br />import java.net.MalformedURLException;<br />import java.net.URL;<br />import java.util.Date;<br />import java.util.Timer;<br />import java.util.TimerTask;<br />import java.util.regex.Matcher;<br />import java.util.regex.Pattern;<br /><br />/**<br /> * <br /> * @author zhangyi<br /> * zhyiwww@163.com<br /> * <br /> * 从url里面读取内容，然后分析，用正则表达式匹配，返回结果<br /> */<br /><br />/*<br />     每5分钟遍历一下页面(http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC), <br />    请统计页面中"《"和"》"之间有多少个"异人"这两个字,将这数值弹出一个alert并且发信给指定的邮件地址 <br />    获取页面内所有地方的以"&lt;&lt; &gt;&gt;"为标示的这个符号代表书名号,获取之中的内容 <br />    &lt;&lt;使用正则表达式&gt;&gt;<br />    功能点: <br />    1)URL抓取页面 <br />    2)正则表达式匹配 <br />    3)邮件系统调用 <br /> */<br />public class ParseUrlContent {<br />    <br />    <br />    public static void main(String[] args){<br />        Timer t = new Timer();<br />        t.schedule(new ParseTask(),0,5*60*60);        <br />    }<br />    <br />    <br />}<br /><br />class ParseTask extends TimerTask{<br />    public void run(){<br />        System.out.println("runing");<br />        try {<br />            // create url object<br />            URL url = new URL("http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC");<br />            // get the input stream reader from the url<br />            InputStreamReader isr = new InputStreamReader(url.openStream());<br />            // buffered the reader<br />            BufferedReader br = new BufferedReader(isr);<br />            <br />            // store the temp string<br />            StringBuffer sb = new StringBuffer(10000);<br />            // temporary variable for each read<br />            String tmp="";<br />            <br />            // read the content from reader<br />            while((tmp=br.readLine())!=null){<br />                sb.append(tmp);<br />            }<br />            System.out.println(sb.toString());<br />            // match from the orginal string using  reglex express<br />            Pattern p = Pattern.compile("&lt;&lt;.*异人.*&gt;&gt;");<br />            Matcher m = p.matcher(sb.toString());          <br />            // 此处可以做进一步的处理<br />            <br />            <br />            <br />        } catch (MalformedURLException e) {<br />            // TODO Auto-generated catch block<br />            e.printStackTrace();<br />        } catch (IOException e) {<br />            // TODO Auto-generated catch block<br />            e.printStackTrace();<br />        }<br />    }<br />}<br />实现思路：<br />1 从url读取内容流<br />2 解析流，用正则表达式来匹配取出想要查找的内容<br /><br />我没有详细的实现匹配的部分，其实，如果是要迭代的去遍历内容里面所有的url,然后再解析也是可以实现的，就把上面的代码封装成一个方法parseUrl(URL url),然后，解析，迭代，就可以了。<br />这就是我的实现思路。<br /></font></wbr></wbr></wbr></wbr></wbr></wbr></wbr></div><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/155590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-10-24 14:34 <a href="http://www.blogjava.net/zhyiwww/archive/2007/10/24/155590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>回复两个朋友的图片裁剪问题</title><link>http://www.blogjava.net/zhyiwww/archive/2007/10/18/153967.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Thu, 18 Oct 2007 09:54:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/10/18/153967.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/153967.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/10/18/153967.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/153967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/153967.html</trackback:ping><description><![CDATA[
		<font color="#0000ff" size="2">(zhyiwww@163.com  转载请注明出处 作者：zhyiwww )</font>
		<br />最近，有两个朋友在问我关于图片裁剪的问题，不过以前的代码找不到了，所以，就把完整的例子又整理了一下。可以实现在一个完整的图片上，根据需要，定位想要截取的图片的左上角的坐标和图片的大小，就可以取得该图片。<br />完整的实现代码如下：<br />package org.zy.app;<br /><br />import java.io.File;<br />import java.io.InputStream;<br />import java.io.IOException;<br />import java.util.Iterator;<br />import java.awt.Rectangle;<br />import java.awt.image.BufferedImage;<br />import javax.imageio.ImageReader;<br />import javax.imageio.ImageReadParam;<br />import javax.imageio.ImageIO;<br />import javax.imageio.stream.ImageInputStream;<br /><br />/**<br /> * @author zhangyi<br /> * date : 2007-10-18<br /> */<br />public class SplitImage {<br /><br />    /**<br />     * ��ȡͼ���ļ� �� ImageReader<br />     * <br />     * @param imgPath<br />     * @throws IOException<br />     */<br /><br />    public void readImage() throws IOException {<br />        // get JPEG image reader iterator<br />        Iterator readers = ImageIO.getImageReadersByFormatName("jpg");<br />        System.out.println(readers);<br />        <br />        // get image reader<br />        ImageReader reader = (ImageReader) readers.next();<br />        System.out.println(reader);<br /><br />        // get original image input stream<br />        InputStream source = this.getClass().getResourceAsStream("img01.jpg");<br />        System.out.println("image input source is : " + source);<br />        <br />        // get ImageInputStream of the image to split<br />        ImageInputStream iis = ImageIO.createImageInputStream(source);<br />        reader.setInput(iis, true);<br />        <br />        // the image param<br />        ImageReadParam param = reader.getDefaultReadParam();<br />        int imageIndex = 0;<br />//        <br />//        int half_width = reader.getWidth(imageIndex) / 2;<br />//        int half_height = reader.getHeight(imageIndex) / 2;<br /><br />        // the coordinate and the size on the image that you want to split on<br />        Rectangle rect = new Rectangle(300, 490, 200, 100);<br />        param.setSourceRegion(rect);<br />        <br />        BufferedImage bi = reader.read(0, param);<br />        <br />        // write the split picture<br />        ImageIO.write(bi, "jpg", this.initDestFile());<br />    }<br /><br />    public File initDestFile() throws IOException {<br />        File f = new File("c:\\img02.jpg");<br /><br />        if (f.exists()) {<br />            f.delete();<br />        }<br />        f.createNewFile();<br />        return f;<br />    }<br /><br />    public static void main(String[] args) {<br />        SplitImage si = new SplitImage();<br />        try {<br />            si.readImage();<br />        } catch (IOException e) {<br />            System.out.println("exception");<br />        }<br />    }<br />}<br /><br />代码下载<a title="SplitImage" href="/Files/zhyiwww/SplitImage.zip">SplitImage</a><br />这只是一个简单的实现。当然，也可以在servlet端来实现此功能。<br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/153967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-10-18 17:54 <a href="http://www.blogjava.net/zhyiwww/archive/2007/10/18/153967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>properties文件的写操作</title><link>http://www.blogjava.net/zhyiwww/archive/2007/08/02/133960.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Thu, 02 Aug 2007 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/08/02/133960.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/133960.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/08/02/133960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/133960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/133960.html</trackback:ping><description><![CDATA[我们经常使用.properties文件作为配置文件,所以大部分的时候,我们只是load,然后读取其配置属性.<br />但是,有的时候,我们可能也需要动态的更新配置,那么怎么来实现对properties配置文件的更新操作呢.<br />这个问题其实很简单,我们先看读操作:<br />Properties p;<br />        try {<br />            p = PropertiesReader<br />                    .readProperties("org/zy/common/parse/util/config.properties");<br />先载入配置文件,<br />String javaHome = p.getProperty("JAVA_HOME"));<br />通过getProperty()方法和关键字来实现属性的检索和返回.<br />那么,如何写?<br />多的时候我们知道,我们首先要读我们的配置文件流,那么写的时候,我们也要先得到一个写文件流.<br />由于是文本文件,所以我们使用FileWriter.<br />String path =p.getClass().getResource("/org/zy/common/parse/util/config.properties").getPath();<br /> Writer w=new FileWriter(path);<br />此时,我们已经准备好了,要把更新的属性写到哪里,那么,如何写?<br />有的时候,可能你是要更新某个属性,有的时候,可能你要添加一个属性.<br />可能你会使用w.write()方法来实现写操作,没有问题,但是,你以前的配置就完全没有了,如果想保留的话,就只有完全写一个新的文件.这中方法,对于更新某个属性的值来说就稍微的麻烦一点.当然,可以用正则表达式来实现.<br />其实properties本身也给我们提供了方法.<br /><br />p.setProperty("bb", "bb update string");<br />            p.store(w,"bb");         <br />            w.close();<br />我们可以读属性,就可以设置属性.<br />setProperty()方法就可以实现.<br />但是此时的更新只是在内存中,并没有写如文件.要写入文件的话,就要调用store()方法.此时,我们关闭输出流的话,数据已经持久化到了文件.<br />setProperty()中,如果你的属性是文件里面没有的属性,那么,系统会进行追加操行,如果你的属性,在系统中已经存在,那么系统就会进行更新操作.<br />例如:<br />你的配置文件是:<br />a=a<br />b=b<br />c=c<br />那么,如果你<br />p.setProperty("d","d");<br />那么,结果就是:<br />a=a<br />
b=b<br />
c=c<br />d=d<br />如果你执行<br />p.setProperty("a","d");<br />那么,结果就是:<br />a=d<br />

b=b<br />

c=c<br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/133960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-08-02 11:26 <a href="http://www.blogjava.net/zhyiwww/archive/2007/08/02/133960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中实现图片裁剪</title><link>http://www.blogjava.net/zhyiwww/archive/2007/01/30/96767.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 30 Jan 2007 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2007/01/30/96767.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/96767.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2007/01/30/96767.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/96767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/96767.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在Java中实现图片的裁剪&nbsp;&nbsp;<a href='http://www.blogjava.net/zhyiwww/archive/2007/01/30/96767.html'>阅读全文</a><img src ="http://www.blogjava.net/zhyiwww/aggbug/96767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2007-01-30 17:41 <a href="http://www.blogjava.net/zhyiwww/archive/2007/01/30/96767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XPath Study(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/10/24/77040.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 24 Oct 2006 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/10/24/77040.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/77040.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/10/24/77040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/77040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/77040.html</trackback:ping><description><![CDATA[XPath Study XPath Introduction <br /><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke join=""></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path></v:shapetype><v:shape id="_x0000_i1054"><v:imagedata o:href="http://www.w3schools.com/images/btn_previous.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image001.gif"></v:imagedata></v:shape><v:shape id="_x0000_i1055"><v:imagedata o:href="http://www.w3schools.com/images/btn_next.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image002.gif"></v:imagedata></v:shape><div class="MsoNormal" align="center"></div><br /><b>XPath is a language for finding information in an XML document. XPath is used to navigate through elements and attributes in an XML document.</b><div class="MsoNormal" align="center"><b></b></div>What You Should Already Know <br />Before you continue you should have a basic understanding of the following: 
<ul><li>HTML / XHTML </li><li>XML / XML Namespaces </li></ul><br />If you want to study these subjects first, find the tutorials on our Home page. 
<div class="MsoNormal" align="center"></div>What is XPath? 
<ul><li>XPath is a syntax for defining parts of an XML document </li><li>XPath uses path expressions to navigate in XML documents </li><li>XPath contains a library of standard functions </li><li>XPath is a major element in XSLT </li><li>XPath is a W3C Standard </li></ul><div class="MsoNormal" align="center"></div>XPath Path Expressions <br />XPath uses path expressions to select nodes or node-sets in an XML document. These path expressions look very much like the expressions you see when you work with a traditional computer file system. 
<div class="MsoNormal" align="center"></div>XPath Standard Functions <br />XPath includes over 100 built-in functions. There are functions for string values, numeric values, date and time comparison, node and QName manipulation, sequence manipulation, Boolean values, and more. 
<div class="MsoNormal" align="center"></div>XPath is Used in XSLT <br />XPath is a major element in the XSLT standard. Without XPath knowledge you will not be able to create XSLT documents. <br />You can read more about XSLT in our XSLT tutorial. <br />XQuery and XPointer are both built on XPath expressions. XQuery 1.0 and XPath 2.0 share the same data model and support the same functions and operators. <br />You can read more about XQuery in our XQuery tutorial. 
<div class="MsoNormal" align="center"></div>XPath is a W3C Standard <br />XPath became a W3C Recommendation 16. November 1999. <br />XPath was designed to be used by XSLT, XPointer and other XML parsing software. <br />You can read more about the XPath standard in our W3C tutorial. XPath Nodes <br /><v:shape id="_x0000_i1056"><v:imagedata o:href="http://www.w3schools.com/images/btn_previous.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image001.gif"></v:imagedata></v:shape><v:shape id="_x0000_i1057"><v:imagedata o:href="http://www.w3schools.com/images/btn_next.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image002.gif"></v:imagedata></v:shape><div class="MsoNormal" align="center"></div><br /><b>In XPath, there are seven kinds of nodes: element, attribute, text, namespace, processing-instruction, comment, and document (root) nodes.</b><div class="MsoNormal" align="center"><b></b></div>XPath Terminology Nodes <br />In XPath, there are seven kinds of nodes: element, attribute, text, namespace, processing-instruction, comment, and document (root) nodes. XML documents are treated as trees of nodes. The root of the tree is called the document node (or root node). <br />Look at the following XML document: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<pre></pre><br />&lt;bookstore&gt;<pre></pre><br />&lt;book&gt;<pre></pre><br />  &lt;title &gt;<br />  &lt;author&gt;J K. Rowling&lt;/author&gt; <pre></pre><br />  &lt;year&gt;2005&lt;/year&gt;<pre></pre><br />  &lt;price&gt;29.99&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;/bookstore&gt;<pre></pre></td></tr></tbody></table><br />Example of nodes in the XML document above: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />&lt;bookstore&gt;  (document node)<pre></pre><br />&lt;author&gt;J K. Rowling&lt;/author&gt;  (element node)<pre></pre><br />&gt;</td></tr></tbody></table>Atomic values <br />Atomic values are nodes with no children or parent. <br />Example of atomic values: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />J K. Rowling<pre></pre><br />"en"<pre></pre></td></tr></tbody></table>Items <br />Items are atomic values or nodes. 
<div class="MsoNormal" align="center"></div>Relationship of Nodes Parent <br />Each element and attribute has one parent. <br />In the following example; the book element is the parent of the title, author, year, and price: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />&lt;book&gt;<pre></pre><br />  &lt;title&gt;Harry Potter&lt;/title&gt;<pre></pre><br />  &lt;author&gt;J K. Rowling&lt;/author&gt;<pre></pre><br />  &lt;year&gt;2005&lt;/year&gt;<pre></pre><br />  &lt;price&gt;29.99&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre></td></tr></tbody></table>Children <br />Element nodes may have zero, one or more children. <br />In the following example; the title, author, year, and price elements are all children of the book element: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />&lt;book&gt;<pre></pre><br />  &lt;title&gt;Harry Potter&lt;/title&gt;<pre></pre><br />  &lt;author&gt;J K. Rowling&lt;/author&gt;<pre></pre><br />  &lt;year&gt;2005&lt;/year&gt;<pre></pre><br />  &lt;price&gt;29.99&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre></td></tr></tbody></table>Siblings <br />Nodes that have the same parent. <br />In the following example; the title, author, year, and price elements are all siblings: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />&lt;book&gt;<pre></pre><br />  &lt;title&gt;Harry Potter&lt;/title&gt;<pre></pre><br />  &lt;author&gt;J K. Rowling&lt;/author&gt;<pre></pre><br />  &lt;year&gt;2005&lt;/year&gt;<pre></pre><br />  &lt;price&gt;29.99&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre></td></tr></tbody></table>Ancestors <br />A node's parent, parent's parent, etc. <br />In the following example; the ancestors of the title element are the book element and the bookstore element: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />&lt;bookstore&gt;<pre></pre><br />&lt;book&gt;<pre></pre><br />  &lt;title&gt;Harry Potter&lt;/title&gt;<pre></pre><br />  &lt;author&gt;J K. Rowling&lt;/author&gt;<pre></pre><br />  &lt;year&gt;2005&lt;/year&gt;<pre></pre><br />  &lt;price&gt;29.99&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;/bookstore&gt;<pre></pre></td></tr></tbody></table>Descendants <br />A node's children, children's children, etc. <br />In the following example; descendants of the bookstore element are the book, title, author, year, and price elements: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />&lt;bookstore&gt;<pre></pre><br />&lt;book&gt;<pre></pre><br />  &lt;title&gt;Harry Potter&lt;/title&gt;<pre></pre><br />  &lt;author&gt;J K. Rowling&lt;/author&gt;<pre></pre><br />  &lt;year&gt;2005&lt;/year&gt;<pre></pre><br />  &lt;price&gt;29.99&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;/bookstore&gt;<pre></pre></td></tr></tbody></table>XPath Syntax <br /><v:shape id="_x0000_i1058"><v:imagedata o:href="http://www.w3schools.com/images/btn_previous.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image001.gif"></v:imagedata></v:shape><v:shape id="_x0000_i1059"><v:imagedata o:href="http://www.w3schools.com/images/btn_next.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image002.gif"></v:imagedata></v:shape><div class="MsoNormal" align="center"></div><br /><b>XPath uses path expressions to select nodes or node-sets in an XML document. The node is selected by following a path or steps.</b><div class="MsoNormal" align="center"><b></b></div>The XML Example Document <br />We will use the following XML document in the examples below. <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<pre></pre><br />&lt;bookstore&gt;<pre></pre><br />&lt;book&gt;<pre></pre><br />  &lt;title &gt;<br />  &lt;price&gt;29.99&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;book&gt;<pre></pre><br />  &lt;title &gt;<br />  &lt;price&gt;39.95&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;/bookstore&gt;<pre></pre></td></tr></tbody></table><br />  
<div class="MsoNormal" align="center"></div>Selecting Nodes <br />XPath uses path expressions to select nodes in an XML document. The node is selected by following a path or steps. The most useful path expressions are listed below: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br /><b>Expression</b></td><td valign="top"><br /><b>Description</b></td></tr><tr><td valign="top"><br /><em>nodename</em></td><td valign="top"><br />Selects all child nodes of the node</td></tr><tr><td valign="top"><br />/</td><td valign="top"><br />Selects from the root node</td></tr><tr><td valign="top"><br />//</td><td valign="top"><br />Selects nodes in the document from the current node that match the selection no matter where they are </td></tr><tr><td valign="top"><br />.</td><td valign="top"><br />Selects the current node</td></tr><tr><td valign="top"><br />..</td><td valign="top"><br />Selects the parent of the current node</td></tr><tr><td valign="top"><br />@</td><td valign="top"><br />Selects attributes</td></tr></tbody></table>Examples <br />In the table below we have listed some path expressions and the result of the expressions: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br /><b>Path Expression</b></td><td valign="top"><br /><b>Result</b></td></tr><tr><td valign="top"><br />bookstore</td><td valign="top"><br />Selects all the child nodes of the bookstore element</td></tr><tr><td valign="top"><br />/bookstore</td><td valign="top"><br />Selects the root element bookstore <br /><b>Note:</b> If the path starts with a slash ( / ) it always represents an absolute path to an element!</td></tr><tr><td valign="top"><br />bookstore/book</td><td valign="top"><br />Selects all book elements that are children of bookstore</td></tr><tr><td valign="top"><br />//book</td><td valign="top"><br />Selects all book elements no matter where they are in the document</td></tr><tr><td valign="top"><br />bookstore//book</td><td valign="top"><br />Selects all book elements that are descendant of the bookstore element, no matter where they are under the bookstore element</td></tr><tr><td valign="top"><br />//@lang</td><td valign="top"><br />Selects all attributes that are named lang</td></tr></tbody></table><br />  
<div class="MsoNormal" align="center"></div>Predicates <br />Predicates are used to find a specific node or a node that contains a specific value. <br />Predicates are always embedded in square brackets. Examples <br />In the table below we have listed some path expressions with predicates and the result of the expressions: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br /><b>Path Expression</b></td><td valign="top"><br /><b>Result</b></td></tr><tr><td valign="top"><br />/bookstore/book[1] </td><td valign="top"><br />Selects the first book element that is the child of the bookstore element</td></tr><tr><td valign="top"><br />/bookstore/book[last()]</td><td valign="top"><br />Selects the last book element that is the child of the bookstore element</td></tr><tr><td valign="top"><br />/bookstore/book[last()-1]</td><td valign="top"><br />Selects the last but one book element that is the child of the bookstore element</td></tr><tr><td valign="top"><br />/bookstore/book[position()&lt;3]</td><td valign="top"><br />Selects the first two book elements that are children of the bookstore element</td></tr><tr><td valign="top"><br />//title[@lang]</td><td valign="top"><br />Selects all the title elements that have an attribute named lang</td></tr><tr><td valign="top"><br />//title[@&gt; 
</td><td valign="top"><br />Selects all the title elements that have an attribute named lang with a value of 'eng'</td></tr><tr><td valign="top"><br />/bookstore/book[price&gt;35.00]</td><td valign="top"><br />Selects all the book elements of the bookstore element that have a price element with a value greater than 35.00</td></tr><tr><td valign="top"><br />/bookstore/book[price&gt;35.00]/title</td><td valign="top"><br />Selects all the title elements of the book elements of the bookstore element that have a price element with a value greater than 35.00</td></tr></tbody></table><br />  
<div class="MsoNormal" align="center"></div>Selecting Unknown Nodes <br />XPath wildcards can be used to select unknown XML elements. <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br /><b>Wildcard</b></td><td valign="top"><br /><b>Description</b></td></tr><tr><td valign="top"><br />*</td><td valign="top"><br />Matches any element node</td></tr><tr><td valign="top"><br />@*</td><td valign="top"><br />Matches any attribute node</td></tr><tr><td valign="top"><br />node()</td><td valign="top"><br />Matches any node of any kind</td></tr></tbody></table>Examples <br />In the table below we have listed some path expressions and the result of the expressions: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br /><b>Path Expression</b></td><td valign="top"><br /><b>Result</b></td></tr><tr><td valign="top"><br />/bookstore/*</td><td valign="top"><br />Selects all the child nodes of the bookstore element</td></tr><tr><td valign="top"><br />//*</td><td valign="top"><br />Selects all elements in the document</td></tr><tr><td valign="top"><br />//title[@*]</td><td valign="top"><br />Selects all title elements which have any attribute</td></tr></tbody></table><br />  
<div class="MsoNormal" align="center"></div>Selecting Several Paths <br />By using the | operator in an XPath expression you can select several paths. Examples <br />In the table below we have listed some path expressions and the result of the expressions: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br /><b>Path Expression</b></td><td valign="top"><br /><b>Result</b></td></tr><tr><td valign="top"><br />//book/title | //book/price</td><td valign="top"><br />Selects all the title AND price elements of all book elements</td></tr><tr><td valign="top"><br />//title | //price</td><td valign="top"><br />Selects all the title AND price elements in the document</td></tr><tr><td valign="top"><br />/bookstore/book/title | //price</td><td valign="top"><br />Selects all the title elements of the book element of the bookstore element AND all the price elements in the document</td></tr></tbody></table>XPath Axes <br /><v:shape id="_x0000_i1060"><v:imagedata o:href="http://www.w3schools.com/images/btn_previous.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image001.gif"></v:imagedata></v:shape><v:shape id="_x0000_i1061"><v:imagedata o:href="http://www.w3schools.com/images/btn_next.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image002.gif"></v:imagedata></v:shape><div class="MsoNormal" align="center"></div>The XML Example Document <br />We will use the following XML document in the examples below. <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<pre></pre><br />&lt;bookstore&gt;<pre></pre><br />&lt;book&gt;<pre></pre><br />  &lt;title &gt;<br />  &lt;price&gt;29.99&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;book&gt;<pre></pre><br />  &lt;title &gt;<br />  &lt;price&gt;39.95&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;/bookstore&gt;<pre></pre></td></tr></tbody></table><br />  
<div class="MsoNormal" align="center"></div>XPath Axes <br />An axis defines a node-set relative to the current node. <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br /><b>AxisName</b></td><td><br /><b>Result</b></td></tr><tr><td valign="top"><br />ancestor</td><td valign="top"><br />Selects all ancestors (parent, grandparent, etc.) of the current node</td></tr><tr><td valign="top"><br />ancestor-or-self</td><td valign="top"><br />Selects all ancestors (parent, grandparent, etc.) of the current node and the current node itself</td></tr><tr><td valign="top"><br />attribute</td><td valign="top"><br />Selects all attributes of the current node</td></tr><tr><td valign="top"><br />child</td><td valign="top"><br />Selects all children of the current node</td></tr><tr><td valign="top"><br />descendant</td><td valign="top"><br />Selects all descendants (children, grandchildren, etc.) of the current node</td></tr><tr><td valign="top"><br />descendant-or-self</td><td valign="top"><br />Selects all descendants (children, grandchildren, etc.) of the current node and the current node itself</td></tr><tr><td valign="top"><br />following</td><td valign="top"><br />Selects everything in the document after the closing tag of the current node</td></tr><tr><td valign="top"><br />following-sibling</td><td valign="top"><br />Selects all siblings after the current node</td></tr><tr><td valign="top"><br />namespace</td><td valign="top"><br />Selects all namespace nodes of the current node</td></tr><tr><td valign="top"><br />parent</td><td valign="top"><br />Selects the parent of the current node</td></tr><tr><td valign="top"><br />preceding</td><td valign="top"><br />Selects everything in the document that is before the start tag of the current node</td></tr><tr><td valign="top"><br />preceding-sibling</td><td valign="top"><br />Selects all siblings before the current node</td></tr><tr><td valign="top"><br />self</td><td valign="top"><br />Selects the current node</td></tr></tbody></table><br />  
<div class="MsoNormal" align="center"></div>Location Path Expression <br />A location path can be absolute or relative. <br />An absolute location path starts with a slash ( / ) and a relative location path does not. In both cases the location path consists of one or more steps, each separated by a slash: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td valign="top"><br />An absolute location path:<pre></pre><br />/step/step/...<pre></pre><br />A relative location path:<pre></pre><br />step/step/...<pre></pre></td></tr></tbody></table><br />Each step is evaluated against the nodes in the current node-set. <br />A step consists of: 
<ul><li>an axis (defines the tree-relationship between the selected nodes and the current node) </li><li>a node-test (identifies a node within an axis) </li><li>zero or more predicates (to further refine the selected node-set) </li></ul><br />The syntax for a location step is: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td valign="top"><br />axisname::nodetest[predicate]<pre></pre></td></tr></tbody></table>Examples <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br /><b>Example</b></td><td><br /><b>Result</b></td></tr><tr><td valign="top"><br />child::book</td><td valign="top"><br />Selects all book nodes that are children of the current node</td></tr><tr><td valign="top"><br />attribute::lang</td><td valign="top"><br />Selects the lang attribute of the current node</td></tr><tr><td valign="top"><br />child::*</td><td valign="top"><br />Selects all children of the current node</td></tr><tr><td valign="top"><br />attribute::*</td><td valign="top"><br />Selects all attributes of the current node</td></tr><tr><td valign="top"><br />child::text()</td><td valign="top"><br />Selects all text child nodes of the current node</td></tr><tr><td valign="top"><br />child::node()</td><td valign="top"><br />Selects all child nodes of the current node</td></tr><tr><td valign="top"><br />descendant::book</td><td valign="top"><br />Selects all book descendants of the current node</td></tr><tr><td valign="top"><br />ancestor::book</td><td valign="top"><br />Selects all book ancestors of the current node</td></tr><tr><td valign="top"><br />ancestor-or-self::book</td><td valign="top"><br />Selects all book ancestors of the current node - and the current as well if it is a book node</td></tr><tr><td valign="top"><br />child::*/child::price</td><td valign="top"><br />Selects all price grandchildren of the current node</td></tr></tbody></table>XPath Operators <br /><v:shape id="_x0000_i1062"><v:imagedata o:href="http://www.w3schools.com/images/btn_previous.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image001.gif"></v:imagedata></v:shape><v:shape id="_x0000_i1063"><v:imagedata o:href="http://www.w3schools.com/images/btn_next.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image002.gif"></v:imagedata></v:shape><div class="MsoNormal" align="center"></div><br /><b>An XPath expression returns either a node-set, a string, a Boolean, or a number.</b><div class="MsoNormal" align="center"><b></b></div>XPath Operators <br />Below is a list of the operators that can be used in XPath expressions: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br /><b>Operator</b></td><td><br /><b>Description</b></td><td><br /><b>Example</b></td><td><br /><b>Return value</b></td></tr><tr><td valign="top"><br />|</td><td valign="top"><br />Computes two node-sets</td><td valign="top"><br />//book | //cd</td><td valign="top"><br />Returns a node-set with all book and cd elements</td></tr><tr><td valign="top"><br />+</td><td valign="top"><br />Addition</td><td valign="top"><br />6 + 4</td><td valign="top"><br />10</td></tr><tr><td valign="top"><br />-</td><td valign="top"><br />Subtraction</td><td valign="top"><br />6 - 4</td><td valign="top"><br />2</td></tr><tr><td valign="top"><br />*</td><td valign="top"><br />Multiplication</td><td valign="top"><br />6 * 4</td><td valign="top"><br />24</td></tr><tr><td valign="top"><br />div</td><td valign="top"><br />Division</td><td valign="top"><br />8 div 4</td><td valign="top"><br />2</td></tr><tr><td valign="top"><br />=</td><td valign="top"><br />Equal</td><td valign="top"><br />price=9.80</td><td valign="top"><br />true if price is 9.80<b>false if price is 9.90</b></td></tr><tr><td valign="top"><br />!=</td><td valign="top"><br />Not equal</td><td valign="top"><br />price!=9.80</td><td valign="top"><br />true if price is 9.90<b>false if price is 9.80</b></td></tr><tr><td valign="top"><br />&lt; </td><td valign="top"><br />Less than</td><td valign="top"><br />price&lt;9.80</td><td valign="top"><br />true if price is 9.00<b>false if price is 9.80</b></td></tr><tr><td valign="top"><br />&lt;=</td><td valign="top"><br />Less than or equal to</td><td valign="top"><br />price&lt;=9.80</td><td valign="top"><br />true if price is 9.00<b>false if price is 9.90</b></td></tr><tr><td valign="top"><br />&gt; </td><td valign="top"><br />Greater than</td><td valign="top"><br />price&gt;9.80</td><td valign="top"><br />true if price is 9.90<b>false if price is 9.80</b></td></tr><tr><td valign="top"><br />&gt;=</td><td valign="top"><br />Greater than or equal to</td><td valign="top"><br />price&gt;=9.80</td><td valign="top"><br />true if price is 9.90<b>false if price is 9.70</b></td></tr><tr><td valign="top"><br />or</td><td valign="top"><br />or</td><td valign="top"><br />price=9.80 or price=9.70</td><td valign="top"><br />true if price is 9.80<b>false if price is 9.50</b></td></tr><tr><td valign="top"><br />and</td><td valign="top"><br />and </td><td valign="top"><br />price&gt;9.00 and price&lt;9.90</td><td valign="top"><br />true if price is 9.80<b>false if price is 8.50</b></td></tr><tr><td valign="top"><br />mod</td><td valign="top"><br />Modulus (division remainder)</td><td valign="top"><br />5 mod 2</td><td valign="top"><br />1</td></tr></tbody></table>XPath Examples <br /><v:shape id="_x0000_i1064"><v:imagedata o:href="http://www.w3schools.com/images/btn_previous.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image001.gif"></v:imagedata></v:shape><v:shape id="_x0000_i1065"><v:imagedata o:href="http://www.w3schools.com/images/btn_next.gif" src="file:///C:\DOCUME~1\ZHANGY~1.CGO\LOCALS~1\Temp\msohtml1\04\clip_image002.gif"></v:imagedata></v:shape><div class="MsoNormal" align="center"></div><br /><b>Let's try to learn some basic XPath syntax by looking at some examples.</b><div class="MsoNormal" align="center"><b></b></div>The XML Example Document <br />We will use the following XML document in the examples below. <br />"books.xml": <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<pre></pre><br />&lt;bookstore&gt;<pre></pre><br />&lt;book category="COOKING"&gt;<pre></pre><br />  &lt;title &gt;<br />  &lt;author&gt;Giada De Laurentiis&lt;/author&gt;<pre></pre><br />  &lt;year&gt;2005&lt;/year&gt;<pre></pre><br />  &lt;price&gt;30.00&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;book category="CHILDREN"&gt;<pre></pre><br />  &lt;title &gt;<br />  &lt;author&gt;J K. Rowling&lt;/author&gt;<pre></pre><br />  &lt;year&gt;2005&lt;/year&gt;<pre></pre><br />  &lt;price&gt;29.99&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;book category="WEB"&gt;<pre></pre><br />  &lt;title &gt;<br />  &lt;author&gt;James McGovern&lt;/author&gt;<pre></pre><br />  &lt;author&gt;Per Bothner&lt;/author&gt;<pre></pre><br />  &lt;author&gt;Kurt Cagle&lt;/author&gt;<pre></pre><br />  &lt;author&gt;James Linn&lt;/author&gt;<pre></pre><br />  &lt;author&gt;Vaidyanathan Nagarajan&lt;/author&gt;<pre></pre><br />  &lt;year&gt;2003&lt;/year&gt;<pre></pre><br />  &lt;price&gt;49.99&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;book category="WEB"&gt;<pre></pre><br />  &lt;title &gt;<br />  &lt;author&gt;Erik T. Ray&lt;/author&gt;<pre></pre><br />  &lt;year&gt;2003&lt;/year&gt;<pre></pre><br />  &lt;price&gt;39.95&lt;/price&gt;<pre></pre><br />&lt;/book&gt;<pre></pre><br />&lt;/bookstore&gt;<pre></pre></td></tr></tbody></table><br />View the "books.xml" file in your browser. 
<div class="MsoNormal" align="center"></div>Selecting Nodes <br />We will use the Microsoft XMLDOM object to load the XML document and the selectNodes() function to select nodes from the XML document: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />set xmlDoc=CreateObject("Microsoft.XMLDOM")<pre></pre><br />xmlDoc.async="false"<pre></pre><br />xmlDoc.load("books.xml")<pre></pre><br />xmlDoc.selectNodes(<em>path expression</em>)<pre></pre></td></tr></tbody></table><br />  
<div class="MsoNormal" align="center"></div>Select all book Nodes <br />The following example selects all the book nodes under the bookstore element: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />xmlDoc.selectNodes("/bookstore/book")<pre></pre></td></tr></tbody></table><br />If you have IE 5 or higher you can try it yourself. 
<div class="MsoNormal" align="center"></div>Select the First book Node <br />The following example selects only the first book node under the bookstore element: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />xmlDoc.selectNodes("/bookstore/book[0]")<pre></pre></td></tr></tbody></table><br />If you have IE 5 or higher you can try it yourself. <br /><b>Note:</b> IE 5 and 6 has implemented that [0] should be the first node, but according to the W3C standard it should have been [1]!! <br /><b>Note:</b> This is corrected in IE 6 SP2! 
<div class="MsoNormal" align="center"></div>Select the prices <br />The following example selects the text from all the price nodes: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />xmlDoc.selectNodes("/bookstore/book/price/text()") <pre></pre></td></tr></tbody></table><br />If you have IE 5 or higher you can try it yourself. 
<div class="MsoNormal" align="center"></div>Selecting price Nodes with Price&gt;35 <br />The following example selects all the price nodes with a price higher than 35: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />xmlDoc.selectNodes("/bookstore/book[price&gt;35]/price") <pre></pre></td></tr></tbody></table><br />If you have IE 5 or higher you can try it yourself. 
<div class="MsoNormal" align="center"></div>Selecting title Nodes with Price&gt;35 <br />The following example selects all the title nodes with a price higher than 35: <br /><table class="MsoNormalTable" border="1"><tbody><tr><td><br />xmlDoc.selectNodes("/bookstore/book[price&gt;35]/title") <pre></pre></td></tr></tbody></table><br />If you have IE 5 or higher you can try it yourself. <br />  <br />  <br />  <br />  <br /> <img src ="http://www.blogjava.net/zhyiwww/aggbug/77040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-10-24 17:57 <a href="http://www.blogjava.net/zhyiwww/archive/2006/10/24/77040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassLoader分析(转载)</title><link>http://www.blogjava.net/zhyiwww/archive/2006/10/20/76406.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Fri, 20 Oct 2006 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/10/20/76406.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/76406.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/10/20/76406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/76406.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/76406.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ClassLoader分析																																												1												          																																				前言																												ClassLoader						是...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhyiwww/archive/2006/10/20/76406.html'>阅读全文</a><img src ="http://www.blogjava.net/zhyiwww/aggbug/76406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-10-20 16:23 <a href="http://www.blogjava.net/zhyiwww/archive/2006/10/20/76406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何将字符串转换成Unicode编码</title><link>http://www.blogjava.net/zhyiwww/archive/2006/07/11/57686.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Tue, 11 Jul 2006 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/07/11/57686.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/57686.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/07/11/57686.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/57686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/57686.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 将字符串转换成Unicode编码&nbsp;&nbsp;<a href='http://www.blogjava.net/zhyiwww/archive/2006/07/11/57686.html'>阅读全文</a><img src ="http://www.blogjava.net/zhyiwww/aggbug/57686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-07-11 17:35 <a href="http://www.blogjava.net/zhyiwww/archive/2006/07/11/57686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>System.getProperty()参数大全</title><link>http://www.blogjava.net/zhyiwww/archive/2006/06/02/50024.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Fri, 02 Jun 2006 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/06/02/50024.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/50024.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/06/02/50024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/50024.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/50024.html</trackback:ping><description><![CDATA[
		<div id="title">
				<font style="BACKGROUND-COLOR: #f5f5dc" face="Courier New" size="5">
						<strong>System.getProperty()参数大全</strong>
				</font>
				<font color="#000000">
						<br />
						<br />java.version            Java Runtime Environment version<br />java.vendor            Java Runtime Environment vendor<br />java.vendor.url            Java vendor URL<br />java.home            Java installation directory<br />java.vm.specification.version                    Java Virtual Machine specification version<br />java.vm.specification.vendor                    Java Virtual Machine specification vendor<br />java.vm.specification.name                    Java Virtual Machine specification name<br />java.vm.version            Java Virtual Machine implementation version<br />java.vm.vendor            Java Virtual Machine implementation vendor<br />java.vm.name            Java Virtual Machine implementation name<br />java.specification.version                Java Runtime Environment specification version<br />java.specification.vendor             Java Runtime Environment specification vendor<br />java.specification.name        Java Runtime Environment specification name<br />java.class.version                        Java class format version number<br />java.class.path                  Java class path<br />java.library.path                        List of paths to search when loading libraries<br />java.io.tmpdir                Default temp file path<br />java.compiler            Name of JIT compiler to use<br />java.ext.dirs            Path of extension directory or directories<br />os.name                Operating system name<br />os.arch                Operating system architecture<br />os.version            Operating system version<br />file.separator            File separator ("/" on UNIX)<br />path.separator            Path separator (":" on UNIX)<br />line.separator            Line separator ("\n" on UNIX)<br />user.name            User's account name<br />user.home            User's home directory<br />user.dir                User's current working directory</font>
		</div>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/50024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-06-02 18:39 <a href="http://www.blogjava.net/zhyiwww/archive/2006/06/02/50024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>去掉一个字符串数组中的重复项</title><link>http://www.blogjava.net/zhyiwww/archive/2006/04/13/40810.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Thu, 13 Apr 2006 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/04/13/40810.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/40810.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/04/13/40810.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/40810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/40810.html</trackback:ping><description><![CDATA[
		<strong>转载 自<a href="/fastzch/archive/2006/04/11/40507.html?Pending=true#Post">http://www.blogjava.net/fastzch/archive/2006/04/11/40507.html?Pending=true#Post</a><br /><br /><br />1、去掉一个字符串数组中的重复项</strong>：(2006.04.11.)<br />原来采用的方法：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">String[] rid </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> request.getParameterValues(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">noattRid</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">需要用一个临时的变量把过滤后的结果这个存起来</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">String[] ridFiltered </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> String[rid.length];<br /></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> index </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> rid.length; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br /></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.isExistString(ridFiltered, rid[i])</span><span style="COLOR: #000000">&amp;&amp;!</span><span style="COLOR: #000000">rid[i].equals(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">)) {<br /></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">                ridFiltered[index</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> rid[i];<br /></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">            }<br /></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000">        }<br /></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">还需要用一个方法来判断在结果中是否存在此项，如下</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">12</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">13</span> <span style="COLOR: #008000">     * 用于查找某个字符串是否在一个字符串数组中<br /></span><span style="COLOR: #008080">14</span> <span style="COLOR: #008000">     * </span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000"> dest String[]<br /></span><span style="COLOR: #008080">15</span> <span style="COLOR: #008000">     * </span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000"> str String<br /></span><span style="COLOR: #008080">16</span> <span style="COLOR: #008000">     * return boolean<br /></span><span style="COLOR: #008080">17</span> <span style="COLOR: #008000">     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> isExistString(String[] dest, String str) {<br /></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> flag </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> dest.length; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) {<br /></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (str.equals(dest[i])) {<br /></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000">                flag </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">24</span> <span style="COLOR: #000000">            }<br /></span><span style="COLOR: #008080">25</span> <span style="COLOR: #000000">        }<br /></span><span style="COLOR: #008080">26</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> flag;<br /></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000">    }</span></div><br />看看，要多麻烦有多麻烦，来看看新方法：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <span style="COLOR: #000000">String[] s </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> request.getParameterValues(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">noattRid</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000">List list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Arrays.asList(s);<br /></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000">Set set </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashSet(list);<br /></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000">rid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(String [])set.toArray();</span></div>简简单单的三行代码即可搞定，无论是从程序的可读性、优雅性还是效率方面都有很好的提升。<br />扩展：你同时还可以运用上面的方法还判断三个字符串是否相等（可进一步扩展至多个，但是似乎不太有实际意义），例程如下：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span> <span style="COLOR: #000000">String[] s </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> {</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">one</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">two</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">two</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">};<br /></span><span style="COLOR: #008080">2</span> <span style="COLOR: #000000">List list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Arrays.asList(s);<br /></span><span style="COLOR: #008080">3</span> <span style="COLOR: #000000">Set set </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashSet(list);<br /></span><span style="COLOR: #008080">4</span> <span style="COLOR: #000000">System.out.println(list.size() </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> set.size()); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> false</span></div><img src ="http://www.blogjava.net/zhyiwww/aggbug/40810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-04-13 09:38 <a href="http://www.blogjava.net/zhyiwww/archive/2006/04/13/40810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vector和ArrayList的区别</title><link>http://www.blogjava.net/zhyiwww/archive/2006/04/12/40554.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 12 Apr 2006 01:09:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/04/12/40554.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/40554.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/04/12/40554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/40554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/40554.html</trackback:ping><description><![CDATA[<h1 style="margin: 17pt 0cm 16.5pt; text-align: center;" align="center">
<span lang="EN-US">Vector</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">ArrayList</span>
<span style="font-family: 宋体;">的区别</span>
</h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(这篇文章是从网上摘录,地址忘了,如涉及版权请和我联系zhyiwww@163.com)<o:p></o:p></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt; text-indent: -21.25pt;">
<span style="font-size: 12pt;" lang="EN-US">1.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>
<span style="font-size: 12pt;" lang="EN-US">vector</span>
<span style="font-size: 12pt; font-family: 宋体;">是线程同步的，所以它也是线程安全的，而</span>
<span style="font-size: 12pt;" lang="EN-US">arraylist</span>
<span style="font-size: 12pt; font-family: 宋体;">是线程异步的，是不安全的。如果不考虑到线程的安全因素，一般用</span>
<span style="font-size: 12pt;" lang="EN-US">arraylist</span>
<span style="font-size: 12pt; font-family: 宋体;">效率比较高。</span>
<span style="font-size: 12pt;" lang="EN-US">
<o:p>
</o:p>
</span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span style="font-size: 12pt;" lang="EN-US">&nbsp;<o:p></o:p></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt; text-indent: -21.25pt;">
<span style="font-size: 12pt;" lang="EN-US">2.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>
<span style="font-size: 12pt; font-family: 宋体;">如果集合中的元素的数目大于目前集合数组的长度时，</span>
<span style="font-size: 12pt;" lang="EN-US">vector</span>
<span style="font-size: 12pt; font-family: 宋体;">增长率为目前数组长度的</span>
<span style="font-size: 12pt;" lang="EN-US">100%,</span>
<span style="font-size: 12pt; font-family: 宋体;">而</span>
<span style="font-size: 12pt;" lang="EN-US">arraylist</span>
<span style="font-size: 12pt; font-family: 宋体;">增长率为目前数组长度的</span>
<span style="font-size: 12pt;" lang="EN-US">50%.</span>
<span style="font-size: 12pt; font-family: 宋体;">如过在集合中使用数据量比较大的数据，用</span>
<span style="font-size: 12pt;" lang="EN-US">vector</span>
<span style="font-size: 12pt; font-family: 宋体;">有一定的优势。</span>
<span style="font-size: 12pt;" lang="EN-US">
<o:p>
</o:p>
</span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span style="font-size: 12pt;" lang="EN-US">&nbsp;<o:p></o:p></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21.25pt; text-indent: -21.25pt;">
<span lang="EN-US">3.<span style="font: 7pt 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>
<span style="font-size: 12pt; font-family: 宋体;">如果查找一个指定位置的数据，</span>
<span style="font-size: 12pt;" lang="EN-US">vector</span>
<span style="font-size: 12pt; font-family: 宋体;">和</span>
<span style="font-size: 12pt;" lang="EN-US">arraylist</span>
<span style="font-size: 12pt; font-family: 宋体;">使用的时间是相同的，都是</span>
<span style="font-size: 12pt;" lang="EN-US">0(1),</span>
<span style="font-size: 12pt; font-family: 宋体;">这个时候使用</span>
<span style="font-size: 12pt;" lang="EN-US">vector</span>
<span style="font-size: 12pt; font-family: 宋体;">和</span>
<span style="font-size: 12pt;" lang="EN-US">arraylist</span>
<span style="font-size: 12pt; font-family: 宋体;">都可以。而如果移动一个指定位置的数据花费的时间为</span>
<span style="font-size: 12pt;" lang="EN-US">0(n-i)n</span>
<span style="font-size: 12pt; font-family: 宋体;">为总长度，这个时候就应该考虑到使用</span>
<span style="font-size: 12pt;" lang="EN-US">linklist,</span>
<span style="font-size: 12pt; font-family: 宋体;">因为它移动一个指定位置的数据所花费的时间为</span>
<span style="font-size: 12pt;" lang="EN-US">0(1),</span>
<span style="font-size: 12pt; font-family: 宋体;">而查询一个指定位置的数据时花费的时间为</span>
<span style="font-size: 12pt;" lang="EN-US">0(i)</span>
<span style="font-size: 12pt; font-family: 宋体;">。</span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span lang="EN-US">&nbsp;<o:p></o:p></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span lang="EN-US">&nbsp;<o:p></o:p></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
<span style="font-family: 宋体;">另：</span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
<strong>
<span style="font-family: 楷体_GB2312;">如果你注意到对<span lang="EN-US">Vector和List的所开始支持的Java版本你就应该可以找到答案了。Java对Vector的支持since 1.0；对List则是since 1.2。这两个版本之间，sun对于java api做了很多的改动，其中的一个refactoring就是提出了所谓的Collection FrameWork，List就是在那个时候被introduced，它完全符合1.2版本的collection framework，而Vector则是在Colleciton framework出现之前就已经存在了，但java api并没有将Vector变成Deprecated，主要是backward compatiable的问题，最终JCP将vector做了refactoring的处理，让它符合所定制的Collection framework了事。另外，Hashtable和HashMap的区别是同样的道理。</span></span>
</strong>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span lang="EN-US">&nbsp;<o:p></o:p></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
<strong>
<span style="font-size: 14pt; font-family: 宋体;">结论：</span>
</strong>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
<span style="font-family: 宋体;">尽量采用</span>
<span lang="EN-US">List</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">HashMap</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">rather than Vector&amp;Hashtable</span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span lang="EN-US">&nbsp;<o:p></o:p></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<span lang="EN-US">&nbsp;<o:p></o:p></span>
</p>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/40554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-04-12 09:09 <a href="http://www.blogjava.net/zhyiwww/archive/2006/04/12/40554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入理解abstract class和interface</title><link>http://www.blogjava.net/zhyiwww/archive/2006/04/05/39444.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 05 Apr 2006 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/04/05/39444.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/39444.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/04/05/39444.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/39444.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/39444.html</trackback:ping><description><![CDATA[
		<strong>转载自 <a href="http://bbs.java.ccidnet.com/htm_data/2/0603/1080.html">http://bbs.java.ccidnet.com/htm_data/2/0603/1080.html</a><br /><!----><br /></strong>
		<span class="tpc_content">
				<font size="2">abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制，正是由于这两种机制的存在，才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性，甚至可以相互替换，因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实，两者之间还是有很大的区别的，对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析，试图给开发者提供一个在二者之间进行选择的依据。 <br /><br />理解抽象类 <br /><br />abstract class和interface在Java语言中都是用来进行抽象类（本文中的抽象类并非从abstract class翻译而来，它表示的是一个抽象体，而abstract class为Java语言中用于定义抽象类的一种方法，请读者注意区分）定义的，那么什么是抽象类，使用抽象类能为我们带来什么好处呢？ <br /><br />在面向对象的概念中，我们知道所有的对象都是通过类来描绘的，但是反过来却不是这样。并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念，是对一系列看上去不同，但是本质上相同的具体概念的抽象。比如：如果我们进行一个图形编辑软件的开发，就会发现问题领域存在着圆、三角形这样一些具体概念，它们是不同的，但是它们又都属于形状这样一个概念，形状这个概念在问题领域是不存在的，它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念，所以用以表征抽象概念的抽象类是不能够实例化的。 <br /><br />在面向对象领域，抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述，但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类，而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体，因此它可以是不允许修改的；同时，通过从这个抽象体派生，也可扩展此模块的行为功能。熟悉OCP的读者一定知道，为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle)，抽象类是其中的关键所在。 <br /><br />从语法定义层面看abstract class和interface <br /><br />在语法层面，Java语言对于abstract class和interface给出了不同的定义方式，下面以定义一个名为Demo的抽象类为例来说明这种不同。 <br />使用abstract class的方式定义Demo抽象类的方式如下： <br /><br />abstract class Demo { <br />abstract void method1(); <br />abstract void method2(); <br />… <br />}<br /><br />使用interface的方式定义Demo抽象类的方式如下： <br /><br />interface Demo { <br />void method1(); <br />void method2(); <br />…<br />} <br /><br />在abstract class方式中，Demo可以有自己的数据成员，也可以有非abstarct的成员方法，而在interface方式的实现中，Demo只能够有静态的不能被修改的数据成员（也就是必须是static final的，不过在interface中一般不定义数据成员），所有的成员方法都是abstract的。从某种意义上说，interface是一种特殊形式的abstract class。 <br /><br />从编程的角度来看，abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。 <br /><br />首先，abstract class在Java语言中表示的是一种继承关系，一个类只能使用一次继承关系。但是，一个类却可以实现多个interface。也许，这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 <br /><br />其次，在abstract class的定义中，我们可以赋予方法的默认行为。但是在interface的定义中，方法却不能拥有默认行为，为了绕过这个限制，必须使用委托，但是这会 增加一些复杂性，有时会造成很大的麻烦。 <br /><br />在抽象类中不能定义默认行为还存在另一个比较严重的问题，那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面（一般通过abstract class或者interface来表示）以适应新的情况（比如，添加新的方法或者给已用的方法中添加新的参数）时，就会非常的麻烦，可能要花费很多的时间（对于派生类很多的情况，尤为如此）。但是如果界面是通过abstract class来实现的，那么可能就只需要修改定义在abstract class中的默认行为就可以了。 <br /><br />同样，如果不能在抽象类中定义默认行为，就会导致同样的方法实现出现在该抽象类的每一个派生类中，违反了"one rule，one place"原则，造成代码重复，同样不利于以后的维护。因此，在abstract class和interface间进行选择时要非常的小心。 <br /><br />从设计理念层面看abstract class和interface <br /><br />上面主要从语法定义和编程的角度论述了abstract class和interface的区别，这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面：abstract class和interface所反映出的设计理念，来分析一下二者的区别。作者认为，从这个层面进行分析才能理解二者概念的本质所在。 <br /><br />前面已经提到过，abstarct class在Java语言中体现了一种继承关系，要想使得继承关系合理，父类和派生类之间必须存在"is a"关系，即父类和派生类在概念本质上应该是相同的（参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述，有兴趣的读者可以参考）。对于interface 来说则不然，并不要求interface的实现者和interface定义在概念本质上是一致的，仅仅是实现了interface定义的契约而已。为了使论述便于理解，下面将通过一个简单的实例进行说明。 <br /><br />考虑这样一个例子，假设在我们的问题领域中有一个关于Door的抽象概念，该Door具有执行两个动作open和close，此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型，定义方式分别如下所示： <br /><br />使用abstract class方式定义Door： <br /><br />abstract class Door { <br />abstract void open(); <br />abstract void close()； <br />}<br /><br />使用interface方式定义Door： <br /><br />interface Door { <br />void open(); <br />void close(); <br />}<br /><br />其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。 <br /><br />如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢（在本例中，主要是为了展示abstract class和interface反映在设计理念上的区别，其他方面无关的问题都做了简化或者忽略）？下面将罗列出可能的解决方案，并从设计理念层面对这些不同的方案进行分析。 <br /><br />解决方案一： <br /><br />简单的在Door的定义中增加一个alarm方法，如下： <br /><br />abstract class Door { <br />abstract void open(); <br />abstract void close()； <br />abstract void alarm(); <br />}<br /><br />或者 <br /><br />interface Door { <br />void open(); <br />void close(); <br />void alarm(); <br />}<br /><br />那么具有报警功能的AlarmDoor的定义方式如下： <br /><br />class AlarmDoor extends Door { <br />void open() { … } <br />void close() { … } <br />void alarm() { … } <br />}<br /><br />或者 <br /><br />class AlarmDoor implements Door {<br />void open() { … }<br />void close() { … }<br />void alarm() { … }<br />} <br /><br />这种方法违反了面向对象设计中的一个核心原则ISP（Interface Segregation Priciple），在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变（比如：修改alarm方法的参数）而改变，反之依然。 <br /><br />解决方案二： <br /><br />既然open、close和alarm属于两个不同的概念，根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有：这两个概念都使用abstract class方式定义；两个概念都使用interface方式定义；一个概念使用abstract class方式定义，另一个概念使用interface方式定义。 <br /><br />显然，由于Java语言不支持多重继承，所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的，但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。 <br /><br />如果两个概念都使用interface方式来定义，那么就反映出两个问题：1、我们可能没有理解清楚问题领域，AlarmDoor在概念本质上到底是Door还是报警器？2、如果我们对于问题领域的理解没有问题，比如：我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的，那么我们在实现时就没有能够正确的揭示我们的设计意图，因为在这两个概念的定义上（均使用interface方式定义）反映不出上述含义。<br /><br />如果我们对于问题领域的理解是：AlarmDoor在概念本质上是Door，同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢？前面已经说过，abstract class在Java语言中表示一种继承关系，而继承关系在本质上是"is a"关系。所以对于Door这个概念，我们应该使用abstarct class方式来定义。另外，AlarmDoor又具有报警功能，说明它又能够完成报警概念中定义的行为，所以报警概念可以通过interface方式定义。如下所示： <br /><br />abstract class Door {<br />abstract void open();<br />abstract void close()；<br />}<br />interface Alarm {<br />void alarm();<br />}<br />class AlarmDoor extends Door implements Alarm {<br />void open() { … }<br />void close() { … }<br />void alarm() { … }<br />}<br /><br />这种实现方式基本上能够明确的反映出我们对于问题领域的理解，正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系，interface表示的是"like a"关系，大家在选择时可以作为一个依据，当然这是建立在对问题领域的理解上的，比如：如果我们认为AlarmDoor在概念本质上是报警器，同时又具有Door的功能，那么上述的定义方式就要反过来了。<br /><br />结论<br /><br />abstract class和interface是Java语言中的两种定义抽象类的方式，它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理，因为它们表现了概念间的不同的关系（虽然都能够实现需求的功能）。这其实也是语言的一种的惯用法，希望读者朋友能够细细体会。</font>
		</span>
		<br />
<img src ="http://www.blogjava.net/zhyiwww/aggbug/39444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-04-05 18:03 <a href="http://www.blogjava.net/zhyiwww/archive/2006/04/05/39444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Set中的元素为什么不允许重复</title><link>http://www.blogjava.net/zhyiwww/archive/2006/03/30/38193.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Thu, 30 Mar 2006 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/03/30/38193.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/38193.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/03/30/38193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/38193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/38193.html</trackback:ping><description><![CDATA[
		<h1 style="MARGIN: 17pt 0cm 16.5pt; TEXT-ALIGN: center" align="center">
				<span lang="EN-US">Set</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的元素为什么不允许重复</span>
		</h1>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>
				</span>
				<b>
						<span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 仿宋_GB2312; mso-bidi-font-size: 10.0pt">版权所有，转载请声明出处 </span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial; mso-bidi-font-size: 10.0pt; mso-fareast-font-family: 仿宋_GB2312">zhyiwww@163.com</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: 仿宋_GB2312; mso-bidi-font-size: 10.0pt">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了弄清楚这个问题</span>
				<span lang="EN-US">,</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我又看了一遍</span>
				<span lang="EN-US">Collection</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部分</span>
				<span lang="EN-US">,</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并且看了些其中的源码</span>
				<span lang="EN-US">,</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">觉得对其中的实现又明白了一点</span>
				<span lang="EN-US">,</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在说出来和大家共享</span>
				<span lang="EN-US">.</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们先看一下</span>
				<span lang="EN-US">Set</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的关系图：</span>
				<br />
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt" align="center">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<img height="350" alt="hashset.png" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/hashset.png" width="450" border="0" />
						<br />现在我们就从</span>
				<span lang="EN-US">Set</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">说起。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US">Set</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口为我们提供了一个</span>
				<span lang="EN-US">add()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，以让我们添加元素。所以我们看一下在其实现类</span>
				<span lang="EN-US">HashSet</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中是如何实现的呢？</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们看</span>
				<span lang="EN-US">HashSet</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span>
				<span lang="EN-US">add()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法实现；</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>public boolean add(</span>
				<span lang="EN-US" style="FONT-SIZE: 16pt; COLOR: purple; mso-bidi-font-size: 10.0pt">E o</span>
				<span lang="EN-US">) {</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>
						<span style="mso-tab-count: 1">       </span>return<span style="mso-spacerun: yes">  </span></span>
				<b>
						<u>
								<span lang="EN-US" style="FONT-SIZE: 15pt; COLOR: navy; mso-bidi-font-size: 10.0pt">map.put(o, PRESENT)==null;</span>
						</u>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">}</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你可能回问怎么回出来</span>
				<span lang="EN-US">map</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了呢？</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">Map</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">又是一个什么变量呢？</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们来看</span>
				<span lang="EN-US">map</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是在在哪定义的。原来，在</span>
				<span lang="EN-US">HashSet</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中定义了这样的两个变量：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: purple; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>private transient HashMap&lt;E,Object&gt; map;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: purple; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>private static final Object PRESENT = new Object();</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们再看一下上面的</span>
				<span lang="EN-US">add() </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<u>
						<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: purple; mso-bidi-font-size: 10.0pt">map.put(o, PRESENT)==null<o:p></o:p></span>
				</u>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实际执行的是</span>
				<span lang="EN-US">map</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方法，并且我们添加的对象是</span>
				<span lang="EN-US">map</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span>
				<span lang="EN-US">key,value</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是执行的同一个对象</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: purple; mso-bidi-font-size: 10.0pt">PRESENT.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<b>
						<span style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 隶书; mso-bidi-font-size: 10.0pt">因为<span lang="EN-US">map中的key是不允许重复的，所以set中的元素不能重复。<o:p></o:p></span></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 16pt; COLOR: red; FONT-FAMILY: 隶书; mso-bidi-font-size: 10.0pt"> <o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面我们再看一下，</span>
				<span lang="EN-US">map</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">又是如何保证其</span>
				<span lang="EN-US">key</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不重复的呢？</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt" align="center">
				<span lang="EN-US"> <img height="440" alt="hashmap.png" src="http://www.blogjava.net/images/blogjava_net/zhyiwww/hashmap.png" width="534" border="0" /></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在我们看一下</span>
				<span lang="EN-US">map</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span>
				<span lang="EN-US">put()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法的实现：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">HashMap</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现了</span>
				<span lang="EN-US">map</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在</span>
				<span lang="EN-US">HashMap</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中是这样实现的：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>public V put(K key, V value) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-tab-count: 1">      </span>K k = maskNull(key);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>int hash = hash(k);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>int i = indexFor(hash, table.length);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>for (Entry&lt;K,V&gt; e = table[i]; e != null; e = e.next) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">            </span>if (e.hash == hash &amp;&amp; eq(k, e.key)) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">                </span>V oldValue = e.value;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">                </span>e.value = value;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">                </span>e.recordAccess(this);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">                </span>return oldValue;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">            </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>modCount++;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>addEntry(hash, k, value, i);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>return null;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">我们我们按照方法的执行一步一步的来看一下，其实现的过程。</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">K k = maskNull(key);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">这一步是要判断当前的要添加的对象的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">key</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">是否为空，如果为空的话，那么就生成一个新的对象作为其</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">key</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">。实现如下：</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>static final Object NULL_KEY = new Object();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">     </span>* Returns internal representation for key. Use NULL_KEY if key is null.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>static &lt;T&gt; T maskNull(T key) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>return key == null ? (T)NULL_KEY : key;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">之后</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">int hash = hash(k);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">我们看一下</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">hash()</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">方法的实现：</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>static int hash(Object x) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>int h = x.hashCode();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>h += ~(h &lt;&lt; 9);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>h ^=<span style="mso-spacerun: yes">  </span>(h &gt;&gt;&gt; 14);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>h +=<span style="mso-spacerun: yes">  </span>(h &lt;&lt; 4);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>h ^=<span style="mso-spacerun: yes">  </span>(h &gt;&gt;&gt; 10);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>return h;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">这一步其实是要得到当前要添加对象的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">hashcode,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">方法中，首先通过</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">int h = x.hashCode()</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">取得了当前的要添加对象的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">hashcode,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">然后</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>h += ~(h &lt;&lt; 9);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>h ^=<span style="mso-spacerun: yes">  </span>(h &gt;&gt;&gt; 14);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>h +=<span style="mso-spacerun: yes">  </span>(h &lt;&lt; 4);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>h ^=<span style="mso-spacerun: yes">  </span>(h &gt;&gt;&gt; 10);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">生成一个新的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">hashcode.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">接着执行的是</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">（从此处开始，我理解的比较肤浅，请看到此出的朋友多多指点）</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">int i = indexFor(hash, table.length);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">这个方法是要</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">Returns index for hash code h.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>static int indexFor(int h, int length) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>return h &amp; (length-1);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-tab-count: 1">      </span>
				</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">下面就要根据</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">hashmap</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">中的元素逐个的比较，看是否相同，如果不同就回添加一个新的元素。是通过循环判断来实现的。</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>for (Entry&lt;K,V&gt; e = table[i]; e != null; e = e.next) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">            </span>if (e.hash == hash &amp;&amp; eq(k, e.key)) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">                </span>V oldValue = e.value;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">                </span>e.value = value;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">                </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 16pt; COLOR: red; mso-bidi-font-size: 10.0pt">e.recordAccess(this);<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<b>
						<span style="FONT-SIZE: 16pt; COLOR: navy; FONT-FAMILY: 黑体; mso-bidi-font-size: 10.0pt">这句我的理解是：在内存中的可以访问元素又多了一个。也就是说，添加之后，可以通过<span lang="EN-US">hashmap来访问此元素了。<o:p></o:p></span></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">         </span>
						<span style="mso-spacerun: yes">       </span>return oldValue;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">            </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">通过循环判断是否有完全相同的对象，包括</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">hashcode</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">和</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">value</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">值。如果已经存在就返回其值，如果不存在就执行一下操作。</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>modCount++;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>addEntry(hash, k, value, i);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>return null;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">对象不存在，首先修改</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">hashmap</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">的修改次数，即</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">modCount</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">加</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">1.</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">然后将对象添加到数组中。</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>void addEntry(int hash, K key, V value, int bucketIndex) {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-tab-count: 1">      </span>Entry&lt;K,V&gt; e = table[bucketIndex];<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>table[bucketIndex] = new Entry&lt;K,V&gt;(hash, key, value, e);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">        </span>if (size++ &gt;= threshold)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">            </span>resize(2 * table.length);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 28.5pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">仍然是数组，我们来看一下</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">在</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">hashmap</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">中用来存放对象的数组的定义：</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">   </span>
						<span style="mso-spacerun: yes"> </span>transient Entry[] table;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 28.5pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">至此，我想大家也许应该明白了，为什么在</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">set</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">中是不允许存放重复值的。</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt; TEXT-INDENT: 28.5pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">通过才的分析，我们可以看到，</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">map</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">的一些特征：</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 49.5pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 49.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">1.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">在</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">map</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">中也是不能存放完全相同的元素的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 49.5pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 49.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">2.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">如果你存入的对象的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">key</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">值已经存在的话，那么新的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">value</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">将会取代老的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">value</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">值，但是并不会添加新的元素进去。</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">我们可以通过一个测试程序来证明这一点：</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">  </span>public void mapTest() {<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>Map m = new HashMap();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>/**<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">     </span>* we<span style="mso-spacerun: yes">  </span>can<span style="mso-spacerun: yes">  </span>put<span style="mso-spacerun: yes">  </span>the<span style="mso-spacerun: yes">  </span>int<span style="mso-spacerun: yes">  </span>1 and the<span style="mso-spacerun: yes">  </span>value<span style="mso-spacerun: yes">  </span>1<span style="mso-spacerun: yes">  </span>into<span style="mso-spacerun: yes">  </span>the<span style="mso-spacerun: yes">  </span>map<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">     </span>* but<span style="mso-spacerun: yes">  </span>we<span style="mso-spacerun: yes">  </span>cannot<span style="mso-spacerun: yes">  </span>get<span style="mso-spacerun: yes">  </span>the<span style="mso-spacerun: yes">  </span>1 as<span style="mso-spacerun: yes">  </span>int<span style="mso-spacerun: yes">  </span>from the map<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">     </span>* why ?<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">     </span>* we<span style="mso-spacerun: yes">  </span>only<span style="mso-spacerun: yes">  </span>get<span style="mso-spacerun: yes">  </span>the<span style="mso-spacerun: yes">  </span>1<span style="mso-spacerun: yes">  </span>as<span style="mso-spacerun: yes">  </span>integer<span style="mso-spacerun: yes">  </span>from<span style="mso-spacerun: yes">  </span>the map,<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">     </span>* so<span style="mso-spacerun: yes">  </span>we<span style="mso-spacerun: yes">  </span>only<span style="mso-spacerun: yes">  </span>get the object<span style="mso-spacerun: yes">  </span>from the map,if we<span style="mso-spacerun: yes">  </span>put the<span style="mso-spacerun: yes">  </span>value<span style="mso-spacerun: yes">  </span>into<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">     </span>* the map,we<span style="mso-spacerun: yes">  </span>will get one<span style="mso-spacerun: yes">  </span>instance of<span style="mso-spacerun: yes">  </span>the wrapper<span style="mso-spacerun: yes">  </span>of<span style="mso-spacerun: yes">  </span>that<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">     </span>*/<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>m.put(1, 1);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>//int i = m.get(1);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>Integer i = (Integer) m.get(1);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>System.out.println(i);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>m.put(1, 1);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>m.put(1, 1);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>System.out.println("map<span style="mso-spacerun: yes">   </span>:<span style="mso-spacerun: yes">    </span>" + m);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>System.out.println("map<span style="mso-spacerun: yes">  </span>size<span style="mso-spacerun: yes">    </span>:<span style="mso-spacerun: yes">   </span>" + m.size());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>m.put(1, 2);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>System.out.println("map<span style="mso-spacerun: yes">   </span>:<span style="mso-spacerun: yes">    </span>" + m);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">    </span>System.out.println("map<span style="mso-spacerun: yes">  </span>size<span style="mso-spacerun: yes">    </span>:<span style="mso-spacerun: yes">   </span>" + m.size());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<span style="mso-spacerun: yes">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">运行的结果是：</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">map<span style="mso-spacerun: yes">   </span>:<span style="mso-spacerun: yes">    </span>{1=1}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">map<span style="mso-spacerun: yes">  </span>size<span style="mso-spacerun: yes">    </span>:<span style="mso-spacerun: yes">   </span>1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">map<span style="mso-spacerun: yes">   </span>:<span style="mso-spacerun: yes">    </span>{1=2}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">map<span style="mso-spacerun: yes">  </span>size<span style="mso-spacerun: yes">   </span><span style="mso-spacerun: yes"> </span>:<span style="mso-spacerun: yes">   </span>1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 12pt 0cm 0pt 28.5pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.0pt">希望此文能大家有所帮助。</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt; mso-bidi-font-size: 10.0pt">
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/zhyiwww/aggbug/38193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-03-30 09:41 <a href="http://www.blogjava.net/zhyiwww/archive/2006/03/30/38193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序设计的主要目标:将变动的事物和不变的事物隔离开来</title><link>http://www.blogjava.net/zhyiwww/archive/2006/03/29/38010.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 29 Mar 2006 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/03/29/38010.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/38010.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/03/29/38010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/38010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/38010.html</trackback:ping><description><![CDATA[<font face="隶书" color="#000080" size="4">将变动的事物和不变的事物隔离开来</font><img src ="http://www.blogjava.net/zhyiwww/aggbug/38010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-03-29 11:51 <a href="http://www.blogjava.net/zhyiwww/archive/2006/03/29/38010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个小错误--在方法中定义static 变量</title><link>http://www.blogjava.net/zhyiwww/archive/2006/03/29/37996.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 29 Mar 2006 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2006/03/29/37996.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/37996.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2006/03/29/37996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/37996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/37996.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;我们看下面的代码,这是scjp中的一道题:<br />是在方法中定义一个static变量,问程序运行会出现什么问题?<br />public void amethod() {<br />&nbsp;&nbsp;&nbsp; static int i=10;<br />&nbsp;&nbsp;&nbsp; System.out.println(i);<br />&nbsp; }<br />如果你曾实验过的话,就知道,如果你使用eclipse或jbuilder的话,那么,你的程序不用编译就回出现错误<br />Errors:&nbsp; illegal&nbsp; start of expression&nbsp; at&nbsp; line&nbsp; 69 .<br /><br /><img src ="http://www.blogjava.net/zhyiwww/aggbug/37996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2006-03-29 10:50 <a href="http://www.blogjava.net/zhyiwww/archive/2006/03/29/37996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>