<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>工作，学习，继续努力！</title>
    <description></description>
    <link>http://jonas.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>考考你的java 基础</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/200441" style="color:red;">http://jonas.javaeye.com/blog/200441</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>考考你的java 基础，求出三段代码的输出值<br /><br /><br />代码1：</p>
<pre name="code" class="java">public static void main(String[] args) {
	ArrayList&lt;Short&gt; s = new ArrayList&lt;Short&gt;();
  
		for(short i=0;i&lt;100;i++){
			s.add(i);
			s.remove(i-1);
		}
		System.out.println(s.size());
}</pre>
<p>代码2：</p>
<pre name="code" class="java">                 /**
	 * @param args
	 */
	public static void main(String[] args) {
		Set&lt;Short&gt; s = new HashSet&lt;Short&gt;();
		
		for(short i=0;i&lt;100;i++){
			s.add(i);
			s.remove(i-1);
		}
		System.out.println(s.size());
	}</pre>
<p>&nbsp;<br />代码3：</p>
<p>&nbsp;</p>
<pre name="code" class="java">public static void main(String[] args) {
	ArrayList&lt;Short&gt; s = new ArrayList&lt;Short&gt;();
		
		for(short i=0;i&lt;100;i++){
			s.add(i);
			s.remove((Object)(i-1));
		}
	System.out.println(s.size());
}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/200441#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 11:27:30 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/200441</link>
        <guid>http://jonas.javaeye.com/blog/200441</guid>
      </item>
      <item>
        <title>python script 打包EXE例子</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/190168" style="color:red;">http://jonas.javaeye.com/blog/190168</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近公司让把几个python srcript的打包成EXE，查了一些资料，完成打包，总结一下：<br />1.安装py2exe插件<br /><br />2. 新建一个setup.py 文件，文件内包含以下的代码<br />#!/usr/bin/python<br /># -*- coding: utf-8 -*-<br />#  py2exe file<br /># 1.install py2exe application<br /># 2.python setup.py py2exe<br /><br />from distutils.core import setup<br />import py2exe<br /><br />includes = ["Action","CryptoUtil", "Phone" ,"PerformanceTest","SecureChannel"]  <br />options = {"py2exe":  <br />             {   "compressed": 1,  <br />                 "optimize": 2,<br />                 "includes": includes,          <br />                 "bundle_files": 1<br />             }  <br />           }  <br />setup(     <br />     version = "0.1.0",  <br />     description = "Performance Test",  <br />     name = "Performance Test",  <br />     options = options,  <br />     zipfile=None,<br />     console=["PerformanceTest.py"],data_files=["pt.ini"],     <br />       <br />     )  <br />3. dos 下执行：python setup.py py2exe<br />4.执行成功后该文件夹会生成两个文件夹，查看dist文件夹即可看到exe文件
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/190168#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 13:42:13 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/190168</link>
        <guid>http://jonas.javaeye.com/blog/190168</guid>
      </item>
      <item>
        <title>经常看《程序员》杂志的进来聊聊</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/189740" style="color:red;">http://jonas.javaeye.com/blog/189740</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          程序员连续看了两年了，觉得现在做的越来越好了，各方面都有涉及，而且有很多牛人的文章，<br />大家觉得怎么样，说说看？
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/189740#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 15:17:29 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/189740</link>
        <guid>http://jonas.javaeye.com/blog/189740</guid>
      </item>
      <item>
        <title>IT人士群聚唱洒的讲究</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/169565" style="color:red;">http://jonas.javaeye.com/blog/169565</a>&nbsp;
          发表时间: 2008年03月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div id="BlogArticleDetail" style="font-size: 14px">大家喝的是啤酒，这时你入座了&hellip;&hellip; 
<br />你给自己倒了杯可乐，这叫低配置。 <br />你给自已倒了杯啤酒，这叫标准配置。 <br />你给自己倒了杯茶水，这茶的颜色还跟啤酒一样，这叫木马。 
<br />你给自己倒了杯可乐，还滴了几滴醋，不仅颜色跟啤酒一样，而且不冒热气还有泡泡，这叫超级木马。<br />你的同事给你倒了杯白酒，这叫推荐配置。 
<br />人到齐了，酒席开始了。 <br />你先一个人喝了一小口，这叫单元测试。 <br />你跟旁边的人说哥们咱们随意，这叫交叉测试。 
<br />但是他说不行，这杯要干了，这叫压力测试。 <br />于是你说那就大家一起来吧，这叫内部测试。 <br />这个时候boss向全场举杯了，这叫公开测试。 
<br />菜过三巡，你就不跟他们客气了。 <br />你向对面的人敬酒，这叫p2p. <br />你向对面的人敬酒，他回敬你，你又再敬他&hellip;&hellip;，这叫tcp. 
<br />你向一桌人挨个敬酒，这叫令牌环。 <br />你说只要是兄弟就干了这杯，这叫广播。 <br />可是你的上司jj听了不高兴了，只有兄弟么，罚酒三杯。这叫炸弹。 
<br />可是你的下级mm听了不高兴了，我喝一口，你喝一杯，这叫恶意攻击。 <br />有一个人过来向这桌敬酒，你说不行你先过了我这关，这叫防火墙。 
<br />你的小弟们过来敬你酒，这叫一对多。 <br />你是boss，所有人过来敬你酒，这叫服务器。 <br />酒是一样的，可是喝法是不同的。 
<br />你喝了一杯，boss喝了一口，这叫c#。 <br />你喝了一杯，mm喝了一口，这叫vb。 <br />你喝了一杯，你大哥喝了半杯，这叫c++。 
<br />你喝了半杯，你小弟喝了一杯，这叫汇编。 <br />你喝了一杯，你的搭档也喝了一杯，这叫c。 
<br />死就是一念的事，活着却是一辈子的事，所以活着比死更需要勇气 says: <br />酒是一样的，可是喝酒的人是不同的。 
<br />你越喝脸越红，这叫频繁分配释放资源。 <br />你越喝脸越白，这叫资源不释放。 <br />你已经醉了，却说我还能喝，叫做资源额度不足。 
<br />你明明能喝，却说我已经醉了，叫做资源保留。 <br />你喝一段时间就上厕所，这叫cache。 <br />酒过三巡，你也该活动活动了。 
<br />你一桌一桌的走，这叫轮巡。 <br />你突然看到某一桌的漂亮mm，走了过去，这叫优先级。 <br />你去了坐下来就不打算走了，这叫死循环。 
<br />你的老大举杯邀你过去，你只好过去，这叫激活事件。 <br />你向一桌敬酒，他们说不行不行我们都喝白的，于是你也喝白的，这叫本地化。 
<br />你向boss敬酒，可是boss被围了起来，你只能站在外圈，这叫排队。 <br />你终于到了内圈，小心翼翼的向前一步，这叫访问临界区。 
<br />你拍着boss的肩膀说哥们咱们喝一杯，这叫越界。 <br />你不知喝了几圈了，只会说两个字，干了，这叫udp。 
<br />可是还有人拿着酒瓶跑过来说，刚才都没跟你喝，这叫丢包。 <br />喝酒喝到最后的结果都一样 <br />你突然跑向厕所，这叫捕获异常。 
<br />你在厕所吐了，反而觉得状态不错，这叫清空内存。 <br />你在台面上吐了，觉得很惭愧，这叫程序异常。 
<br />你在boss面前吐了，觉得很害怕，这叫系统崩溃。 <br />你吐到了boss身上，只能索性晕倒了，这叫硬件休克 。 <br /></div>
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/169565#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 09 Mar 2008 21:36:49 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/169565</link>
        <guid>http://jonas.javaeye.com/blog/169565</guid>
      </item>
      <item>
        <title>一个不错的open source code website</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/166351" style="color:red;">http://jonas.javaeye.com/blog/166351</a>&nbsp;
          发表时间: 2008年03月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近发现的一个比较好的open source code website. 可以搜索到很多开源项目的源码，可以学到很多东东,本人在上面看到了很多python 的好代码. 还可以搜到你想要的代码和. 觉得比google 的 open source code好.<br />            <br />    Website: <a href="http://www.koders.com" target="_blank">http://www.koders.com</a><br />大家有空可以去看看.
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/166351#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 01 Mar 2008 11:27:02 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/166351</link>
        <guid>http://jonas.javaeye.com/blog/166351</guid>
      </item>
      <item>
        <title>python 知识小结</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/160639" style="color:red;">http://jonas.javaeye.com/blog/160639</a>&nbsp;
          发表时间: 2008年01月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转换字符集 为unicode字符集：unicode(shortname,“原字符集”,'ignore')<br /><br /><br />#得到文件的字符集<br />def detectCharset(file):<br />    fileCharSet = "GBK"<br />    detector = UniversalDetector()<br />    for line in open(file):<br />        detector.feed(line)<br />        if detector.done: break<br />    detector.close()<br />    if detector.result.has_key("encoding"):<br />        fileCharSet = detector.result["encoding"]<br />    return str(fileCharSet)<br />#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=   <br />得到系统的字符集<br />def getDefaultEncoding():<br />    if hasattr(sys.stdin, 'encoding') and sys.stdin.encoding:<br />        return sys.stdin.encoding<br />    else :<br />        import locale<br />        locale_name, console_encoding = locale.getdefaultlocale()<br />        return console_encoding<br />#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=<br />得到字符串的字符集<br />def chardetStr(s):<br />    testlist=chardet.detect(s)<br />    charset = testlist['encoding']<br />    if charset=="GB2312":<br />        charset="GBK"<br />    return charset  <br /><br /><br />python得到wav文件的播放时间<br />def getWAVDuration(filename):<br />    import wave<br />    w = wave.open(filename, "rb") <br />    nf = w.getnframes()<br />    w.close()<br />    dur = math.ceil((nf*1.0)/44100)<br />    return(int(dur))
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/160639#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 31 Jan 2008 09:17:05 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/160639</link>
        <guid>http://jonas.javaeye.com/blog/160639</guid>
      </item>
      <item>
        <title>关于系统需求分析的漫画</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/159482" style="color:red;">http://jonas.javaeye.com/blog/159482</a>&nbsp;
          发表时间: 2008年01月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天经理给team发了一封关于系统需求分析的漫画，觉得不错，给大家共享.<br /><img src="http://jonas.javaeye.com/topics/download/8bdbce98-4d20-3784-891b-a3d4f0970df3" />
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/159482#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 26 Jan 2008 10:41:33 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/159482</link>
        <guid>http://jonas.javaeye.com/blog/159482</guid>
      </item>
      <item>
        <title>aacPlus 简介</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/159206" style="color:red;">http://jonas.javaeye.com/blog/159206</a>&nbsp;
          发表时间: 2008年01月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="center"><span style="font-size: 24px"><u><strong>aacPlus 简介</strong></u></span></p><br />Translated by Wilco，WaveCN.com , 校对：苏信东 , 2005-11-25<br /><br />　　MPEG-4 accPlus是三种MPEG技术：高级音频编码（Advanced Audio Coding，简称AAC）、Coding Technologies的频带重现（Spectral Band Replication，简称SBR）和变量立体声（Parametric Stereo，简称PS）的结合。SBR是独特的带宽扩展技术，这使得音频编解码器可以在比原来少一半的比特率的条件下产生相同质量的结果。而PS技术则大大地提高了低比特率下立体声信号的二次编解码效率。<br />　　SBR和PS都是可在提供任意音频编 解码方案效率的同时保持向前向后兼容的方法。结果是， accPlus实现了在128 kbps以流方式或下载方式提供5.1多声道音频；在32 Kbps下提供接近CD音质的立体声；在24 kpbs仍能保持优秀的音质；即使在低于16 kbps单声道时，也能为混合的内容（即包含音乐和语音的内容）保持良好的音质。如此高水平的效率推动了移动和数字广播领域的新应用的出现。<br /><br /><strong>特性</strong><br />　　● 真正的超集（Superset）架构<br />　　● 支持包括5.1、7.1甚至总数达48声道的多声道支持<br />　　● 为移动应用预置错误隐蔽功能<br />　　● 最低在48 kbps仍可得到CD音质的立体声<br />　　● 在32 kbps仍可得到接近CD音质的立体声<br />　　● 最低至24 kbps仍可得到优秀音质的 立体声<br />　　● 广阔的可利用的音频带宽<br />　　● 最低至8 kbps单声道的优化的语音或语音/音乐的混合内容<br />　　● 适用于ISO/IEC 14496-3，包括Amd.1:2003，Amd.2:2004和所有勘误表。<br /><br /><strong>aacPlus 编解码器的家族成员</strong><br />　　aacPlus是最新的MPEG-4 音频技术。aacPlus v1是AAC和SBR的结合，在MPEG-4 部分（HE AAC）被标准化为高效（High-Efficiency）原形。aacPlus v2建立在aacPlus v1巨大的成功历史上，并增值了所有的对立体声信号的最高压缩效果有着mission-critical要求的领域。因为 aacPlus v1是AAC的扩展，所以aacPlus v2 是accPlus v1的真正的超集。随着在MPEG中加入了参量立体声（Parametric Stereo），aacPlus v2是艺术级的低比特率的开放标准的音频编解码器。<br /><a href="http://blog.21softs.com/attachment/1159776170_0.gif" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" src="http://blog.21softs.com/attachment/1159776170_0.gif" border="0" alt="点击在新窗口中浏览此图片" /></a><br /><br /><strong>标准化</strong><br />　　aacPlus 已被许多国际性标准化团体广泛地标准化了。accPlus v2被3GPP （3G合作项目）指定为高质量的音频编解码器，它所有的组成部分都已经成为了MPEG-4的一部分。accPlus v1是由3GPP2、互联网流媒体联盟（Internet Streaming Media Alliance，简称ISMA）、数字视频广播项目（Digital Video Broadcasting，简称DVB）、 DVD论坛、世界数字广播集团（Digital Radio Mondiale） 以及很多其他的团体共同标准化的。作为整合于MPEG -4音频中的一部分，对于新的在MPEG-4 第十部分被标准化的H.264/AVC视频编解码器，accPlus是 一种理想的能与其进行共同部署的选择。<br /><br /><strong>示范应用</strong><br />　　● 3G、WiFi音频和A/V服务<br />　　● 流式或下载方式的互联网音频<br />　　● 数字无线电<br />　　● 数字式卫星广播和有线广播<br />　　● 便携式播放器<br /><br /><strong>独立的aacPlus质量评估</strong><br />　　aacPlus v2的价值已经通过独立的第三方检测被清晰地论证了。在由3GPP指导下进行的仔细的双盲收听测试中，accPlus v2即使在18 kbps的低比特率条件下也向其竞争对手证明了它的优越性。<br /><a href="http://blog.21softs.com/attachment/1159776170_1.gif" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" src="http://blog.21softs.com/attachment/1159776170_1.gif" border="0" alt="点击在新窗口中浏览此图片" /></a><br /><br />　　accPlus v1已在多个第三方所做的测试中被评估。这些第三方包括有Digital Radio Mondiale、MPEG和欧洲广播联盟（European Broadcasting Union）。aacPlus v1在评比中做得比其他信号编解码器都要好。以下是欧洲广播联盟在48 kbps立体声所做测试的结果图表。可以下载完整的&quot;<a href="http://blog.21softs.com/www.ebu.ch/CMSimages/en/tec_doc_t3296_tcm6-10497.pdf" target="_blank"> EBU低比特率音频编解码器主观收听测试（pdf格式，英文）</a>&quot;。<br /><br /><a href="http://blog.21softs.com/attachment/1159776170_2.gif" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" src="http://blog.21softs.com/attachment/1159776170_2.gif" border="0" alt="点击在新窗口中浏览此图片" /></a><br /><br /><strong>实用性</strong><br />　　适用于各种各样平台的软件开发工具(SDK)和定点固件参考ANSI-C 源代码包 (FFR)均可通过Coding Technologies及其合伙人得到。Coding Technologies还提供了定制的移植服务、培训、开发支持。详细信息可联系info@codingtechnologies.com。<br /><br /><strong>支持的平台</strong><br />　　● 编码器：Win32、Linux、MacOS X、TI、Motorola及其他DSP。<br />　　● 解码器：Win32、Linux、MacOS X、ARM、TI、NEC、Stmicroelectronics、Trimedia及其他DSP。<br /><br />　　想了解详情，请通过e-mail或者phone联系<a href="http://www.codingtechnologies.com/company/contact.htm" target="_blank">Coding Technologies</a>。<br /><br />Translated by Wilco，WaveCN.com , 校对：苏信东 , 2005-11-25<br /><br />　　MPEG-4 accPlus是三种MPEG技术：高级音频编码（Advanced Audio Coding，简称AAC）、Coding Technologies的频带重现（Spectral Band Replication，简称SBR）和变量立体声（Parametric Stereo，简称PS）的结合。SBR是独特的带宽扩展技术，这使得音频编解码器可以在比原来少一半的比特率的条件下产生相同质量的结果。而PS技术则大大地提高了低比特率下立体声信号的二次编解码效率。<br />　　SBR和PS都是可在提供任意音频编 解码方案效率的同时保持向前向后兼容的方法。结果是， accPlus实现了在128 kbps以流方式或下载方式提供5.1多声道音频；在32 Kbps下提供接近CD音质的立体声；在24 kpbs仍能保持优秀的音质；即使在低于16 kbps单声道时，也能为混合的内容（即包含音乐和语音的内容）保持良好的音质。如此高水平的效率推动了移动和数字广播领域的新应用的出现。<br /><br /><strong>特性</strong><br />　　● 真正的超集（Superset）架构<br />　　● 支持包括5.1、7.1甚至总数达48声道的多声道支持<br />　　● 为移动应用预置错误隐蔽功能<br />　　● 最低在48 kbps仍可得到CD音质的立体声<br />　　● 在32 kbps仍可得到接近CD音质的立体声<br />　　● 最低至24 kbps仍可得到优秀音质的 立体声<br />　　● 广阔的可利用的音频带宽<br />　　● 最低至8 kbps单声道的优化的语音或语音/音乐的混合内容<br />　　● 适用于ISO/IEC 14496-3，包括Amd.1:2003，Amd.2:2004和所有勘误表。<br /><br /><strong>aacPlus 编解码器的家族成员</strong><br />　　aacPlus是最新的MPEG-4 音频技术。aacPlus v1是AAC和SBR的结合，在MPEG-4 部分（HE AAC）被标准化为高效（High-Efficiency）原形。aacPlus v2建立在aacPlus v1巨大的成功历史上，并增值了所有的对立体声信号的最高压缩效果有着mission-critical要求的领域。因为 aacPlus v1是AAC的扩展，所以aacPlus v2 是accPlus v1的真正的超集。随着在MPEG中加入了参量立体声（Parametric Stereo），aacPlus v2是艺术级的低比特率的开放标准的音频编解码器。<br /><a href="http://blog.21softs.com/attachment/1159776170_0.gif" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" src="http://blog.21softs.com/attachment/1159776170_0.gif" border="0" alt="点击在新窗口中浏览此图片" /></a><br /><br /><strong>标准化</strong><br />　　aacPlus 已被许多国际性标准化团体广泛地标准化了。accPlus v2被3GPP （3G合作项目）指定为高质量的音频编解码器，它所有的组成部分都已经成为了MPEG-4的一部分。accPlus v1是由3GPP2、互联网流媒体联盟（Internet Streaming Media Alliance，简称ISMA）、数字视频广播项目（Digital Video Broadcasting，简称DVB）、 DVD论坛、世界数字广播集团（Digital Radio Mondiale） 以及很多其他的团体共同标准化的。作为整合于MPEG -4音频中的一部分，对于新的在MPEG-4 第十部分被标准化的H.264/AVC视频编解码器，accPlus是 一种理想的能与其进行共同部署的选择。<br /><br /><strong>示范应用</strong><br />　　● 3G、WiFi音频和A/V服务<br />　　● 流式或下载方式的互联网音频<br />　　● 数字无线电<br />　　● 数字式卫星广播和有线广播<br />　　● 便携式播放器<br /><br /><strong>独立的aacPlus质量评估</strong><br />　　aacPlus v2的价值已经通过独立的第三方检测被清晰地论证了。在由3GPP指导下进行的仔细的双盲收听测试中，accPlus v2即使在18 kbps的低比特率条件下也向其竞争对手证明了它的优越性。<br /><a href="http://blog.21softs.com/attachment/1159776170_1.gif" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" src="http://blog.21softs.com/attachment/1159776170_1.gif" border="0" alt="点击在新窗口中浏览此图片" /></a><br /><br />　　accPlus v1已在多个第三方所做的测试中被评估。这些第三方包括有Digital Radio Mondiale、MPEG和欧洲广播联盟（European Broadcasting Union）。aacPlus v1在评比中做得比其他信号编解码器都要好。以下是欧洲广播联盟在48 kbps立体声所做测试的结果图表。可以下载完整的&quot;<a href="http://blog.21softs.com/www.ebu.ch/CMSimages/en/tec_doc_t3296_tcm6-10497.pdf" target="_blank"> EBU低比特率音频编解码器主观收听测试（pdf格式，英文）</a>&quot;。<br /><br /><a href="http://blog.21softs.com/attachment/1159776170_2.gif" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" src="http://blog.21softs.com/attachment/1159776170_2.gif" border="0" alt="点击在新窗口中浏览此图片" /></a><br /><br /><strong>实用性</strong><br />　　适用于各种各样平台的软件开发工具(SDK)和定点固件参考ANSI-C 源代码包 (FFR)均可通过Coding Technologies及其合伙人得到。Coding Technologies还提供了定制的移植服务、培训、开发支持。<br /><br /><strong>支持的平台</strong><br />　　● 编码器：Win32、Linux、MacOS X、TI、Motorola及其他DSP。<br />　　● 解码器：Win32、Linux、MacOS X、ARM、TI、NEC、Stmicroelectronics、Trimedia及其他DSP。
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/159206#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Jan 2008 22:22:32 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/159206</link>
        <guid>http://jonas.javaeye.com/blog/159206</guid>
      </item>
      <item>
        <title>HTTP 协议资料共享</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/157902" style="color:red;">http://jonas.javaeye.com/blog/157902</a>&nbsp;
          发表时间: 2008年01月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近在给公司做项目中用到了client 和Server端的交互，用到JAVA分析了HTTP协议. 因为手机客户端，移动计费系统和自己的服务器需要交互,做设计时需要了解HTTP 协议和 wap规范.在网上google一下好多资料, 把RFC2616协议好好看了一下,网上有中文版和英文版的.还发现了一些BLOG上有很多好的资料.<br /><br />W3C :    <a href="http://www.w3.org/Protocols/" target="_blank">http://www.w3.org/Protocols/</a>          ------权威<br />mrfinger 的BLOG : <a href="http://hi.baidu.com/getbo/" target="_blank">http://hi.baidu.com/getbo/</a>  -----中文的关于HTTP协议比较多和全<br /><br />另外把搜集的 RFC2616 中文版和英文版共享大家
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/157902#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Jan 2008 22:32:16 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/157902</link>
        <guid>http://jonas.javaeye.com/blog/157902</guid>
      </item>
      <item>
        <title>关于集合框架的思考 (转)</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/156758" style="color:red;">http://jonas.javaeye.com/blog/156758</a>&nbsp;
          发表时间: 2008年01月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天看到一篇文章，觉得写的不错，自己了收藏起来。 <br />转自：http://www.blogjava.net/jungleford/archive/2005/04/02/2759.html <br /><br />对于Java集合框架（Java Collections Framework，JCF），Java玩家大概都不会陌生，在C++里面相似的概念是标准模板库（Standard Template Library，STL），主要是对一些数据结构和相关算法的封装。前段时间在J2SE版看到一个关于Java集合框架的问题，当时re了一下，简单解释了一些的概念，考虑到这是一个Java初学者将会经常接触的工具，所以有了以下的一些文字。主要是参考了IBM developerWorks上的一篇教程，它可能解释得更加清晰，这里算是浓缩了一下吧，真正的来龙去脉可以看看JDK文档里的&ldquo;The Collections Framework&rdquo;，说明更为详细。 <br /><br />问题的源头 <br /><br />集合：对象的容器与数据结构 <br />回忆一下我们在程序设计里头可能会面对一些什么，无非是两类：基本类型和复合类型，后者常见的组织方式就是类。和基本类型不同，类对象通常是需要以动态方式分配的，譬如在内存的堆空间里new一个对象，这个我们一写OO的程序就必然会用到。同时我们面对的不仅仅是单个的基本类型或对象，对多个这样的数据我们通常采用的组织方式是什么？不错，是数组，这是伴随程序设计的一个古老概念。数组的优点显而易见，像根据下标检索元素这样的操作不费吹灰之力，但缺点也很明显：空间固定而不能动态增长（像Java这样的强类型语言对数组越界是及其敏感的），插入或删除元素比较费劲。因此数组不是解决一切集合问题的方便工具。我们可能需要一些新的工具，研究这些工具常常就是研究数据结构，特别的，数组本身就是一种线性有序的数据结构。 <br />数据结构的数学基础是集合论，为什么这么说呢？上面倒??衷谖颐且?芯康牟皇堑ジ龅幕?纠嘈突蚨韵螅?喔龆韵蟮恼?宀痪褪羌?下穑看?O的角度上看，集合也是一种对象，但它是一种特殊的对象：对象的容器（注意，我们这里没有继续讨论基本类型的集合，因为基本类型和存储分配方式与对象有着本质的差别）。集合论的一个根本问题就是：给定一个元素，集合必须能够回答该元素是或者不是属于这个集合。还有一个问题也很重要，就是：如果元素是属于一个集合，那该元素在集合中的地位应该是唯一的，或者说它是唯一确定的。当然还有其它问题，譬如查找、遍历、排序等等，这和具体的集合类型相关，后面将会讲到。 <br /><br />无序集、有序集、映射 <br />谈到集合的类型，我们在高中所学的集合概念是其中的一种，叫做&ldquo;无序集&rdquo;，也就是说集合的各个元素都是平等的，没有先后的区别，于是在无序集当中就决不允许出现一模一样的元素，否则当取到这个元素的时候就不知道应该取哪一个，这就违反了上面的&ldquo;唯一确定&rdquo;原则。 <br />等到我们上了大学，开始知道了另一种集合类型，叫做&ldquo;有序集&rdquo;（或者叫&ldquo;线性表&rdquo;，区别于以后碰到的像&ldquo;树&rdquo;，&ldquo;图&rdquo;这样的非线性的数据结构），如果是计算机专业的，大概学过离散数学当中的&ldquo;代数结构&rdquo;，那你就更清楚的知道，&ldquo;有序集&rdquo;其实是一种&ldquo;二元关系&rdquo;，确切的说是&ldquo;偏序关系&rdquo;，它是可以包含相同元素的，因为两个的相同元素的&ldquo;序号&rdquo;可以不同，这样根据&ldquo;序号&rdquo;仍可以&ldquo;唯一确定&rdquo;一个元素，数组就是一种有序集，有序集的另一个特点就是任意两个元素可以确定他们的顺序。 <br />无序集，有序集，难道还有第三种可能？呵呵，它还是出现在我们的高中代数课本里，叫做&ldquo;映射&rdquo;。映射也是集合？其实自从康托尔以来，集合论就认为&ldquo;万物皆集合&rdquo;（但也就是这个断言导致了集合论以后的尴尬境地，有兴趣可以看看罗素或哥德尔的一些结论，或google&ldquo;集合论 悖论&rdquo;）。映射其实是一种&ldquo;元素对&rdquo;的集合，就像f(a)=b, f(c)=d, ...等效于集合（无序集）{(a, b), (c, d), ...}，在&ldquo;映射&rdquo;中可以看作是(原象, 象)的集合，换一种说法就是(关键字key, 值value)的集合。所以我们可以在笛卡儿正交坐标平面上画出漂亮的函数图像，因为在集合论看来，函数（映射）就是二维平面上的一个个点，明白了？这样一来上面的&ldquo;有序集&rdquo;也好理解了，偏序关系a&gt;b&gt;c&gt;d&gt;...（不知道&ldquo;偏序关系&rdquo;就把它们看作是数组x[1]=a, x[2]=b, x[3]=c, x[4]=d ...好了）等效于无序集{(1, a), (2, b), (3, c), (4, d), ...}，于是乎，所有的集合都等效于无序集！所以高中只教了我们一种集合，呵呵&hellip;&hellip; <br /><br />JCF的全家福 <br /><br />好啦好啦，这些我们都知道，又不是在上数学课，说了这么多废话，怎么还没扯到正题上来？JCF的影子我还没看见呢！列位看官别急，这就给您道来。其实上面的概念对理解JCF非常重要。 <br />JCF是个颇有点规模的家族，看看它的类层次关系图就知道了，下面这张图（图1）摘自著名的Thinking in Java： <br /><br /><img src="http://www.blogjava.net/images/blogjava_net/jungleford/924/o_collection.gif" alt="" /> <br />图1 JCF层次结构 <br /><br />哇，这么多接口和类，真有点让人无从下手的感觉。其实我们真正需要记住的只是这么一个超超easy的结构（图2）： <br /><img src="http://www.blogjava.net/images/blogjava_net/jungleford/924/o_collection1.gif" alt="" /> <br /><br />图2 <br /><br />这张图看起来舒服多了吧？但它又能说明什么问题呢？它怎么就能够把握整个JCF呢？我们把Collection接口置于最顶上，意思是想说：Collection其实是整个JCF家族中的&ldquo;祖宗&rdquo;，几乎所有的JCF成员都源自该接口，或者和它有密切的关系，Collection提供关于集合的一些通用操作的接口，包括插入（add()方法）、删除（remove()方法）、判断一个元素是不是其成员（contains()方法）、遍历（iterator()方法）等等。注意了，前面的&ldquo;废话&rdquo;在这里将得到体现：Set接口体现的是&ldquo;无序集&rdquo;的概念，它是不允许有重复元素出现的；List接口代表&ldquo;有序集&rdquo;；而Map接口则是&ldquo;映射&rdquo;（在早期的Java版本中并不叫Map，我们在后面会看到），其实Map.Entry接口就是代表一个&ldquo;元素对&rdquo;我们可以通过Map的entrySet()方法得到这样一个由&ldquo;元素对&rdquo;组成的Set对象。我们注意到Set和List都是从&ldquo;祖宗&rdquo;Collection派生的，而Map不是，毕竟对一对元素的操作与对单个元素的操作还是有区别的，但是如果你仔细对照一下Collection和Map的源代码，以及它们的直接后代AbstractCollection和AbstractMap的源代码，你将会发现很多相似的地方，所以我们仍然可以把Map看成是和Collection有着血缘关系的接口，而和Set，List一起处于并列的位置。 <br />&nbsp;&nbsp;&nbsp;&nbsp; 有了&ldquo;无序集&rdquo;，&ldquo;有序集&rdquo;和&ldquo;映射&rdquo;，我们就可以定义各种各样的抽象数据结构了，譬如图1所示的向量，链表，堆栈，哈希表，平衡二叉树等。但我们需要记住的，仅仅是图2，置于其它的成员，在用到的时候查一下API手册不就行了？不过一般初学者还是比较容易用到一些类，像Vector、ArrayList、HashMap<span style="font-size: x-small">，我在这里列了一张表，显示了常见的JCF成员及其关系： </span><table cellspacing="0" border="1" cellpadding="0"><tbody><tr><td valign="top" width="484" colspan="5"><p align="center"><span style="font-size: x-small; font-family: Verdana">集合框架的祖宗： </span><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">Collection</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="118"><p align="center"><span style="font-size: x-small; font-family: Verdana">历史集合 </span></p></td><td valign="top" width="398" colspan="4"><p align="center"><span style="font-size: x-small; font-family: Verdana">新集合 </span></p></td></tr><tr><td valign="top" width="195" colspan="2"><p align="center"><span style="font-size: x-small; font-family: Verdana">无序集： </span><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Set.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">Set</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="289" colspan="3"><p align="center"><span style="font-size: x-small; font-family: Verdana">有序集： </span><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">List</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="118"><p align="center"><span style="font-size: x-small; font-family: Verdana">映射：</span><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Dictionary.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">Dictionary</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="398" colspan="4"><p align="center"><span style="font-size: x-small; font-family: Verdana">映射：</span><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">Map</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td></tr><tr><td rowspan="2" valign="top" width="101"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractSet.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">AbstractSet</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td rowspan="2" valign="top" width="94"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/SortedSet.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">SortedSet</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="147" colspan="2"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractList.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">AbstractList</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="143"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractSequentialList.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">AbstractSequentialList</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td rowspan="3" valign="top" width="118"><p align="center"><br /><br /><br /><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">Hashtable</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="321" colspan="3"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/AbstractMap.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">AbstractMap</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="77"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/SortedMap.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">SortedMap</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td></tr><tr><td valign="top" width="78"><p align="center"><span style="font-size: x-small; font-family: Verdana">历史集合 </span></p></td><td valign="top" width="69"><p align="center"><span style="font-size: x-small; font-family: Verdana">新集合 </span></p></td><td rowspan="2" valign="top" width="143"><p align="center"><br /><br /><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedList.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">LinkedList</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td rowspan="2" valign="top" width="100"><p align="center"><br /><br /><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/WeakHashMap.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">WeakHashMap</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td rowspan="2" valign="top" width="112"><p align="center"><br /><br /><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/IdentityHashMap.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">IdentityHashMap</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td rowspan="2" valign="top" width="109"><p align="center"><br /><br /><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">HashMap</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td rowspan="2" valign="top" width="77"><p align="center"><br /><br /><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeMap.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">TreeMap</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td></tr><tr><td valign="top" width="101"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashSet.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">HashSet</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="94"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeSet.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">TreeSet</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="78"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">Vector</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="69"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">ArrayList</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td></tr><tr><td valign="top" width="101"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedHashSet.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">LinkedHashSet</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="94"><span style="font-size: x-small; font-family: Verdana">&nbsp;</span></td><td valign="top" width="78"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Stack.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">Stack</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="69"><span style="font-size: x-small; font-family: Verdana">&nbsp;</span></td><td valign="top" width="143"><span style="font-size: x-small; font-family: Verdana">&nbsp;</span></td><td valign="top" width="118"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Properties.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">Properties</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="100"><span style="font-size: x-small; font-family: Verdana">&nbsp;</span></td><td valign="top" width="112"><span style="font-size: x-small; font-family: Verdana">&nbsp;</span></td><td valign="top" width="109"><p align="center"><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedHashMap.html" target="_blank"><span style="font-size: x-small; font-family: Verdana">LinkedHashMap</span></a><span style="font-size: x-small; font-family: Verdana"> </span></p></td><td valign="top" width="77"><span style="font-size: x-small; font-family: Verdana">&nbsp;</span></td></tr></tbody></table><br />&nbsp; <p><br />可能有的概念您还不是太了解，譬如什么叫&ldquo;历史集合&rdquo;，Hashtable、HashMap、TreeMap三者之间有什么区别和联系，怎样实现对一个特定集合的快速遍历、元素查找或者排序，没关系，我们在下面将逐一进行研究。 <br /><br />细节考虑：目标与效率 <br /><br />有了JCF的层次还不够，重要的是对集合所容纳的对象的具体操作，以前我们学数据结构的时候可能老师总会让你计算一个算法的时间复杂度，可能你会对这个O(f(n))很不耐烦，但事实上算法效率是一个重要的因素。 <br /><br />1. 侧重点：遍历 vs. 查找 <br />对集合的有两个主要的应用：我需要知道集合有哪些元素；根据条件找到一个特定的元素。在算法上通常称为&ldquo;遍历&rdquo;和&ldquo;查找&rdquo;。不要以为我们生活中不常用哦！譬如CCTV的&ldquo;幸运52&rdquo;里面，李咏让参赛者报出一款PDA的准确价位，他会怎么做？&ldquo;2000&rdquo;&ldquo;高了&rdquo;&ldquo;1000&rdquo;&ldquo;低了&rdquo;&ldquo;1500&rdquo;&ldquo;低了&rdquo;&hellip;&hellip;直到答对为止。可能有很多人都会选择这个策略，无论他是不是计算机专业出身的，也不知道他是不是了解&ldquo;数据结构&rdquo;和&ldquo;折半查找&rdquo;，更不用说他是不是知道还有比在无初始代价下O(log n)的时间复杂度更快的算法了，但我们经常会自然而然地用这样的方法，这和一个人的行业无关，除非这个人的rp超强，呵呵&hellip;&hellip; <br />又讲了一堆题外话了，遍历和修改似乎是一对矛盾，一个可以高效率插入删除元素的数据结构通常遍历的性能并不是最优。于是JCF在这里根据用户的目标实现了两种定制的数据结构：哈希表（包括HashSet和HashMap）和平衡二叉树（包括TreeSet和TreeMap）。由于可排序性是一种独特的要求，所以引入了SortedSet和SortedMap，它们分别是AbstractSet和AbstractMap的子接口，而TreeSet和TreeMap又分别是他们的一种实现。熟悉数据结构的人可能比较了解，哈希表在进行插入、删除、查找这样的操作是很快的，其时间复杂度是常数级O(1)；平衡二叉树虽然插入、删除操作比较麻烦（需要O(log n)的代价），但进行遍历和排序却很快。选择完全在于用户的侧重点，但由于类型转换的方便性，通常我们用哈希表构造一个集合以后，再把它转换成相应的树集进行遍历，以获得较好的效果。 <br /><br />Set set1 = new HashSet(); <br />set1.add(elem1);// 通过插入元素构造集合 <br />set1.add(elem2); <br />set1.add(elem3); <br />Set set2 = new TreeSet(set); <br />Iterator all = set2.iterator(); <br />while (all.hasNext()) <br />{// 遍历集合 <br />all.next(); <br />... <br />} <br /><br />2. 历史实现 vs. 新实现 <br />历史实现（Legacy Implementations）是JCF的一个术语，准确的意义不是很清楚，但大致可以认为在Java 2（JDK 1.2）出现以前的老版本中JCF的一个雏形框架。在Java 2以后，JCF才开始完善健壮起来，新实现中出现了一些新的类用于替代老版本中的成员，但由于种种原因，老版本中很多类都代表了传统数据结构的精髓部分，以及一些安全原因，所以仍然被我们使用着。 <br /><br />Enumeration vs. Iterator <br />Enumeration是一个传统的集合遍历工具，在新的JCF中使用的是Iterator，Iterator同样具有遍历功能，还包含一个remove()方法来删除当前得到的元素。 <br /><br />Dictionary vs. Map <br />Dictionary是一个现在已经被标记为deprecated的类，实现了老版本中的映射功能，现在已经完全被Map取代。它们的区别是：Dictionary不key和value不能为null，但Map却允许空的关键字和值，这一点直接影响到它们的后代：Hashtable和HashMap。 <br /><br />Vector vs. ArrayList <br />Vector和ArrayList是数组在JCF中的体现，还记得前面讲过的数组的缺点么？Vector和ArrayList就是一种可以动态增长的数组。Vector是历史实现，它和ArrayList的主要区别在于，Vector是同步集合（或者说是线程安全的），但ArrayList并不是同步的，由于同步需要花一定的代价，所以ArrayList看起来要比Vector的存取访问效率更高。关于同步我们下面还将要谈到。 <br /><br />Hashtable vs. HashMap <br />Hashtable是Dictionary的子类，属于历史实现，而HashMap是Map的子类，是新实现。它们的区别除了上面所说的key和value是否可以为空之外，也有同步的差别，Hashtable是同步的，但HashMap不是。不过不要因为Hashtable是&ldquo;老前辈&rdquo;而瞧不起它哦，它的一个著名的子类Properties我们可是经常会用到的。 <br /><br />3. 同步 vs. 不同步 <br />从上面的描述中我们似乎可以得出这么一个印象：历史实现好像都是同步的，但新实现中却没有。需要同步操作的理由是，可能存在多个线程对同一个集合进行操作的情况：譬如一个线程正在对某集合进行遍历，但与此同时，另一个线程又在对该集合进行插入或删除，那么第一个线程的遍历结果将是不可预测的，对于同步集合，它将会抛出一个ConcurrentModificationException异常，JCF把这种机制成为&ldquo;fail-fast&rdquo;。我们对比一下Vector和ArrayList的源代码就可以发现Vector的很多方法都是有synchronized关键字修饰的，但ArrayList没有。 <br /><br />4. 容易遗忘的工具：Collections和Arrays <br />在图1中右下角落里有两个类叫做Collections（注意，不是Collection！）和Arrays，这是JCF里面功能强大的工具，但初学者往往会忽视。按JCF文档的说法，这两个类提供了封装器实现（Wrapper Implementations）、数据结构算法和数组相关的应用。 <br />想必大家不会忘记上面谈到的&ldquo;折半查找&rdquo;、&ldquo;排序&rdquo;等经典算法吧，Collections类提供了丰富的静态方法帮助我们轻松完成这些在数据结构课上烦人的工作： <br /><br />binarySearch：折半查找。 <br />sort：排序，这里是一种类似于快速排序的方法，效率仍然是O(n * log n)，但却是一种稳定的排序方法。 <br />reverse：将线性表进行逆序操作，这个可是从前数据结构的经典考题哦！ <br />rotate：以某个元素为轴心将线性表&ldquo;旋转&rdquo;??哇，这个功能太酷了！ <br />swap：交换一个线性表中两个元素的位置。 <br />&hellip;&hellip; <br /><br />Collections还有一个重要功能就是&ldquo;封装器&rdquo;（Wrapper），它提供了一些方法可以把一个集合转换成一个特殊的集合： <br /><br />unmodifiableXXX：转换成只读集合，这里XXX代表六种基本集合接口：Collection、List、Map、Set、SortedMap和SortedSet。如果你对只读集合进行插入删除操作，将会抛出UnsupportedOperationException异常。 <br />synchronizedXXX：转换成同步集合。 <br />singleton：创建一个仅有一个元素的集合，这里singleton生成的是单元素Set，singletonList和singletonMap分别生成单元素的List和Map。 <br />空集：由Collections的静态属性EMPTY_SET、EMPTY_LIST和EMPTY_MAP表示。 <br /><br />此外，我们知道把集合转换成对象数组可以用Collection的toArray()方法，我们也可以方便地把一个对象数组转换成一个线性表（可不要告诉我你是一个一个地add哦）：Arrays.asList()。 <br /><br />5. 泛型 <br />目前我们了解的JCF的一个重要特征是：所有加入到集合当中的对象都将在表面上失去它们自己的特性，而看上去仅仅只是一个Object对象而已，除非你把它强制类型转换成它们原来的对象。这一点很自然，集合嘛，对象的容器，它容纳的是各种各样的对象，而不仅仅是某种特定类型的对象。J2SE 5.0出现以后，JCF开始引入泛型的特性，譬如我们经常碰到这样的应用，就是把集合转换成特定的数组，虽然Collection有toArray()的方法，但可惜的是，这个数组的所有元素都是Object类型的，我们通常的做法是用一个for循环把数组的每个元素都进行强制类型转换，虽然可行，但看上去很笨拙，如果有了泛型，我们就可以预先指定要得到的类型，然后一次toArray就可以得到我们期望的数组，里面的元素全部都是指定类型了。惭愧的是，我对5.0还不是太了解，具体可以参考J2SE 5.0的JCF文档。 <br /><br />小结 <br /><br />我这里走马观花一样把JCF的一些主要概念罗嗦了一下，Java的老手们可能比较厌烦，新手们可能更觉得像回顾了一下高中的数学课和大学的数据结构，呵呵。这只是一个小小的例子，可见基础知识对现实当中的应用还是蛮有指导意义的。大师们看数学，觉得那是很唯美很艺术的一样东西，西方一直都把数学区别于其它自然科学，而认为它更靠近于哲学，像我等这样整天还在为找工作烦得要死的俗人还是没法入道啊，sigh&hellip;&hellip; </p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/156758#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jan 2008 22:42:24 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/156758</link>
        <guid>http://jonas.javaeye.com/blog/156758</guid>
      </item>
      <item>
        <title>Eclipse 插件集成</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/143310" style="color:red;">http://jonas.javaeye.com/blog/143310</a>&nbsp;
          发表时间: 2007年11月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近在搞JAVA和python， 可是eclipse 老是出现这样那样的问题，今天没什么事，从网上把eclipse 3.3&nbsp;，myeclipse6.0和一些插件重新搞了一个最新的开发工具。集成完成一看500多M。不过我电脑上跑的还是满好的。把一些插件共享一些：</p><p><span style="font-family: Arial">下载最新的eclipse 3.3：<span style="font-family: Arial">eclipse-jee-europa-fall2-win32.zip</span></span></p><p><span style="font-family: Arial">下载最新的myeclipse 6.0：<span style="font-family: Arial"><span style="font-family: Arial">MyEclipse_6.0.1GA_E3.3.1_Installer.exe</span></span></span></p><p><span style="font-family: Arial">在网上搜了一下注册码，下面把 6.0GA / M1 和 5.5GA 版本的&ldquo;注册信息&rdquo;&ldquo;注册码&rdquo;&ldquo;破解&rdquo;给大家：</span></p><p><span style="font-family: Arial">Subscriber:<br />Subscriber Code: jLR8ZC-655355-5450765457039125<br />或者<br />Subscriber:<br />Subscriber Code: jLR7ZL-655355-5450755330522962<br />适用于早期的 5.5 M2 版本的：</span></p><p><span style="font-family: Arial">Subscriber:<br />Subscriber Code: jLR8ZC-956-55-5467865833584547<br />适用于早期的 5.1.1 GA 和 5.5 M1 版本的：</span></p><p><span style="font-family: Arial">Subscriber:<br />Subscriber Code: jLR8ZC-444-55-4467865481680090<br />注册成功后会发现：</span></p><p><span style="font-family: Arial">Subscriber:<br />Product ID: E3MP (MyEclipse Professional Subscription)<br />License version: x.x<br />Full Maintenance Included<br />Subscription expiration date (YYYYMMDD): 20090520<br />Number of licenses: 800</span></p><p>安装步骤大家应该很清楚了，这里主要说一下集成了哪些插件:</p><p><span style="font-family: Arial">1.&nbsp; Subversion是下一代版本(或源码)控制系统,它的目的是代替CVS下载.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在线安装更新地址&nbsp;:&nbsp; Eclipse update site URL: <a href="http://subclipse.tigris.org/update_1.2.x">http://subclipse.tigris.org/update_1.2.x</a></span></p><p><span style="font-family: Arial">2.PyDevPyDev是一个允许用户利用Eclipse进行Python开发。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它提供了一些很好的功能如：代码填空，语法高亮显示，语法分析，重构(refactor)和调试等等．</span><span style="font-family: Arial"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在线安装更新地址&nbsp;:<a href="http://pydev.sourceforge.net/updates/">http://pydev.sourceforge.net/updates/</a></span></p><p><span style="font-family: Arial">3.&nbsp; JyDT&nbsp;&nbsp;&nbsp; Jython开发工具。 </span></p><p><span style="font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在线安装更新地址&nbsp;:&nbsp;:&nbsp;&nbsp; <a href="http://www.redrobinsoftware.net/jydt/updatesite">http://www.redrobinsoftware.net/jydt/updatesite</a></span></p><p><span style="font-family: Arial">4.&nbsp; 基于Eclipse的Java反编译插件</span></p><p><span style="font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在线更新地址&nbsp;:&nbsp;<a href="http://www.technoetic.com/eclipse/update">http://www.technoetic.com/eclipse/update</a></span></p><p><span style="font-family: Arial">5.&nbsp; JSEclipse可以编辑JavaScript 文件，支持语法突出显示和包括了一些常用的面向对象的方法。</span></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: Arial">支持的面向对象的功能有：构造函数，类方法，实例方法，类变量等等。支持代码错误提示，警靠报告等。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在线安装更新地址&nbsp;:&nbsp;<a href="http://download.macromedia.com/pub/labs/jseclipse/autoinstall/">http://download.macromedia.com/pub/labs/jseclipse/autoinstall/</a></span></p><p><span style="font-family: Arial">6.&nbsp; Implementors当追踪方法代码时，Eclipse默认是转到方法的接口类，而接口中是只有方法名称没有具体的实现代码，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此插件提供了追踪到具体实现类的实现代码的功能。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在线更新地址&nbsp;:&nbsp; <a href="http://eclipse-tools.sourceforge.net/updates/">http://eclipse-tools.sourceforge.net/updates/</a></span></p><p><span style="font-family: Arial">7.&nbsp; Easy ExplorerEasy Explorer 打开在eclipse中选定文件所在的目录<br />&nbsp;&nbsp;&nbsp;&nbsp; 在线安装更新地址&nbsp;: <a href="http://easystruts.sourceforge.net/eclipse/updates/">http://easystruts.sourceforge.net/eclipse/updates/</a></span></p><p><span style="font-family: Arial">8.&nbsp;&nbsp; JSEclipse可以编辑JavaScript 文件，支持语法突出显示和包括了一些常用的面向对象的方法。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持的面向对象的功能有：构造函数，类方法，实例方法，类变量等等。支持代码错误提示，警靠报告等。</span></p><p><span style="font-family: Arial">9.&nbsp;&nbsp; JAutodoc&nbsp;&nbsp; JAutodoc是一个能够自动为你的源代码加上Javadoc注释的Eclipse插件。</span></p><p><span style="font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在线安装更新地址&nbsp;&nbsp;:&nbsp; <a href="http://jautodoc.sourceforge.net/update/">http://jautodoc.sourceforge.net/update/</a></span></p><p><span style="font-family: Arial">10. </span><span style="font-family: Arial">moreUnitmoreUnit这个插件用于帮助开发单元测试。它能够修饰一个有测试案例的类。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在编辑器中标记被测试的方法。在编辑器中通过菜单或快捷键跳到测试案例。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在编辑器中通过菜单或快捷键为光标所在位置的方法生成一个测试方法存根。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在线安装更新地址&nbsp;:&nbsp;<a href="http://moreunit.sourceforge.net/org.moreunit.updatesite/">http://moreunit.sourceforge.net/org.moreunit.updatesite/</a> </span></p><p>11.Properties Editor&nbsp; 编辑java的属性文件，并可以自动存盘为Unicode格式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://propedit.sourceforge.jp/index_en.html"><span style="font-size: x-small">http://propedit.sourceforge.jp/index_en.html</span>&nbsp;</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在线安装更新地址&nbsp;: <a href="http://propedit.sourceforge.jp/eclipse/updates/"><span style="font-size: x-small">http://propedit.sourceforge.jp/eclipse/updates/</span> </a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我觉得这些插件集成完成以后会对开发有很大的帮助。</p><p>&nbsp;</p><p>12. Maven2 Eclipse 插件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://m2eclipse.codehaus.org/">http://m2eclipse.codehaus.org/</a> </p><p>13. Spring IDE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://springide.org/project">http://springide.org/project</a> </p><p>14. XFire (WebService)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://dist.codehaus.org/xfire/update/">http://dist.codehaus.org/xfire/update/</a> </p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/143310#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 24 Nov 2007 16:32:23 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/143310</link>
        <guid>http://jonas.javaeye.com/blog/143310</guid>
      </item>
      <item>
        <title>python 模拟线程并发</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/137009" style="color:red;">http://jonas.javaeye.com/blog/137009</a>&nbsp;
          发表时间: 2007年10月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">最近做python，下面是一段测试数据库性能的代码。</font></p>
<p>数据库表记录：1000000条。</p>
<p>开200个线程，100个同时并发。</p>
<p><font face="Arial"></font></p>
<p><font face="Arial">#!/usr/bin/python<br />
# -*- coding: utf-8 -*-<br />
import sys<br />
import os<br />
import os.path<br />
import re<br />
import MySQLdb<br />
import httplib, mimetypes<br />
import traceback<br />
import logging<br />
import ConfigParser<br />
import time<br />
import threading<br />
import string<br />
import codecs<br />
import random<br />
import datetime</font></p>
<p><font face="Arial">class SelectView(threading.Thread):<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; def __init__(self, threadName):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; threading.Thread.__init__(self, name = threadName)<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; def run(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #global dbConn<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #dbConn = MySQLdb.connect(host=dbhost, port=dbport, user=dbuser, passwd=dbpass, db=dbschema, use_unicode=True, charset='utf8')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in range(100):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start =time.time()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print self.getName(),&quot;--&gt;Thread start!&quot;+getDbDateString()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.info(self.getName()+&quot;--&gt;Thread start!&quot;+getDbDateString())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbConn = None<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbConn = MySQLdb.connect(host=dbhost, port=dbport, user=dbuser, passwd=dbpass, db=dbschema, use_unicode=True, charset='utf8')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strss = string.join(random.sample(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','T','Z'], 1)).replace(&quot; &quot;,&quot;&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;query str----&quot;+strss<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql = &quot;SELECT * FROM smartone_metainfo_view as s where songName like '%&quot;+strss+&quot;%' limit 200&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cursor = dbConn.cursor()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cursor.execute(sql)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; songid =&quot;&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for counts in cursor.fetchall():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; songid= songid + str(counts[0])+str(counts[1])+str(counts[2])+str(counts[3])+str(counts[4])+str(counts[5])+str(counts[6])+str(counts[7])+str(counts[8])+str(counts[9])+str(counts[10])+str(counts[11])+str(counts[12])+str(counts[13])+str(counts[14])+str(counts[15])+ str(counts[16])+str(counts[17])+str(counts[18])+str(counts[19])+str(counts[20])+str(counts[21])+str(counts[22])+str(counts[23])+str(counts[24])+str(counts[25])+str(counts[26])+str(counts[27])+str(counts[28])+str(counts[29])+str(counts[30])+str(counts[31])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end =time.time()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sec = end - start<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot; thread,execute total time is----&quot;,sec,&quot; second&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.info(&quot; thread execute finish,execute total time is----&quot;+str(sec)+&quot; second&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print songid<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;size --&quot;+str(len(counts))+&quot;songId---&quot;+str(counts[0])# self.getName(),&quot;--query result:--total count--&quot;+str(counts[0])#+&quot;----songName:&quot;+counts[1]+&quot;----isrc&quot;+str(counts[2])&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #logger.info(&quot;size --&quot;+str(len(counts))+&quot;songId---&quot;+str(counts[0]))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #print &quot;command free----&quot;,os.system('free')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbConn.close() <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; etype, evalue = sys.exc_info()[:2]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.info(self.getName()+&quot;--Thread,-query data failed!---Type: &quot; +str(etype)+&quot;----Value--:&quot;+str(evalue))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Type: &quot; , etype<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Value: &quot; , evalue <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #cmd = &quot;mysqladmin -uMELODEO_USER -p6DF0FF9674EC1A397A430F9F2FCB2C64 -h202.153.121.172 status&quot;<br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strs = os.system(cmd)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #lines = os.popen(cmd).readlines()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #for line in lines:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; print line.rstrip()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #logger.info(&quot;&quot;.join(lines))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #sem.release()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=</font></p>
<p><font face="Arial">def init_settings(profile, config_file):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #read ini file<br />
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; config_file = &quot;c:/contentstext/processCommonFormat.ini&quot;<br />
&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp; print os.getcwd()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg = ConfigParser.RawConfigParser()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.read(config_file)<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define the directory we are writing out to and some other parameters.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global dbhost <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbhost = cfg.get(profile, &quot;dbhost&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global dbport<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbport = int( cfg.get(profile, &quot;dbport&quot;))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global dbuser<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbuser = cfg.get(profile, &quot;dbuser&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global dbpass<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbpass = cfg.get(profile, &quot;dbpassword&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global dbschema<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbschema = cfg.get(profile, &quot;db&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global USE_UNICODE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; use_unicode = cfg.get(profile, &quot;USE_UNICODE&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (use_unicode == 'Y'):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USE_UNICODE=True<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USE_UNICODE=False<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USE_UNICODE=False&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #set up logs - ripped from contentManager.py<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOG_FILE = './smartone_200.log' <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val&nbsp; = cfg.get(profile, &quot;loglevel&quot;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The configured log level<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if len(val) &gt;0:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if val == 'debug':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_level = logging.DEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif val == 'info':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_level = logging.INFO<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif val == 'warning':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_level = logging.WARNING<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif val == 'error':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_level = logging.ERROR<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif val == 'critical':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_level = logging.CRITICAL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_level = logging.INFO<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val&nbsp; = cfg.get(profile, &quot;log_format&quot;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # The format string for this logging session<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if len(val) &gt;0:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_format = val<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log_format = '%(asctime)s %(levelname)s %(message)s'<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ###################<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Initialize logger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global logger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger = logging.getLogger('sessioninfo')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hdlr = logging.FileHandler(LOG_FILE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; formatter = logging.Formatter(log_format)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hdlr.setFormatter(formatter)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.addHandler(hdlr) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.setLevel(log_level)&nbsp;&nbsp;&nbsp; </font></p>
<p><font face="Arial">def getDbDateString():<br />
&nbsp;&nbsp;&nbsp; now = datetime.datetime.today()<br />
&nbsp;&nbsp;&nbsp; #should probably do this using a formatting string - don't feel like reading docs.<br />
&nbsp;&nbsp;&nbsp; return str(now.year) + &quot;-&quot; + str(now.month) + &quot;-&quot; + str(now.day) + &quot; &quot; + str(now.hour) + &quot;:&quot; + str(now.minute) + &quot;:&quot; + str(now.second)</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
if __name__ == &quot;__main__&quot;:<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; config_file = &quot;./smartone_DataTest.ini&quot;<br />
&nbsp;&nbsp;&nbsp; profile = &quot;smartone&quot;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; init_settings(profile, config_file)<br />
&nbsp;&nbsp;&nbsp; maxThread = 200<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; #threading.<br />
&nbsp;&nbsp;&nbsp; import socket&nbsp; <br />
&nbsp;&nbsp;&nbsp; socket.setdefaulttimeout(15)&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; threadList=[]<br />
&nbsp;&nbsp;&nbsp; #threading.BoundedSemaphore(maxThread)<br />
&nbsp;&nbsp;&nbsp; for i in range(maxThread):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #sv = SelectView()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; threads = SelectView('thread'+str(i))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; threadList.append(threads)<br />
&nbsp;&nbsp;&nbsp; #threadList.remove(len(threadList))<br />
&nbsp;&nbsp;&nbsp; print '\nStarting threads'<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; for i in threadList:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i.start()<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; print 'All threads started\n'<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; for i in threadList:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i.join()&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; print &quot;All thread has create,Wait for all thread exit.&quot;<br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; #sv.executeThread()<br />
#&nbsp;&nbsp;&nbsp; sv = SelectView()<br />
#&nbsp;&nbsp;&nbsp; cout = sv.selectView()<br />
#&nbsp;&nbsp;&nbsp; print &quot;wewe----&quot;,cout<br />
</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/137009#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 31 Oct 2007 15:00:39 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/137009</link>
        <guid>http://jonas.javaeye.com/blog/137009</guid>
      </item>
      <item>
        <title>面向对象之代码复用规则</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/109648" style="color:red;">http://jonas.javaeye.com/blog/109648</a>&nbsp;
          发表时间: 2007年08月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>转自：<font face="Arial"><a href="http://www.ceocio.com.cn/blog/user1/4517/archives/2007/7350.html">http://www.ceocio.com.cn/blog/user1/4517/archives/2007/7350.html</a>&nbsp;</font></p>
<p>代码复用是绝大多数<a href="http://www.csai.cn/incsearch/search.asp?key=%B3%CC%D0%F2%D4%B1" target="_blank"><span style="COLOR: #356299">程序员</span></a>所期望的，也是OO的目标之一。总结我多年的编码经验，为了使代码能够最大程度上复用，应该特别注意以下几个方面。 </p>
<p><strong>1、 对接口编程</strong><br />
&nbsp;<br />
　　&quot;对接口编程&quot;是面向对象设计（OOD）的第一个基本原则。它的含义是：使用接口和同类型的组件通讯，即，对于所有完成相同功能的组件，应该抽象出一个接口，它们都实现该接口。具体到JAVA中，可以是接口（interface），或者是抽象类（abstract class），所有完成相同功能的组件都实现该接口，或者从该抽象类继承。我们的客户代码只应该和该接口通讯，这样，当我们需要用其它组件完成任务时，只需要替换该接口的实现，而我们代码的其它部分不需要改变！</p>
<p>　　当现有的组件不能满足要求时，我们可以创建新的组件，实现该接口，或者，直接对现有的组件进行扩展，由子类去完成扩展的功能。</p>
<p><strong>2、 优先使用对象组合，而不是类继承</strong><br />
&nbsp;<br />
　　&quot;优先使用对象组合，而不是类继承&quot;是面向对象设计的第二个原则。并不是说继承不重要，而是因为每个学习OOP的人都知道OO的基本特性之一就是继承，以至于继承已经被滥用了，而对象组合技术往往被忽视了。下面分析继承和组合的优缺点：</p>
<p>　　类继承允许你根据其他类的实现来定义一个类的实现。这种通过生成子类的复用通常被称为白箱复用(white-box reuse)。术语&quot;白箱&quot;是相对可视性而言：在继承方式中，父类的内部细节对子类可见。</p>
<p>　　对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组合对象来获得。对象组合要求对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse)，因为被组合的对象的内部细节是不可见的。对象只以&quot;黑箱&quot;的形式出现。</p>
<p>　　继承和组合各有优缺点。类继承是在编译时刻静态定义的，且可直接使用，类继承可以较方便地改变父类的实现。但是类继承也有一些不足之处。首先，因为继承在编译时刻就定义了，所以无法在运行时刻改变从父类继承的实现。更糟的是，父类通常至少定义了子类的部分行为，父类的任何改变都可能影响子类的行为。如果继承下来的实现不适合解决新的问题，则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。</p>
<p>　　对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。由于组合要求对象具有良好定义的接口，而且，对象只能通过接口访问，所以我们并不破坏封装性；只要类型一致，运行时刻还可以用一个对象来替代另一个对象；更进一步，因为对象的实现是基于接口写的，所以实现上存在较少的依赖关系。</p>
<p>　　优先使用对象组合有助于你保持每个类被封装，并且只集中完成单个任务。这样类和类继承层次会保持较小规模，并且不太可能增长为不可控制的庞然大物（这正是滥用继承的后果）。另一方面，基于对象组合的设计会有更多的对象(但只有较少的类)，且系统的行为将依赖于对象间的关系而不是被定义在某个类中。</p>
<p>　　注意：理想情况下，我们不用为获得复用而去创建新的组件，只需要使用对象组合技术，通过组装已有的组件就能获得需要的功能。但是事实很少如此，因为可用的组件集合并不丰富。使用继承的复用使得创建新的组件要比组装已有的组件来得容易。这样，继承和对象组合常一起使用。然而，正如前面所说，千万不要滥用继承而忽视了对象组合技术。</p>
<p>　　相关的设计模式有：Bridge、Composite、Decorator、Observer、Strategy等。</p>
<p>　　下面的例子演示了这个规则，它的前提是：我们对同一个<a href="http://www.csai.cn/incsearch/search.asp?key=%CA%FD%BE%DD%BD%E1%B9%B9" target="_blank"><span style="COLOR: #356299">数据结构</span></a>，需要以任意的格式输出。</p>
<p>　　第一个例子，我们使用基于继承的框架，可以看到，它很难维护和扩展。 <br />
　　abstract class AbstractExampleDocument<br />
　　{<br />
　　　// skip some code ...<br />
　　　　public void output(Example structure)<br />
　　　　{<br />
　　　　　if( null != structure )<br />
　　　　　　{<br />
　　　　　　　this.format( structure );<br />
　　　　　　}<br />
　　　　}<br />
　　　　protected void format(Example structure);<br />
　　}</p>
<p>&nbsp;</p>
<p><br />
　　第二个例子，我们使用基于对象组合技术的框架，每个对象的任务都清楚的分离开来，我们可以替换、扩展格式类，而不用考虑其它的任何事情。 <br />
　　class DefaultExampleDocument <br />
　　{<br />
　　　// skip some code ...<br />
　　　public void output(Example structure) <br />
　　　{<br />
　　　　　ExampleFormatter formatter = <br />
　　　　　(ExampleFormatter) manager.lookup(Roles.FORMATTER);<br />
　　　　　if( null != structure ) <br />
　　　　　{<br />
　　　　　　　formatter.format(structure);<br />
　　　　　}<br />
　　　}<br />
　　}</p>
<p><br />
　　这里，用到了类似于&quot;抽象工厂&quot;的组件创建模式，它将组件的创建过程交给manager来完成；ExampleFormatter是所有格式的抽象父类；</p>
<p><strong>3、 将可变的部分和不可变的部分分离</strong><br />
&nbsp;<br />
　　&quot;将可变的部分和不可变的部分分离&quot;是面向对象设计的第三个原则。如果使用继承的复用技术，我们可以在抽象基类中定义好不可变的部分，而由其子类去具体实现可变的部分，不可变的部分不需要重复定义，而且便于维护。如果使用对象组合的复用技术，我们可以定义好不可变的部分，而可变的部分可以由不同的组件实现，根据需要，在运行时动态配置。这样，我们就有更多的时间关注可变的部分。</p>
<p>　　对于对象组合技术而言，每个组件只完成相对较小的功能，相互之间耦合比较松散，复用率较高，通过组合，就能获得新的功能。</p>
<p><strong>4、 减少方法的长度<br />
</strong>&nbsp;<br />
　　通常，我们的方法应该只有尽量少的几行，太长的方法会难以理解，而且，如果方法太长，则应该重新设计。对此，可以总结为以下原则： </p>
<p>三十秒原则：<br />
　　如果另一个<a href="http://www.csai.cn/incsearch/search.asp?key=%B3%CC%D0%F2%D4%B1" target="_blank"><span style="COLOR: #356299">程序员</span></a>无法在三十秒之内了解你的函数做了什么（What），如何做(How)以及为什么要这样做(Why)，那就说明你的代码是难以维护的，必须得到提高； <br />
一屏原则：<br />
如果一个函数的代码长度超过一个屏幕，那么或许这个函数太长了，应该拆分成更小的子函数； <br />
一行代码尽量简短，并且保证一行代码只做一件事</p>
<p>那种看似技巧性的冗长代码只会增加代码维护的难度。</p>
<p><strong>5、 消除case / if语句</strong><br />
&nbsp;<br />
　　要尽量避免在代码中出现判断语句，来测试一个对象是否某个特定类的实例。通常，如果你需要这么做，那么，重新设计可能会有所帮助。我在工作中遇到这样的一个问题：我们在使用JAVA做XML解析时，对每个标签映射了一个JAVA类，采用SAX（简单的XML接口API：Simple API for XML）模型。结果，代码中反复出现了大量的判断语句，来测试当前的标签类型。为此，我们重新设计了DTD（文档类型定义：Document Type Definition），为每个标签增加了一个固定的属性：classname，而且重新设计了每个标签映射的JAVA类的接口，统一了每个对象的操作： addElement(Element aElement); //增加子元素<br />
addAttribute(String attName, String att); //增加属性；</p>
<p>则彻底消除了所有的测试当前的标签类型的判断语句。每个对象通过 Class.forName(aElement.attributes.getAttribute(&quot;classname&quot;)).newInstence(); 动态创建，</p>
<p><strong>6、 减少参数个数</strong><br />
&nbsp;<br />
　　有大量参数需要传递的方法，通常很难阅读。我们可以将所有参数封装到一个对象中来完成对象的传递，这也有利于错误跟踪。</p>
<p>许多<a href="http://www.csai.cn/incsearch/search.asp?key=%B3%CC%D0%F2%D4%B1" target="_blank"><span style="COLOR: #356299">程序员</span></a>因为，太多层的对象包装对系统效率有影响。是的，但是，和它带来的好处相比，我们宁愿做包装。毕竟，&quot;封装&quot;也是OO的基本特性之一，而且，&quot;每个对象完成尽量少（而且简单）的功能&quot;，也是OO的一个基本原则。</p>
<p><strong>7、 类层次的最高层应该是抽象类。<br />
</strong>&nbsp;<br />
　　在许多情况下，提供一个抽象基类有利做特性化扩展。由于在抽象基类中，大部分的功能和行为已经定义好，使我们更容易理解接口设计者的意图是什么。</p>
<p>由于JAVA不允许&quot;多继承&quot;，从一个抽象基类继承，就无法再从其它基类继承了。所以，提供一个抽象接口(interface)是个好主意，一个类可以实现多个接口，从而模拟实现了&quot;多继承&quot;，为类的设计提供了更大的灵活性。</p>
<p><strong>8、 尽量减少对变量的直接访问。<br />
</strong>&nbsp;<br />
　　对数据的封装原则应该规范化，不要把一个类的属性暴露给其它类，而是应该通过访问方法去保护他们，这有利于避免产生波纹效应。如果某个属性的名字改变，你只需要修改它的访问方法，而不是修改所有相关的代码。</p>
<p><strong>9、 子类应该特性化，完成特殊功能。<br />
</strong>&nbsp;<br />
　　如果一个子类只是使一个组件变成组件管理器，而不是实现接口功能，或者，重载某个功能，那么，就应该使用一个外部的容器类，而不是创建一个子类。</p>
<p>　　建议：类层次结构图，不要太深；</p>
<p>　　例如：下面的接口定义了组件的功能：发送消息；类Transceiver实现了该接口；而其子类Pool只是管理多个Transceiver对象，而没有提供自己的接口实现。建议使用组合方式，而不是继承！</p>
<p><br />
　　public interface ITransceiver{<br />
　　　　public abstract send(String msg);<br />
　　}</p>
<p>　　public class Transceiver implements ITransceiver {<br />
　　　　public send(String msg){<br />
　　　　　　System.out.println(msg);<br />
　　　　}<br />
　　}</p>
<p>//使用继承方式的实现<br />
　　public class Pool extends Transceiver{<br />
　　　　private List pool = new Vector();<br />
　　　　public void add(Transceiver aTransceiver){<br />
　　　　　　pool.add(aTransceiver);<br />
　　　　}<br />
　　　　public Transceiver get(int index){<br />
　　　　　　pool.get(index);<br />
　　　　}<br />
　　}</p>
<p>//使用组合方式的实现<br />
　　public class Pool {<br />
　　　　private List pool = new Vector();<br />
　　　　public void add(Transceiver aTransceiver){<br />
　　　　　　pool.add(aTransceiver);<br />
　　　　}<br />
　　　　public Transceiver get(int index){<br />
　　　　　　pool.get(index);<br />
　　　　}<br />
　　}</p>
<p>&nbsp;</p>
<p><strong>10、 拆分过大的类。<br />
</strong>&nbsp;<br />
　　如果一个类有太多的方法（超过50个），那么它可能要做的工作太多，我们应该试着将它的功能拆分到不同的类中，类似于规则四。</p>
<p><strong>11、 作用截然不同的对象应该拆分。</strong><br />
&nbsp;<br />
　　在构建的过程中，你有时会遇到这样的问题：对同样的数据，有不同的视图。某些属性描述的是<a href="http://www.csai.cn/incsearch/search.asp?key=%CA%FD%BE%DD%BD%E1%B9%B9" target="_blank"><span style="COLOR: #356299">数据结构</span></a>怎样生成，而某些属性描述的是<a href="http://www.csai.cn/incsearch/search.asp?key=%CA%FD%BE%DD%BD%E1%B9%B9" target="_blank"><span style="COLOR: #356299">数据结构</span></a>本身。最好将这两个视图拆分到不同的类中，从类名上就可以区分出不同视图的作用。类的域、方法也应该有同样的考虑！</p>
<p><strong>12、 尽量减少对参数的隐含传递。</strong><br />
&nbsp;<br />
　　两个方法处理类内部同一个数据（域），并不意味着它们就是对该数据（域）做处理。许多时候，该数据（域）应该作为方法的参输入数，而不是直接存取，在工具类的设计中尤其应该注意。例如： <br />
　　public class Test{<br />
　　　　private List pool = new Vector();<br />
　　　　public void testAdd(String str){<br />
　　　　　　pool.add(str);<br />
　　　　}<br />
　　　　public Object testGet(int index){<br />
　　　　　　pool.get(index);<br />
　　　　}<br />
　　}</p>
<p>&nbsp;</p>
<p>　　两个方法都对List对象pool做了操作，但是，实际上，我们可能只是想对List接口的不同实现Vector、ArrayList等做存取测试。所以，代码应该这样写： <br />
　　public class Test{<br />
　　　　private List pool = new Vector();<br />
　　　　public void testAdd(List pool, String str){<br />
　　　　　　pool.add(str);<br />
　　　　}<br />
　　　　public Object testGet(List pool, int index){<br />
　　　　　　pool.get(index);<br />
　　　　}<br />
　　}</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/109648#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 07 Aug 2007 09:14:00 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/109648</link>
        <guid>http://jonas.javaeye.com/blog/109648</guid>
      </item>
      <item>
        <title>使用eclipse和subversion进行版本管理(由最新版为例)</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/106424" style="color:red;">http://jonas.javaeye.com/blog/106424</a>&nbsp;
          发表时间: 2007年07月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文由 KEEL {<a href="http://blog.k99k.com/" target="_blank"><font color="#666666">http://blog.k99k.com</font></a>}原创,本人转载，转载请注明出处.<br />
<br />
<div>主要思路是先在一个SERVER上建立svn的服务，再用eclipse的SVN插件作为客户端连上去，进行相关操作。这里因为服务器未提供WEB服务，而且eclipse的插件功能还不错，所以SVN不采用Apache的加载方式。<br />
<br />
步骤如下(windows系统)：<br />
<strong>1.下载相关安装程序:</strong><br />
<a href="http://subversion.tigris.org/"><font color="#d97009">http://subversion.tigris.org/</font></a> 下载subversion的编绎后程序(本人是1.3.1版);<br />
<a href="http://clanlib.org/~mbn/svnservice/"><font color="#d97009">http://clanlib.org/~mbn/svnservice/</font></a> 下载一个程序,可将subversion变成windows的一项服务;<br />
<a href="http://subclipse.tigris.org/"><font color="#d97009">http://subclipse.tigris.org/</font></a>&nbsp; 安装eclipse的SVN插件(安装说明:http://subclipse.tigris.org/install.html)(版本:1.0.1)</div>
<div><br />
推荐安装：<br />
<a href="http://tortoisesvn.tigris.org/"><font color="#d97009">http://tortoisesvn.tigris.org/</font></a> 有名的SVN客户端软件(版本:1.3.3.6219)<br />
注意它有个中文的语言包可下载的.</div>
<div>&nbsp;</div>
<div><strong>2.在SERVER上安装配置SVN服务</strong></div>
<strong></strong><br />
<div><br />
a.建立SVN服务所用到的repository文件夹作为文件库，如:E:\svn\repository</div>
<div><br />
b.命令行方式或者通过TortoiseSVN插件进行GUI操作，命令行运行如下:</div>
<div><br />
<font size="3" color="#ff0000" style="BACKGROUND-COLOR: #ccffff">svnadmin create E:\svn\repository </font></div>
<div><strong><font size="3" color="#333399" style="BACKGROUND-COLOR: #ccffff"></font></strong><br />
TortoiseSVN的GUI方式，在E:\svn\repository下点击右键选择[TotoiseSVN]-&gt;[Create Repository href...]进行创建，版本库模式指定为默认的即可。</div>
<div><br />
c.repository创建完毕后会在目录下生成若干个文件和文件夹，dav目录是提供给Apache与mod_dav_svn使用的目录，让它们存储内部数据；db目录就是所有版本控制的数据文件；hooks目录放置hook脚本文件的目录；locks用来放置Subversion文件库锁定数据的目录，用来追踪存取文件库的客户端；format文件是一个文本文件，里面只放了一个整数，表示当前文件库配置的版本号;</div>
<div><br />
d.配置conf:<br />
找到E:\svn\repository\conf\svnserve.conf文件，其中[general]中的三行可以解除注释并保存,具体含意文件中有:</div>
<div><br />
<font color="#000000" style="BACKGROUND-COLOR: #ccffff">anon-access = none<br />
auth-access = write</font></div>
<div><font color="#000000" style="BACKGROUND-COLOR: #ccffff"></font>&nbsp;</div>
<div><font color="#000000" style="BACKGROUND-COLOR: #ccffff">password-db = passwd</font></div>
<div>&nbsp;</div>
<div>设置用户与密码，找到E:\svn\repository\conf\passwd文件，打开看[users]中已经有了两个例子，照着加几个用户即可(格式与例子完全一致)，将不需要的用户注释掉,这里可以多建立几个不同的用户,以方便你在不同地方导出时用不同用户区分出在何处何时更改的,如建立admin_home(在家用的),admin_company(在公司用的),admin_out(出差时用的).</div>
<div><br />
e.注册并运行服务:<br />
这里提一下一般的起动服务的命令行方式:</div>
<div><br />
<font size="3" color="#ff0000" style="BACKGROUND-COLOR: #ccffff">svnserve --daemon --root E:\svn\repository</font></div>
<div><br />
如果要建立WINDOWS的服务,按以下操作:<br />
e.1.将SVNService.exe复制到subversion安装的bin目录中,注意:Make sure you place SVNService.exe in the same directory as svnserve.exe.</div>
<div><br />
e.2.在命令行中执行:</div>
<div><br />
<font size="3" color="#ff0000" style="BACKGROUND-COLOR: #ccffff">SVNService -install -d -r E:\svn\repository</font></div>
<div><br />
将此服务注册为E:\svn\repository文件库的服务.这样你在上一步做的配置才会生效,如果还建有另一个文件库,那要千万注意是启用的哪一个;</div>
<div><br />
e.3.打开管理工具中的&quot;服务&quot;,将SVNService启动,并将服务更改为自动启动. </div>
<div>&nbsp;</div>
<div>至此,服务器所有工作完成,可以关掉远程终端了.</div>
<div>&nbsp;</div>
<div><strong>3.用eclipse进行SVN管理:</strong></div>
<strong></strong><br />
<div><br />
a.安装:<br />
没什么好说的,看安装说明:</div>
<div>http://subclipse.tigris.org/install.html<br />
如果安装失败,注意清空localsetting/temp中与eclipse相关的.update临时文件夹,再重启eclipse再试安装,我就是装了好几次才成功,主要是因为网络原因下载的包有错误.(<a href="http://subclipse.tigris.org/servlets/ProjectDocumentList"><font color="#d97009">http://subclipse.tigris.org/servlets/ProjectDocumentList</font></a>&nbsp;可下载ZIP包到本地,用eclipse从ZIP包安装,解决网络问题)</div>
<div>&nbsp;</div>
<div>另外推荐安装tortoisesvn,再另上中文语言包,安装过程很简单,无需作任何复杂设置.当然不装只使用eclipse也可以.</div>
<div><br />
b.使用:<br />
重启eclise后,可以在Customize Perspective中设置相关svn的选项.<br />
在需要的项目上点右键,Team&gt;share project,连接svn://202.XXX.XXX.XXX,进行相关设置和填入用户名密码后,即可进行SVN管理了.<br />
主要的管理功能可以在Team菜单中看到.</div>
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/106424#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 28 Jul 2007 15:47:51 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/106424</link>
        <guid>http://jonas.javaeye.com/blog/106424</guid>
      </item>
      <item>
        <title>中国足球，真让人伤心！</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/102521" style="color:red;">http://jonas.javaeye.com/blog/102521</a>&nbsp;
          发表时间: 2007年07月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚看完中国和乌兹别克的足球比赛，真是太让人伤心了，中国队太小看人家了，最后还是输掉了比赛，一开始就漫不经心的踢球，觉得中国对晋级绝对没问题，但是他却给所有的中国球迷破了一身冷水。看来这已经是中国足球的一贯作风了。又是一个伤心的夜晚啊！！！
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/102521#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Jul 2007 22:27:30 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/102521</link>
        <guid>http://jonas.javaeye.com/blog/102521</guid>
      </item>
      <item>
        <title>存储过程精解</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/101018" style="color:red;">http://jonas.javaeye.com/blog/101018</a>&nbsp;
          发表时间: 2007年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="MsoNormal" style="MARGIN: 7.5pt 0cm 0pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-outline-level: 1"><font size="3" color="#00ccff" face="Arial"><span lang="EN-US" style="COLOR: #5e5e5e; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><strong>存储过程精解</strong></span></font></div>
<div class="MsoNormal" style="MARGIN: 7.5pt 0cm 0pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-outline-level: 1"><span lang="EN-US" style="COLOR: #5e5e5e; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><font size="3" color="#00ccff"><strong></strong></font></span></div>
<div class="MsoNormal" style="MARGIN: 7.5pt 0cm 0pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-outline-level: 1"><font size="3" color="#00ccff" face="Arial"><span lang="EN-US" style="COLOR: #5e5e5e; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><strong>粘贴不完，上传上去给大家看吧！</strong></span></font></div>
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/101018#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jul 2007 14:05:54 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/101018</link>
        <guid>http://jonas.javaeye.com/blog/101018</guid>
      </item>
      <item>
        <title>mysql存储过程</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/101017" style="color:red;">http://jonas.javaeye.com/blog/101017</a>&nbsp;
          发表时间: 2007年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">mysql存储过程资料，觉得还不错，大家可以参考一下。</font>
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/101017#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jul 2007 14:03:09 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/101017</link>
        <guid>http://jonas.javaeye.com/blog/101017</guid>
      </item>
      <item>
        <title>JSF中文教程</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/101016" style="color:red;">http://jonas.javaeye.com/blog/101016</a>&nbsp;
          发表时间: 2007年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>收集的<font face="Arial">JSF中文教程，拿出来给大家分享。</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://jonas.javaeye.com/blog/101016#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jul 2007 13:58:27 +0800</pubDate>
        <link>http://jonas.javaeye.com/blog/101016</link>
        <guid>http://jonas.javaeye.com/blog/101016</guid>
      </item>
      <item>
        <title>初识JavaServerFaces</title>
        <author>88958620</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonas.javaeye.com">88958620</a>&nbsp;
          链接：<a href="http://jonas.javaeye.com/blog/101003" style="color:red;">http://jonas.javaeye.com/blog/101003</a>&nbsp;
          发表时间: 2007年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>摘要</strong> </p>
<p>2002年9月，在Java Specification Request（JSR）127上发布了JavaServer Faces规范的早期访问（early access，EA）草案。JavaServer Faces具有定义良好的请求处理生命周期和丰富的组件层次结构，将会深远地影响到J2EE（Java 2 Platform, Enterprise Edition）应用程序的开发。本系列文章篇分为两部分，在第 1 部分中，David Geary 将介绍 JavaServer Faces并初步探讨它的基本概念。（2002年11月29日) </p>
<p><strong>正文</strong> </p>
<p>最近，在使用Struts、Enterprise JavaBeans (EJB)、servlets, JavaServer Pages (JSP)和JSP标准标签库（JSP Standard Tag Library，JSTL）开发一个复杂的Web应用程序时，我有幸参与培训和指导了一群 Java的开发新手。结果，项目成功了，且在