<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[渣渣曰曰的东西]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[Welcome to LHY&#39;s webspace!]]></description>
<link>http://hi.baidu.com/lhylwh</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[Web service]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/38ab53fbc9c3f9176c22eb64.html]]></link>
        <description><![CDATA[
		
		<div class="postText">Web service到底是什么；在什么情况下你应该使用Web service。 <br>
<br>
<ccid_nobr></ccid_nobr><strong>分布式应用程序和浏览器</strong> <br>
<br>
研究一下当前的应用程序开发，你会发现一个绝对的倾向：人们开始偏爱基于浏览器的瘦客户应用程序。这当然不是因为瘦客户能够提供更好的用户界面，而是因为它能够避免花在桌面应用程序发布上的高成本。发布桌面应用程序成本很高，一半是因为应用程序安装和配置的问题，另一半是因为客户和服务器之间通信的问题。 <br>
<br>
传统的Windows富客户应用程序使用DCOM来与服务器进行通信和调用远程对象。配置好DCOM使其在一个大型的网络中正常工作将是一个极富挑战性的工作，同时也是许多IT工程师的噩梦。事实上，许多IT工程师宁愿忍受浏览器所带来的功能限制，也不愿在局域网上去运行一个DCOM。在我看来，结果就是一个发布容易，但开发难度大而且用户界面极其受限的应用程序。极端的说，就是你花了更多的资金和时间，却开发出从用户看来功能更弱的应用程序。不信？问问你的会计师对新的基于浏览器的会计软件有什么想法：绝大多数商用程序用户希望使用更加友好的Windows用户界面。 <br>
<br>
关于客户端与服务器的通信问题，一个完美的解决方法是使用HTTP协议来通信。这是因为任何运行Web浏览器的机器都在使用HTTP协议。同时，当前许多防火墙也配置为只允许HTTP连接。 <br>
<br>
许多商用程序还面临另一个问题，那就是与其他程序的互操作性。如果所有的应用程序都是使用COM或.NET语言写的，并且都运行在Windows平台上，那就天下太平了。然而，事实上大多数商业数据仍然在大型主机上以非关系文件(VSAM)的形式存放，并由COBOL语言编写的大型机程序访问。而且，目前还有很多商用程序继续在使用C++、Java、Visual Basic和其他各种各样的语言编写。现在，除了最简单的程序之外，所有的应用程序都需要与运行在其他异构平台上的应用程序集成并进行数据交换。这样的任务通常都是由特殊的方法，如文件传输和分析，消息队列，还有仅适用于某些情况的的API，如IBM的"高级程序到程序交流(APPC)"等来完成的。在以前，没有一个应用程序通信标准，是独立于平台、组建模型和编程语言的。只有通过Web Service，客户端和服务器才能够自由的用HTTP进行通信，不论两个程序的平台和编程语言是什么。 <br>
<br>
<ccid_nobr></ccid_nobr><strong>什么是Web Service</strong> <br>
<br>
对这个问题，我们至少有两种答案。从表面上看，Web service 就是一个应用程序，它向外界暴露出一个能够通过Web进行调用的API。这就是说，你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。例如，你想创建一个Web service ，它的作用是返回当前的天气情况。那么你可已建立一个ASP页面，它接受邮政编码作为查询字符串，然后返回一个由逗号隔开的字符串，包含了当前的气温和天气。要调用这个ASP页面，客户端需要发送下面的这个HTTP GET请求： <br>
<br>
http://host.company.com/weather.asp?zipcode=20171 <br>
<br>
返回的数据就应该是这样： <br>
<br>
21,晴 <br>
<br>
这个ASP页面就应该可以算作是Web service 了。因为它基于HTTP GET请求，暴露出了一个可以通过Web调用的API。当然，Web service 还有更多的东西。 <br>
<br>
下面是对Web service 更精确的解释： <strong>Web services是建立可互操作的分布式应用程序的新平台</strong>。作为一个Windows程序员，你可能已经用COM或DCOM建立过基于组件的分布式应用程序。COM是一个非常好的组件技术，但是我们也很容易举出COM并不能满足要求的情况。 <br>
<br>
Web service平台是一套标准，它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言，在任何你喜欢的平台上写Web service ，只要我们可以通过Web service标准对这些服务进行查询和访问。 <br>
<br>
<ccid_nobr></ccid_nobr><strong>新平台</strong> <br>
<br>
Web service平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性，Web service平台必须提供一套标准的类型系统，用于沟通不同平台、编程语言和组件模型中的不同类型系统。在传统的分布式系统中，基于界面(interface)的平台提供了一些方法来描述界面、方法和参数（译注：如COM和COBAR中的IDL语言）。同样的，Web service平台也必须提供一种标准来描述Web service，让客户可以得到足够的信息来调用这个Web service。最后，我们还必须有一种方法来对这个Web service进行远程调用。这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性，这种RPC协议还必须与平台和编程语言无关。下面几个小节就简要介绍了组成Web service平台的这三个技术。 <br>
<br>
<ccid_nobr></ccid_nobr><strong>XML和XSD</strong> <br>
<br>
可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。除了易于建立和易于分析外，XML主要的优点在于它既是平台无关的，又是厂商无关的。无关性是比技术优越性更重要的：软件厂商是不会选择一个由竞争对手所发明的技术的。 <br>
<br>
XML解决了数据表示的问题，但它没有定义一套标准的数据类型，更没有说怎么去扩展这套数据类型。例如，整形数到底代表什么？16位，32位，还是64位？这些细节对实现互操作性都是很重要的。W3C制定的XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型，并给出了一种语言来扩展这套数据类型。Web service平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时，为了符合Web service标准，所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换，但你很可能会根据你的需要修改一下转换过程。在第二章中，我们将深入XSD，学习怎样转换自定义的数据类型(例如类)到XSD的类型。 <br>
<br>
<ccid_nobr></ccid_nobr><strong>SOAP</strong> <br>
<br>
Web service建好以后，你或者其他人就会去调用它。简单对象访问协议(SOAP)提供了标准的RPC方法来调用Web service。实际上，SOAP在这里有点用词不当：它意味着下面的Web service是以对象的方式表示的，但事实并不一定如此：你完全可以把你的Web service写成一系列的C函数，并仍然使用SOAP进行调用。SOAP规范定义了SOAP消息的格式，以及怎样通过HTTP协议来使用SOAP。SOAP也是基于XML和XSD的，XML是SOAP的数据编码方式。第三章我们会讨论SOAP，并结识SOAP消息的各种元素。 <br>
<br>
<ccid_nobr></ccid_nobr><strong>WSDL</strong> <br>
<br>
你会怎样向别人介绍你的Web service有什么功能，以及每个函数调用时的参数呢？你可能会自己写一套文档，你甚至可能会口头上告诉需要使用你的Web service的人。这些非正式的方法至少都有一个严重的问题：当程序员坐到电脑前，想要使用你的Web service的时候，他们的工具(如Visual Studio)无法给他们提供任何帮助，因为这些工具根本就不了解你的Web <br>
<br>
service。解决方法是：用机器能阅读的方式提供一个正式的描述文档。Web service描述语言(WSDL)就是这样一个基于XML的语言，用于描述Web service及其函数、参数和返回值。因为是基于XML的，所以WSDL既是机器可阅读的，又是人可阅读的，这将是一个很大的好处。一些最新的开发工具既能根据你的Web service生成WSDL文档，又能导入WSDL文档，生成调用相应Web service的代码。 </div> <a href="http://hi.baidu.com/lhylwh/blog/item/38ab53fbc9c3f9176c22eb64.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/38ab53fbc9c3f9176c22eb64.html#comment">查看评论</a>]]></description>
        <pubDate>2007-05-24  09:45</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/38ab53fbc9c3f9176c22eb64.html</guid>
</item>

<item>
        <title><![CDATA[SCJP的一些题]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/fd1ad70037d0fb10738b655c.html]]></link>
        <description><![CDATA[
		
		<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">1. 1)&nbsp;&nbsp; public class ReturnIt{ <br>
 2)&nbsp;&nbsp; returnType methodA(byte x, double y){ <br>
 3)&nbsp;&nbsp; return (short)x/y*2; <br>
 4)&nbsp;&nbsp; } <br>
 5)&nbsp;&nbsp; } <br>
 what is valid returnType for methodA in line 2? <br>
Answer:double </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">2. 1)&nbsp;&nbsp; class Super{ <br>
 2)&nbsp;&nbsp; public float getNum(){return <st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="3" unitname="F">3.0f</st1:chmetcnv>;} <br>
 3)&nbsp;&nbsp; } <br>
 4) <br>
 5)&nbsp;&nbsp; public class Sub extends Super{ <br>
 6) <br>
 7)&nbsp;&nbsp; } <br>
which method, placed at line 6, will cause a compiler error? <br>
A. public float getNum(){return <st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="4" unitname="F">4.0f</st1:chmetcnv>;} <br>
B. public void getNum(){} <br>
C. public void getNum(double d){} <br>
D. public double getNum(float d){return 4.0d;} <br>
Answer:B </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">3. public class IfTest{ <br>
 public static void main(String args[]){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x=3; <br>
 int y=1; <br>
 if(x=y) <br>
 System.out.println("Not equal"); <br>
 else <br>
 System.out.println("Equal"); <br>
 } <br>
 } <br>
 what is the result? <br>
Answer:compile error </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">4. public class Foo{ <br>
&nbsp;&nbsp; public static void main(String args[]){ <br>
&nbsp;&nbsp; try{return;} <br>
&nbsp;&nbsp;&nbsp; finally{ System.out.println("Finally");} <br>
&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
 what is the result? <br>
 A. print out nothing <br>
 B. print out "Finally" <br>
 C. compile error <br>
Answer:B </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">5. public class Test{ <br>
&nbsp;&nbsp; public static String output=""; <br>
&nbsp;&nbsp;&nbsp; public static void foo(int i){ <br>
&nbsp;&nbsp;&nbsp;&nbsp; try { <br>
if(i==1){ <br>
throw new Exception(); <br>
} <br>
output +="1"; <br>
 } <br>
 catch(Exception e){ <br>
 output+="2"; <br>
 return; <br>
 } <br>
 finally{ <br>
 output+="3"; <br>
&nbsp;&nbsp; } <br>
 output+="4"; <br>
 } <br>
 public static void main(String args[]){ <br>
 foo(0); <br>
 foo(1); <br>
 24)&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
 what is the value of output at line 24? </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">Answer:13423 </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">6. public class IfElse{ <br>
 public static void main(String args[]){ <br>
 if(odd(5)) <br>
 System.out.println("odd"); <br>
 else <br>
 System.out.println("even"); <br>
 } <br>
&nbsp;&nbsp; public static int odd(int x){return x%2;}&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp; } <br>
&nbsp;&nbsp; what is output? </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  "><br>
Answer:Compile Error </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  "><br>
7. class ExceptionTest{ <br>
&nbsp;&nbsp; public static void main(String args[]){ <br>
&nbsp;&nbsp; try{ <br>
methodA(); <br>
} <br>
&nbsp;&nbsp; catch(IOException e){ <br>
System.out.println("caught IOException"); <br>
&nbsp;&nbsp; } <br>
&nbsp;&nbsp; catch(Exception e){ <br>
&nbsp;&nbsp; System.out.println("caught Exception"); <br>
&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp; } <br>
&nbsp;&nbsp; } <br>
 If methodA() throws a IOException, what is the result? <br>
Answer:caught IOException <br>
exception can catch once only <br>
if change the sequence of catch <br>
&nbsp;&nbsp; catch(IOException e) can't execute&nbsp;&nbsp; and compiler will report rongyu error </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  "><br>
8. int i=1,j=10; <br>
 do{ <br>
 if(i++&gt;--j) continue; <br>
 }while(i&lt;5); <br>
After Execution, what are the value for i and j? <br>
A. i=6 j=5 <br>
B. B.i=5 j=<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5" unitname="C">5 </st1:chmetcnv><br>
C. i=6 j=4 <br>
D. i=5 j=6 <br>
E. i=6 j=6 <br>
Answer:D </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  "><br>
9. 1)public class X{ <br>
 2) public Object m(){ <br>
 3) Object o=new Float(<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="3.14" unitname="F">3.14F</st1:chmetcnv>); <br>
 4) Object[] oa=new Object[1]; <br>
 5) oa[0]=o; <br>
 6) o=null; <br>
 7) oa[0]=null; <br>
 System.out.println(oa[0]); <br>
 9) } <br>
 10) } <br>
 which line is the earliest point the object a refered is definitely elibile <br>
 to be garbage collectioned? <br>
 A.After line 4&nbsp;&nbsp;&nbsp; B. After line 5&nbsp;&nbsp; C.After line 6&nbsp;&nbsp;&nbsp;<br>
 D.After line 7&nbsp;&nbsp;&nbsp; E.After line 9(that is,as the method returns) <br>
Answer:D </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  "><br>
10.&nbsp;&nbsp;&nbsp;&nbsp; 1)&nbsp;&nbsp; interface Foo{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)int k=0; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3) } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4) public class Test implements Foo{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5) public static void main(String args[]){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6)int i; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7)Test test =new Test(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8)i=test.k; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9)i=Test.k; <br>
&nbsp;&nbsp;&nbsp;&nbsp; 10)i=Foo.k; <br>
&nbsp;&nbsp;&nbsp;&nbsp; 11)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp; 12) } <br>
&nbsp;&nbsp;&nbsp; what is the result? <br>
Answer:compile successed and i=0 </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">11. what is reserved words in java? <br>
&nbsp;&nbsp; A. run <br>
&nbsp;&nbsp; B. default <br>
&nbsp;&nbsp; C. implement <br>
&nbsp;&nbsp; D. import <br>
Answer:B,D </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">12. public class Test{ <br>
&nbsp;&nbsp;&nbsp; public static void main(String[] args){ <br>
&nbsp;&nbsp;&nbsp; String foo=args[1]; <br>
&nbsp;&nbsp;&nbsp; Sring bar=args[2]; <br>
&nbsp;&nbsp;&nbsp; String baz=args[3]; <br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; java Test Red Green Blue <br>
&nbsp;&nbsp; what is the value of baz? <br>
&nbsp;&nbsp; A. baz has value of "" <br>
&nbsp;&nbsp; B. baz has value of null <br>
&nbsp;&nbsp; C. baz has value of "Red" <br>
&nbsp;&nbsp; D. baz has value of "Blue" <br>
&nbsp;&nbsp; E. baz has value of "Green" <br>
&nbsp;&nbsp; F. the code does not compile <br>
&nbsp;&nbsp; G. the program throw an exception <br>
Answer:G </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">13. int index=1; <br>
&nbsp;&nbsp; int foo[]=new int[3]; <br>
&nbsp;&nbsp; int bar=foo[index]; <br>
&nbsp;&nbsp; int baz=bar+index; <br>
&nbsp;&nbsp; what is the result? <br>
&nbsp;&nbsp; A. baz has a value of 0 <br>
&nbsp;&nbsp; B. baz has value of 1 <br>
&nbsp;&nbsp; C. baz has value of 2 <br>
&nbsp;&nbsp; D. an exception is thrown <br>
&nbsp;&nbsp; E. the code will not compile <br>
Answer:B </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">14. which three are valid declaraction of a float? <br>
&nbsp;&nbsp;&nbsp; A. float foo=-1; <br>
&nbsp;&nbsp;&nbsp; B. float foo=1.0; <br>
&nbsp;&nbsp;&nbsp; C. float foo=42e1; <br>
&nbsp;&nbsp;&nbsp; D. float foo=<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2.02" unitname="F">2.02f</st1:chmetcnv>; <br>
&nbsp;&nbsp;&nbsp; E. float foo=3.03d; <br>
&nbsp;&nbsp;&nbsp; F. float foo=0x0123; <br>
Answer:A,D,F </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">15. public class Foo{ <br>
&nbsp;&nbsp;&nbsp; public static void main(String args[]){ <br>
&nbsp;&nbsp;&nbsp; String s; <br>
&nbsp;&nbsp;&nbsp; System.out.println("s="+s); <br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; what is the result? <br>
Answer:compile error </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">16.&nbsp;&nbsp;&nbsp; 1) public class Test{ <br>
&nbsp;&nbsp;&nbsp;&nbsp; 2) public static void main(String args[]){ <br>
&nbsp;&nbsp;&nbsp;&nbsp; 3) int i=oxFFFFFFF1; <br>
&nbsp;&nbsp;&nbsp;&nbsp; 4) int j=~i; <br>
&nbsp;&nbsp;&nbsp;&nbsp; 5) <br>
&nbsp;&nbsp;&nbsp;&nbsp; 6) } <br>
&nbsp;&nbsp;&nbsp;&nbsp; 7) } <br>
&nbsp;&nbsp; which is decimal value of j at line 5? <br>
&nbsp;&nbsp; A. 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.1&nbsp;&nbsp;&nbsp;&nbsp; C.14&nbsp;&nbsp;&nbsp;&nbsp; D.-15&nbsp;&nbsp;&nbsp;&nbsp; E. compile error at line 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp; F. compile error at line 4 <br>
Answer:C </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">17. float f=<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="4.2" unitname="F">4.2F</st1:chmetcnv>; <br>
&nbsp;&nbsp; Float g=new Float(<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="4.2" unitname="F">4.2F</st1:chmetcnv>); <br>
&nbsp;&nbsp; Double d=new Double(4.2); <br>
&nbsp;&nbsp; Which are true? <br>
&nbsp;&nbsp; A. f==g&nbsp;&nbsp;&nbsp; B. g==g&nbsp;&nbsp;&nbsp; C. d==f&nbsp;&nbsp;&nbsp; D. d.equals(f)&nbsp;&nbsp; E d.equals(g)&nbsp;&nbsp; F. g.equals(4.2); <br>
Answer:B,E </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">18.&nbsp;&nbsp; public class Test{ <br>
&nbsp;&nbsp;&nbsp; public static void add3(Integer i){ <br>
 3) int val=i.intvalue(); <br>
&nbsp;&nbsp;&nbsp;&nbsp; val+=3; <br>
&nbsp;&nbsp;&nbsp;&nbsp; i=new Integer(val); <br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer i=new Integer(0); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add3(i); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(i.intvalue()); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp; what is the&nbsp;&nbsp; result? <br>
&nbsp;&nbsp;&nbsp;&nbsp; A. compile fail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.print out "0"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.print out "3"&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp; D.compile succeded but exception at line 3 <br>
Answer:B </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">19. public class Test{ <br>
&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(6^3); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; what is output? <br>
Answer:5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
^ is yi huo </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">20. public class Test{ <br>
&nbsp;&nbsp;&nbsp; public static void stringReplace(String text){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text=text.replace('j','l'); <br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp; public static void bufferReplace(StringBuffer text){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text=text.append("c"); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; public static void main(String args[]){&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String textString=new String("java"); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer textBuffer=new StringBuffer("java"); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringReplace(textString); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bufferReplace(textBuffer); <br>
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(textString+textBuffer); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; what is the output? <br>
Answer:javajavac </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">21. public class ConstOver{ <br>
&nbsp;&nbsp;&nbsp; public ConstOver(int x, int y, int z){} <br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; which two overload the ConstOver constructor? <br>
&nbsp;&nbsp;&nbsp; A.ConstOver(){} <br>
&nbsp;&nbsp;&nbsp; B.protected int ConstOver(){}&nbsp;&nbsp;&nbsp; //not overload ,but no a error <br>
&nbsp;&nbsp;&nbsp; C.private ConstOver(int z, int y, byte x){} <br>
&nbsp;&nbsp;&nbsp; D.public void ConstOver(byte x, byte y, byte z){} <br>
&nbsp;&nbsp;&nbsp; E.public Object ConstOver(int x, int y, int z){} <br>
Answer:A,C </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">22. public class MethodOver{ <br>
&nbsp;&nbsp;&nbsp;&nbsp; public void setVar(int a, int b, float c){} <br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; which overload the setVar? <br>
&nbsp;&nbsp;&nbsp; A.private void setVar(int a, float c, int b){} <br>
&nbsp;&nbsp;&nbsp; B.protected void setVar(int a, int b, float c){} <br>
&nbsp;&nbsp;&nbsp; C.public int setVar(int a, float c, int b){return a;} <br>
&nbsp;&nbsp;&nbsp; D.public int setVar(int a, float c){return a;} <br>
Answer:A,C,D </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">23. class EnclosingOne{ <br>
&nbsp;&nbsp; public class InsideOne{} <br>
&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp; public class InnerTest{ <br>
&nbsp;&nbsp;&nbsp; public static void main(String args[]){ <br>
&nbsp;&nbsp;&nbsp; EnclosingOne eo=new EnclosingOne(); <br>
&nbsp;&nbsp;&nbsp; //insert code here <br>
&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp; } <br>
&nbsp;&nbsp; A.InsideOne ei=eo.new InsideOne(); <br>
&nbsp;&nbsp; B.eo.InsideOne ei=eo.new InsideOne(); <br>
&nbsp;&nbsp; C.InsideOne ei=EnclosingOne.new InsideOne(); <br>
&nbsp;&nbsp; D.InsideOne ei=eo.new InsideOne(); <br>
&nbsp;&nbsp; E.EnclosingOne.InsideOne ei=eo.new InsideOne(); <br>
Answer:E </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">24. What is "is a" relation? <br>
&nbsp;&nbsp; A.public interface Color{} <br>
&nbsp;&nbsp;&nbsp;&nbsp; public class Shape{private Color color;} <br>
&nbsp;&nbsp; B.interface Component{} <br>
&nbsp;&nbsp;&nbsp;&nbsp; class Container implements Component{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Component[] children; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp; C.public class Species{} <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Animal{private Species species;}&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp; D.interface A{} <br>
interface B{} <br>
interface C implements A,B{}&nbsp;&nbsp;&nbsp; //syntex error <br>
Answer:B <br>
keyword implements,entends </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">25. 1)package foo; <br>
&nbsp;&nbsp; 2) <br>
&nbsp;&nbsp; 3)public class Outer{ <br>
&nbsp;&nbsp; 4)public static class Inner{ <br>
&nbsp;&nbsp; 5)} <br>
&nbsp;&nbsp; 6)} <br>
&nbsp;&nbsp; which is true to instantiated Inner class inside Outer? <br>
&nbsp;&nbsp; A. new Outer.Inner() <br>
&nbsp;&nbsp; B. new Inner() <br>
Answer:B <br>
if out of outerclass A is correct </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">26. class BaseClass{ <br>
&nbsp;&nbsp;&nbsp; private float x=<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="F">1.0f</st1:chmetcnv>; <br>
&nbsp;&nbsp;&nbsp; private float getVar(){return x;} <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp; class SubClass extends BaseClass{ <br>
&nbsp;&nbsp;&nbsp; private float x=<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2" unitname="F">2.0f</st1:chmetcnv>; <br>
&nbsp;&nbsp;&nbsp; //insert code <br>
&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp; what are true to override getVar()? <br>
&nbsp;&nbsp; A.float getVar(){ <br>
&nbsp;&nbsp; B.public float getVar(){ <br>
&nbsp;&nbsp; C.public double getVar(){ <br>
&nbsp;&nbsp; D.protected float getVar(){ <br>
&nbsp;&nbsp; E.public float getVar(float f){ <br>
Answer:A,B,D </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">27. public class SychTest{ <br>
&nbsp;&nbsp;&nbsp; private int x; <br>
&nbsp;&nbsp;&nbsp; private int y; <br>
&nbsp;&nbsp;&nbsp; public void setX(int i){ x=i;} <br>
&nbsp;&nbsp;&nbsp; public void setY(int i){y=i;} <br>
&nbsp;&nbsp;&nbsp; public Synchronized void setXY(int i){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setX(i); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setY(i); <br>
&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; public Synchronized boolean check(){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x!=y;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp; Under which conditions will&nbsp;&nbsp; check() return true when called from a different class? <br>
&nbsp;&nbsp;&nbsp; A.check() can never return true. <br>
&nbsp;&nbsp;&nbsp; B.check() can return true when setXY is callled by multiple threads. <br>
&nbsp;&nbsp;&nbsp; C.check() can return true when multiple threads call setX and setY separately. <br>
&nbsp;&nbsp;&nbsp; D.check() can only return true if SychTest is changed allow x and y to be set separately. <br>
Answer:C </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">28. 1)public class X implements Runnable{ <br>
&nbsp;&nbsp; 2)private int x; <br>
&nbsp;&nbsp; 3)private int y; <br>
&nbsp;&nbsp; 4)public static void main(String[] args){ <br>
&nbsp;&nbsp; 5)&nbsp;&nbsp;&nbsp; X that =new X(); <br>
&nbsp;&nbsp; 6) (new Thread(that)).start(); <br>
&nbsp;&nbsp; 7) (new Thread(that)).start(); <br>
&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp; 9) public synchronized void run(){ <br>
&nbsp;&nbsp; 10)&nbsp;&nbsp; for(;;){ <br>
&nbsp;&nbsp; 11)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x++; <br>
&nbsp;&nbsp; 12)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y++; <br>
&nbsp;&nbsp; 13) System.out.println("x="+x+",y="+y); <br>
&nbsp;&nbsp; 14)&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp; 15)&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp; 16)&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp; what is the result? <br>
&nbsp;&nbsp; A.compile error at line 6 <br>
&nbsp;&nbsp; B.the program prints pairs of values for x and y that are <br>
&nbsp;&nbsp;&nbsp;&nbsp; always the same on the same time <br>
Answer:B </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  ">29. class A implements Runnable{ <br>
&nbsp;&nbsp; int i; <br>
&nbsp;&nbsp; public void run(){ <br>
&nbsp;&nbsp;&nbsp; try{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(5000); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=10; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(InterruptException e){} <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp; public static void main(String[] args){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A a=new A(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread t=new Thread(a); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.start(); <br>
&nbsp;&nbsp; 17) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j=a.i; <br>
&nbsp;&nbsp; 19) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){} <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
&nbsp;&nbsp; what be added at line line 17, ensure j=10 at line 19? <br>
&nbsp;&nbsp; A. a.wait();&nbsp;&nbsp;&nbsp; B.&nbsp;&nbsp; t.wait();&nbsp;&nbsp;&nbsp; C. t.join();&nbsp;&nbsp;&nbsp; D.t.yield();&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp; E.t.notify();&nbsp;&nbsp; F.&nbsp;&nbsp; a.notify(); G.t.interrupt(); <br>
Answer:C </span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black;  "></span></p> <a href="http://hi.baidu.com/lhylwh/blog/item/fd1ad70037d0fb10738b655c.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/fd1ad70037d0fb10738b655c.html#comment">查看评论</a>]]></description>
        <pubDate>2007-04-04  19:01</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/fd1ad70037d0fb10738b655c.html</guid>
</item>

<item>
        <title><![CDATA[Properties的基本用法]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/9be90108b3c06230e82488db.html]]></link>
        <description><![CDATA[
		
		<a name="1"><span class="atitle2"><font color="#000000">Properties&nbsp;基本知识</font></span></a><br>
如果不熟悉&nbsp;<font face="Arial"><code>java.util.Properties</code>&nbsp;类，那么现在告诉您它是用来在一个文件中存储键-值对的，其中键和值是用等号分隔的，如清单&nbsp;1&nbsp;所示。&nbsp;</font>
<p>&nbsp;<a name="listing1"><strong><font color="#000000">清单&nbsp;1.&nbsp;一组属性示例</font></strong></a><br>
<table cellspacing="0" cellpadding="5" width="400" bgcolor="#cccccc" border="1">
<tbody>
    <tr>
        <td>
<pre><code><font face="Arial">foo=barfu=baz</font></code></pre>
</td>
    </tr>
</tbody>
</table>
</p>
<p>将清单&nbsp;1&nbsp;装载到&nbsp;<font face="Arial"><code>Properties</code>&nbsp;对象中后，您就可以找到两个键（&nbsp;<code>foo</code>&nbsp;和&nbsp;<code>fu</code>&nbsp;）和两个值（&nbsp;<code>foo</code>&nbsp;的&nbsp;<code>bar</code>&nbsp;和&nbsp;<code>fu</code>&nbsp;的&nbsp;<code>baz</code>&nbsp;）了。</font></p>
<p>清单&nbsp;2&nbsp;显示了如何装载属性文件并列出它当前的一组键和值。只需传递这个文件的&nbsp;<font face="Arial"><code>InputStream&nbsp;</code>给&nbsp;<code>load()</code>&nbsp;方法，就会将每一个键-值对添加到&nbsp;<code>Properties</code>&nbsp;实例中。然后用&nbsp;<code>list()</code>&nbsp;列出所有属性或者用&nbsp;<code>getProperty()</code>&nbsp;获取单独的属性。&nbsp;</font></p>
<p><a name="listing2"><strong><font color="#000000">清单&nbsp;2.&nbsp;装载属性</font></strong></a><br>
<table cellspacing="0" cellpadding="5" width="500" bgcolor="#cccccc" border="1">
<tbody>
    <tr>
        <td>
<pre><code><font face="Arial">import&nbsp;java.util.*;</font></code></pre>
        <pre><code><font face="Arial">import&nbsp;java.io.*;public&nbsp;class&nbsp;LoadSample&nbsp;</font></code></pre>
        <pre><code><font face="Arial">{&nbsp;&nbsp;</font></code></pre>
        <pre><code></code><code><font face="Arial">public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;throws&nbsp;Exception&nbsp;{&nbsp;</font></code></pre>
        <pre><code><font face="Arial">&nbsp;&nbsp;&nbsp;Properties&nbsp;prop&nbsp;=&nbsp;new&nbsp;Properties();&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">&nbsp;FileInputStream&nbsp;fis&nbsp;=new&nbsp;FileInputStream("sample.properties");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.load(fis);&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.list(System.out);&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">System.out.println("\nThe&nbsp;foo&nbsp;property:&nbsp;"&nbsp;+prop.getProperty("foo"));&nbsp;&nbsp;}</font></code></pre>
        <pre><code><font face="Arial">}</font></code></pre>
</td>
    </tr>
</tbody>
</table>
</p>
<p>注意&nbsp;<font face="Arial"><code>list()</code>&nbsp;方法的输出中键-值对的顺序与它们在输入文件中的顺序不一样。&nbsp;<code>Properties</code>&nbsp;类在一个散列表（hashtable，事实上是一个&nbsp;<code>Hashtable</code>&nbsp;子类）中储存一组键-值对，所以不能保证顺序。</font></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>J2SE&nbsp;1.5&nbsp;以前的版本要求直接使用&nbsp;XML&nbsp;解析器来装载配置文件并存储设置。虽然这并非是一件困难的事情，并且解析器是平台的标准部分，但是额外的工作总是有点让人烦。最近更新的&nbsp;<font face="Arial"><code>java.util.Properties</code>&nbsp;类现在提供了一种为程序装载和存储设置的更容易的方法：&nbsp;<code>loadFromXML(InputStream&nbsp;is)</code>&nbsp;和&nbsp;<code>storeToXML(OutputStream&nbsp;os,&nbsp;String&nbsp;comment)</code>&nbsp;方法。&nbsp;</font></p>
<p><a name="listing4"><strong><font color="#000000">清单&nbsp;4.&nbsp;属性&nbsp;DTD</font></strong></a><br>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
<tbody>
    <tr>
        <td>
<pre><code><font face="Arial">&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;!--&nbsp;DTD&nbsp;for&nbsp;properties&nbsp;--&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;!ELEMENT&nbsp;properties&nbsp;(&nbsp;comment?,&nbsp;entry*&nbsp;)&nbsp;&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;!ATTLIST&nbsp;properties&nbsp;version&nbsp;CDATA&nbsp;#FIXED&nbsp;"1.0"&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;!ELEMENT&nbsp;comment&nbsp;(#PCDATA)&nbsp;&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;!ELEMENT&nbsp;entry&nbsp;(#PCDATA)&nbsp;&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;!ATTLIST&nbsp;entry&nbsp;key&nbsp;CDATA&nbsp;#REQUIRED&gt;</font></code></pre>
</td>
    </tr>
</tbody>
</table>
</p>
<p>如果不想细读&nbsp;XML&nbsp;DTD，那么可以告诉您它其实就是说在外围&nbsp;<font face="Arial"><code>&lt;properties&gt;</code>&nbsp;标签中包装的是一个&nbsp;<code>&lt;comment&gt;</code>&nbsp;标签，后面是任意数量的&nbsp;<code>&lt;entry&gt;</code>&nbsp;标签。对每一个&nbsp;<code>&lt;entry&gt;</code>&nbsp;标签，有一个键属性，输入的内容就是它的值。清单&nbsp;5&nbsp;显示了&nbsp;</font><a href="http://www-128.ibm.com/developerworks/cn/java/j-tiger02254/?ca=dwcn-newsletter-java#listing1">清单&nbsp;1</a>中的属性文件的&nbsp;XML&nbsp;版本是什么样子的。&nbsp;</p>
<p><a name="listing5"><strong><font color="#000000">清单&nbsp;5.&nbsp;XML&nbsp;版本的属性文件</font></strong></a><br>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
<tbody>
    <tr>
        <td>
<pre><code><font face="Arial">&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;!DOCTYPE&nbsp;properties&nbsp;SYSTEM&nbsp;"http://java.sun.com/dtd/properties.dtd"&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;properties&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;comment&gt;Hi&lt;/comment&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;entry&nbsp;key="foo"&gt;bar&lt;/entry&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;entry&nbsp;key="fu"&gt;baz&lt;/entry&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;/properties&gt;</font></code></pre>
</td>
    </tr>
</tbody>
</table>
</p>
<p>如果清单&nbsp;6&nbsp;所示，读取&nbsp;XML&nbsp;版本的&nbsp;<font face="Arial"><code>Properties</code>&nbsp;文件与读取老格式的文件没什么不同。&nbsp;</font></p>
<p><a name="listing6"><strong><font color="#000000">清单&nbsp;6.&nbsp;读取&nbsp;XML&nbsp;Properties&nbsp;文件</font></strong></a><br>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
<tbody>
    <tr>
        <td>
<pre><code><font face="Arial">import&nbsp;java.util.*;</font></code></pre>
        <pre><code><font face="Arial">import&nbsp;java.io.*;</font></code></pre>
        <pre><code><font face="Arial">public&nbsp;class&nbsp;LoadSampleXML&nbsp;{&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;throws&nbsp;Exception&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">Properties&nbsp;prop&nbsp;=&nbsp;new&nbsp;Properties();&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><font face="Arial"><code>FileInputStream&nbsp;fis&nbsp;=</code><code>new&nbsp;FileInputStream("sampleprops.xml");&nbsp;&nbsp;&nbsp;&nbsp;</code></font></pre>
        <pre><code><font face="Arial">prop.loadFromXML(fis);&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.list(System.out);&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">System.out.println("\nThe&nbsp;foo&nbsp;property:&nbsp;"&nbsp;+prop.getProperty("foo"));&nbsp;&nbsp;}</font></code></pre>
        <pre><code><font face="Arial">}</font></code></pre>
</td>
    </tr>
</tbody>
</table>
</p>
<p><a name="3"><span class="atitle2"><font color="#000000">保存&nbsp;XML&nbsp;属性</font></span></a><br>
新的&nbsp;<font face="Arial"><code>Properties</code>&nbsp;还有一个功能是将属性存储到&nbsp;XML&nbsp;格式的文件中。虽然&nbsp;<code>store()</code>&nbsp;方法仍然会创建一个类似&nbsp;</font><a href="http://www-128.ibm.com/developerworks/cn/java/j-tiger02254/?ca=dwcn-newsletter-java#listing1">清单&nbsp;1</a>&nbsp;所示的文件，但是现在可以用新的&nbsp;<font face="Arial"><code>storeToXML()</code>&nbsp;方法创建如&nbsp;</font><a href="http://www-128.ibm.com/developerworks/cn/java/j-tiger02254/?ca=dwcn-newsletter-java#listing5">清单&nbsp;5</a>&nbsp;所示的文件。只要传递一个&nbsp;<font face="Arial"><code>OutputStream</code>&nbsp;和一个用于注释的&nbsp;<code>String</code>&nbsp;就可以了。清单&nbsp;7&nbsp;展示了新的&nbsp;<code>storeToXML()</code>&nbsp;方法。&nbsp;</font></p>
<p><a name="listing7"><strong><font color="#000000">清单&nbsp;7.&nbsp;将&nbsp;Properties&nbsp;存储为&nbsp;XML&nbsp;文件</font></strong></a><br>
<table cellspacing="0" cellpadding="5" width="400" bgcolor="#cccccc" border="1">
<tbody>
    <tr>
        <td>
<pre><code><font face="Arial">import&nbsp;java.util.*;</font></code></pre>
        <pre><code><font face="Arial">import&nbsp;java.io.*;</font></code></pre>
        <pre><code><font face="Arial">public&nbsp;class&nbsp;StoreXML&nbsp;{&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;throws&nbsp;Exception&nbsp;{&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">&nbsp;Properties&nbsp;prop&nbsp;=&nbsp;new&nbsp;Properties();&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">&nbsp;prop.setProperty("one-two",&nbsp;"buckle&nbsp;my&nbsp;shoe");&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">&nbsp;prop.setProperty("three-four",&nbsp;"shut&nbsp;the&nbsp;door");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.setProperty("five-six",&nbsp;"pick&nbsp;up&nbsp;sticks");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.setProperty("seven-eight",&nbsp;"lay&nbsp;them&nbsp;straight");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.setProperty("nine-ten",&nbsp;"a&nbsp;big,&nbsp;fat&nbsp;hen");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">FileOutputStream&nbsp;fos&nbsp;=new&nbsp;FileOutputStream("rhyme.xml");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.storeToXML(fos,&nbsp;"Rhyme");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">fos.close();&nbsp;&nbsp;}</font></code></pre>
        <pre><code><font face="Arial">}</font></code></pre>
</td>
    </tr>
</tbody>
</table>
</p>
<p><a name="3"><span class="atitle2"><font color="#000000">保存&nbsp;XML&nbsp;属性</font></span></a><br>
新的&nbsp;<font face="Arial"><code>Properties</code>&nbsp;还有一个功能是将属性存储到&nbsp;XML&nbsp;格式的文件中。虽然&nbsp;<code>store()</code>&nbsp;方法仍然会创建一个类似&nbsp;</font><a href="http://www-128.ibm.com/developerworks/cn/java/j-tiger02254/?ca=dwcn-newsletter-java#listing1">清单&nbsp;1</a>&nbsp;所示的文件，但是现在可以用新的&nbsp;<font face="Arial"><code>storeToXML()</code>&nbsp;方法创建如&nbsp;</font><a href="http://www-128.ibm.com/developerworks/cn/java/j-tiger02254/?ca=dwcn-newsletter-java#listing5">清单&nbsp;5</a>&nbsp;所示的文件。只要传递一个&nbsp;<font face="Arial"><code>OutputStream</code>&nbsp;和一个用于注释的&nbsp;<code>String</code>&nbsp;就可以了。清单&nbsp;7&nbsp;展示了新的&nbsp;<code>storeToXML()</code>&nbsp;方法。&nbsp;</font></p>
<p><a name="listing7"><strong><font color="#000000">清单&nbsp;7.&nbsp;将&nbsp;Properties&nbsp;存储为&nbsp;XML&nbsp;文件</font></strong></a><br>
<table cellspacing="0" cellpadding="5" width="400" bgcolor="#cccccc" border="1">
<tbody>
    <tr>
        <td>
<pre><code><font face="Arial">import&nbsp;java.util.*;</font></code></pre>
        <pre><code><font face="Arial">import&nbsp;java.io.*;</font></code></pre>
        <pre><code><font face="Arial">public&nbsp;class&nbsp;StoreXML&nbsp;{&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;throws&nbsp;Exception&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">Properties&nbsp;prop&nbsp;=&nbsp;new&nbsp;Properties();&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.setProperty("one-two",&nbsp;"buckle&nbsp;my&nbsp;shoe");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.setProperty("three-four",&nbsp;"shut&nbsp;the&nbsp;door");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.setProperty("five-six",&nbsp;"pick&nbsp;up&nbsp;sticks");&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">&nbsp;prop.setProperty("seven-eight",&nbsp;"lay&nbsp;them&nbsp;straight");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.setProperty("nine-ten",&nbsp;"a&nbsp;big,&nbsp;fat&nbsp;hen");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">FileOutputStream&nbsp;fos&nbsp;=new&nbsp;FileOutputStream("rhyme.xml");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">prop.storeToXML(fos,&nbsp;"Rhyme");&nbsp;&nbsp;&nbsp;&nbsp;</font></code></pre>
        <pre><code><font face="Arial">fos.close();&nbsp;&nbsp;}</font></code></pre>
        <pre><code><font face="Arial">}</font></code></pre>
</td>
    </tr>
</tbody>
</table>
</p>
<p>运行清单&nbsp;7&nbsp;中的程序产生的输出如清单&nbsp;8&nbsp;所示。</p>
<p><a name="listing8"><strong><font color="#000000">清单&nbsp;8.&nbsp;存储的&nbsp;XML&nbsp;文件</font></strong></a><br>
<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
<tbody>
    <tr>
        <td>
<pre><code><font face="Arial">&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;!DOCTYPE&nbsp;properties&nbsp;SYSTEM&nbsp;"http://java.sun.com/dtd/properties.dtd"&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;properties&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;comment&gt;Rhyme&lt;/comment&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;entry&nbsp;key="seven-eight"&gt;lay&nbsp;them&nbsp;straight&lt;/entry&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;entry&nbsp;key="five-six"&gt;pick&nbsp;up&nbsp;sticks&lt;/entry&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;entry&nbsp;key="nine-ten"&gt;a&nbsp;big,&nbsp;fat&nbsp;hen&lt;/entry&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;entry&nbsp;key="three-four"&gt;shut&nbsp;the&nbsp;door&lt;/entry&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;entry&nbsp;key="one-two"&gt;buckle&nbsp;my&nbsp;shoe&lt;/entry&gt;</font></code></pre>
        <pre><code><font face="Arial">&lt;/properties&gt;</font></code></pre>
</td>
    </tr>
</tbody>
</table>
</p>
<p><a name="4"><span class="atitle2"><font color="#000000">结束语</font></span></a><br>
使用&nbsp;XML&nbsp;文件还是使用老式的&nbsp;a=b&nbsp;类型的文件完全取决于您自己。老式文件从内存的角度看肯定是轻量级的。不过，由于&nbsp;XML&nbsp;的普遍使用，人们会期望&nbsp;XML&nbsp;格式流行起来，因为它已经被广泛使用了，只不过没有用到&nbsp;<font face="Arial"><code>Properties</code>&nbsp;对象。</font></p> <a href="http://hi.baidu.com/lhylwh/blog/item/9be90108b3c06230e82488db.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/9be90108b3c06230e82488db.html#comment">查看评论</a>]]></description>
        <pubDate>2006-12-25  22:11</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/9be90108b3c06230e82488db.html</guid>
</item>

<item>
        <title><![CDATA[HashTable and HashMap]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/d7dd08f44c27d06edcc474dc.html]]></link>
        <description><![CDATA[
		
		<p>Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的，HashMap是Java&nbsp;1.2引进的Map接口的一个实现。<br>
<br>
也许最重要的不同是Hashtable的方法是同步的，而HashMap的方法不是。这就意味着，虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable，但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法，它创建一个线程安全的Map对象，并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时，你不能切断Hashtable中的同步（比如在一个单线程的应用程序中），而且同步增加了很多处理费用。<br>
<br>
第三点不同是，只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key，但任意数量的条目可以是空的value。这就是说，如果在表中没有发现搜索键，或者如果发现了搜索键，但它是一个空的值，那么get()将返回null。如果有必要，用containKey()方法来区别这两种情况。<br>
<br>
一些资料建议，当需要同步时，用Hashtable，反之用HashMap。但是，因为在需要时，HashMap可以被同步，HashMap的功能比Hashtable的功能更多，而且它不是基于一个陈旧的类的，所以有人认为，在各种情况下，HashMap都优先于Hashtable。<br>
<br>
关于Properties<br>
有时侯，你可能想用一个hashtable来映射key的字符串到value的字符串。DOS、Windows和Unix中的环境字符串就有一些例子，如key的字符串PATH被映射到value的字符串C:\WINDOWS;C:\WINDOWS\SYSTEM。Hashtables是表示这些的一个简单的方法，但Java提供了另外一种方法。<br>
<br>
<a name="baidusnap0"></a>Java.util.Properties类是Hashtable的一个子类，设计用于String&nbsp;keys和values。Properties对象的<a name="baidusnap5"></a>用法同Hashtable的用法相象，但是类增加了两个节省时间的方法，你应该知道。<br>
<br>
Store()方法把一个Properties对象的内容以一种可读的形式保存到一个文件中。Load()方法正好相反，用来读取文件，并设定Properties对象来包含keys和values。<br>
<br>
注意，因为Properties扩展了Hashtable，你可以用超类的put()方法来添加不是String对象的keys和values。这是不可取的。另外，如果你将store()用于一个不包含String对象的Properties对象，store()将失败。作为put()和get()的替代，你应该用setProperty()和getProperty()，它们用String参数。</p>
<p>转一篇关于两个类的区别，还是加强着方面的基本比较好,面试经常是从基础入手的.&nbsp;</p>
<div><font color="#333333">HashTable的应用非常广泛，HashMap是新框架中用来代替HashTable的类，也就是说建议使用HashMap，不要使用HashTable。</font></div>
<div>&nbsp;</div>
<div><font color="#333333">这里简单分析他们的区别。&nbsp;<br>
1.HashTable的方法是<font color="#0080ff">同步</font>的，HashMap<font color="#0080ff">未经同步</font>，所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。（最主要的区别）<br>
<br>
2.HashTable<font color="#0080ff">不允许null值</font>(key和value都不可以),<font color="#0080ff">HashMap允许null值(key和value都可以，只容许有一个null值的key，可以有多个null值的value</font>)。<br>
<br>
3.HashTable有一个contains(Object&nbsp;value)，功能和containsValue(Object&nbsp;value)功能一样。<br>
<br>
4.HashTable使用Enumeration，HashMap使用Iterator。<br>
<br>
以上只是表面的不同，它们的实现也有很大的不同。<br>
<br>
5.HashTable中hash数组默认大小是11，增加的方式是&nbsp;old*2+1。HashMap中hash数组的默认大小是16，而且一定是2的指数。<br>
<br>
6.哈希值的使用不同，HashTable直接使用对象的hashCode，代码是这样的：<br>
int&nbsp;hash&nbsp;=&nbsp;key.hashCode();<br>
int&nbsp;index&nbsp;=&nbsp;(hash&nbsp;&amp;&nbsp;0x7FFFFFFF)&nbsp;%&nbsp;tab.length;<br>
而HashMap重新计算hash值，而且用<a name="baidusnap1"></a>与代替求模：<br>
int&nbsp;hash&nbsp;=&nbsp;hash(k);<br>
int&nbsp;i&nbsp;=&nbsp;indexFor(hash,&nbsp;table.length);<br>
</font></div>
<div>
<table width="680" border="0">
<tbody>
    <tr>
        <td width="403"><font color="#333333" size="2">static&nbsp;int&nbsp;hash(Object&nbsp;x)&nbsp;{<br>
　　&nbsp;int&nbsp;h&nbsp;=&nbsp;x.hashCode();<br>
<br>
　　&nbsp;h&nbsp;+=&nbsp;~(h&nbsp;&lt;&lt;&nbsp;9);<br>
　　&nbsp;h&nbsp;^=&nbsp;(h&nbsp;&gt;&gt;&gt;&nbsp;14);<br>
　　&nbsp;h&nbsp;+=&nbsp;(h&nbsp;&lt;&lt;&nbsp;4);<br>
　　&nbsp;h&nbsp;^=&nbsp;(h&nbsp;&gt;&gt;&gt;&nbsp;10);<br>
　　&nbsp;return&nbsp;h;<br>
}<br>
static&nbsp;int&nbsp;indexFor(int&nbsp;h,&nbsp;int&nbsp;length)&nbsp;{<br>
　　&nbsp;return&nbsp;h&nbsp;&amp;&nbsp;(length-1);<br>
}<br>
以上只是一些比较突出的区别，当然他们的实现上还是有很多不同的，比如<br>
HashMap对null的操作。</font></td>
    </tr>
</tbody>
</table>
</div> <a href="http://hi.baidu.com/lhylwh/blog/item/d7dd08f44c27d06edcc474dc.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/d7dd08f44c27d06edcc474dc.html#comment">查看评论</a>]]></description>
        <pubDate>2006-12-25  21:50</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/d7dd08f44c27d06edcc474dc.html</guid>
</item>

<item>
        <title><![CDATA[Vista尝鲜]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/96d5b67e24ad1d380cd7da90.html]]></link>
        <description><![CDATA[
		
		<p>&nbsp;</p>
<div forimg="1" align="center"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/lhylwh/pic/item/9449a6ecf8876e3c27979121.jpg">&nbsp;
<div forimg="1" align="center"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/lhylwh/pic/item/b5b8cc804d4633d69023d921.jpg">&nbsp;
<div forimg="1" align="center"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/lhylwh/pic/item/7af86109b7434fce3ac76321.jpg">&nbsp;
<div forimg="1" align="center"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/lhylwh/pic/item/b6da810175f5b8d7267fb522.jpg">
<p>&nbsp;&nbsp;&nbsp;昨天心痒痒，去下了个Vista镜像，2.5G，但安装只要了20多分钟，据说是采用了什么新技术哦。感觉安装挺简单，但激活挺麻烦的。ＲＣ１可以免费获得产品密钥，但ＲＣ２就不行了，如果不激活，只能用３０天．</p>
<p>　先要覆盖两个文件，然后就可以用RC1的密钥激活了，激活之后出现＂评估副本＂的字样，很影响美观，还要修改一个user32.dll.mui的文件，先要将它的所有者改为管理员，然后再修改，修改用一个什么什么工具哦．</p>
<p>　　然后安装成功．弄了好一镇子．</p>
<p>　　感觉没什么特别的．玻璃效果一般，窗口切换功能挺炫。稳定性和兼容性太差了。装个酒精120%都要给我玩蓝屏，（记忆中用IBM还没蓝屏过）．很多程序都要提示存在兼容性问题．连自己的Sql&nbsp;server　2000也是．感觉1G的内存对一般用户来说就够了，对我来说就不行，运行个Eclipse＋PS内存就上80%,改天玩够了还是删了的好．贴几个图,做一下纪念.</p>
</div>
</div>
</div>
</div> <a href="http://hi.baidu.com/lhylwh/blog/item/96d5b67e24ad1d380cd7da90.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/96d5b67e24ad1d380cd7da90.html#comment">查看评论</a>]]></description>
        <pubDate>2006-12-20  18:34</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/96d5b67e24ad1d380cd7da90.html</guid>
</item>

<item>
        <title><![CDATA[HTML如何关闭窗口大全(经典+有用+常用)]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/bbcf6d6324571f600d33fa5e.html]]></link>
        <description><![CDATA[
		
		<p>window.close关闭窗口，不弹出系统提示，直接关闭<br>
===================================================<br>
当我们用这种方法:Response.Write("&lt;script&gt;window.close()&lt;/script&gt;") <br>
总是提示什么:你查看的网页试图关闭的提示 <br>
如何去掉提示，直接关闭窗体? <br>
可以用以下方法: <br>
Response.Write("&lt;script&gt;window.opener=null;window.close()&lt;/script&gt;") <br>
只有ie6才支持. <br>
opener只要设为任何值都可以,不会出现提示 </p>
<p><br>
如果是通过子窗体关闭父窗体时怎么做呢 <br>
子窗体（弹出窗体）： <br>
同理可得： <br>
Response.Write("&lt;script&gt;window.opener.top.opener=null;window.opener.top.close()&lt;/script&gt;")</p>
<p>============================================================<br>
最简单的无提示关闭窗口代码(直接复制便可用):<br>
 <br>
&lt;input type="button" onClick="window.opener = 'xxx';window.close();" <br>
value="IE6最简单的无提示关闭窗口" &gt; <br>
==============================================================<br>
关闭窗口有提示:<br>
&lt;input type="button" onClick="javascript:window.close();" value="关闭"&gt;<br>
&lt;a href="javascript:window.close();"&gt;关闭&lt;/a&gt;<br>
==============================================================<br>
自动关闭窗口代码:<br>
&lt;script language="javascript"&gt;<br>
&lt;!--<br>
function clock(){i=i-1<br>
document.title="本窗口将在"+i+"秒后自动关闭!"<br>
if(i&gt;0)setTimeout("clock();",1000);<br>
else self.close();}<br>
var i=20<br>
clock();<br>
//--&gt;<br>
&lt;/script&gt;<br>
在网页源代码中加入下面的代码，则该窗口将在20秒钟之后自动关闭！这与跳出式小窗口配合使用是再好不过啦！代码中“i=20”表示关闭的延迟时间为20秒，可任意修改。<br>
==================================================================<br>
无提示操作,自动关闭窗口<br>
&lt;script&gt;setTimeout("window.opener = 'xxx';window.close();;",1000);&lt;/script&gt;<br>
==================================================================<br>
怎么隐藏IE的菜单栏,工具栏和地址栏:<br>
&lt;script language="JavaScript"&gt;<br>
&lt;!--<br>
function MM_openBrWindow(theURL,winName,features) { //v2.0<br>
&nbsp;&nbsp; window.open(theURL,winName,features);<br>
}<br>
//--&gt;<br>
&lt;/script&gt;</p>
<p>&lt;a href="javascript:;" onClick="MM_openBrWindow('s.html','yy','width=300,height=300')"&gt;连接该页的地址&lt;/a&gt;<br>
===================================================================<br>
设置本窗口大小且定时自动无提示关闭:</p>
<p>&lt;BODY onload="top.resizeTo(300,300);"&gt;<br>
&lt;div align=center&gt;成功插入数据!&lt;br&gt;&lt;br&gt;<br>
&lt;/div&gt;<br>
&lt;script&gt;setTimeout("window.opener = 'xxx';window.close();;",2000);&lt;/script&gt;<br>
&lt;/BODY&gt;<br>
====================================================================<br>
点击连接弹出一特定(隐藏IE的菜单栏,工具栏和地址栏)窗口:</p>
<p>&lt;A HREF="s.html" onClick="javascript:window.open(this.href,'_blank','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,top=0,left=0,width=790,height=545');return false"&gt;新建窗口&lt;/a&gt;<br>
=====================================================================<br>
详细介绍设置窗口大小，IE的菜单栏,工具栏和地址栏：</p>
<p>设置窗口大小可以用resizeTo(),resizeBy()函数 把这段代码加到你网页源代码的&lt;head&gt;&lt;/head&gt;之间。 <br>
〈script language=javascript〉resizeTo(x,y)〈/script〉或者把其中的resizeBy() <br>
x,y是你想要的窗口的长宽，dx,dy是你想要窗口长宽增加的值。（dx,dy）是负数的时候就缩小了。 <br>
隐藏工具栏，菜单栏的话必须打开新窗口才行（下面的代码对IE而言，不同浏览器可能格式有所区别，open后面不要回车换行！） <br>
window.open("url","window_name","menubarbar=no,toolbar=no"&gt;&lt;/script〉 <br>
〈script&gt; url是你要在新窗口中显示的网页的地址，window_name是窗口的名字，做链接的时候可能用到，不用的话可以用""代替,menubarbar（菜单栏） toolbar （工具栏）locationbar（地址栏） status（状态栏） personalbar resizabla(是否允许调整大小) fullsreen（是否全屏）这些参数你可以按照同样的格式使用 </p>
<p>代码如果运行出错，就检查一下是否有多余的空格，还有那个“〈”“〉”，有一次我直接粘贴网页上的代码就好出过“〈”“〉”问题。</p>
<p>window.showModalDialog以及window.open用法简介 <br>
一、window.open()支持环境： JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+<br>
二、基本语法：<br>
window.open(pageURL,name,parameters) <br>
其中：<br>
pageURL 为子窗口路径 <br>
name 为子窗口句柄 <br>
parameters 为窗口参数(各参数用逗号分隔) <br>
三、示例：<br>
&lt;SCRIPT&gt; <br>
&lt;!-- <br>
window.open </p>
<p>('page.html','newwindow','height=100,width=400,top=0,left=0,toolbar=no,menubar=no,scrollba</p>
<p>rs=no, resizable=no,location=no, status=no') <br>
//写成一行 <br>
--&gt; <br>
&lt;/SCRIPT&gt;<br>
脚本运行后，page.html将在新窗体newwindow中打开，宽为100，高为400，距屏顶0</p>
<p>象素，屏左0象素，无工具条，无菜单条，无滚动条，不可调整大小，无地址栏，</p>
<p>无状态栏。<br>
请对照。<br>
上例中涉及的为常用的几个参数，除此以外还有很多其他参数，请见四。<br>
四、各项参数<br>
其中yes/no也可使用1/0；pixel value为具体的数值，单位象素。<br>
参数 | 取值范围 | 说明 <br>
| | <br>
alwaysLowered | yes/no | 指定窗口隐藏在所有窗口之后 <br>
alwaysRaised | yes/no | 指定窗口悬浮在所有窗口之上 <br>
depended | yes/no | 是否和父窗口同时关闭 <br>
directories | yes/no | Nav2和3的目录栏是否可见 <br>
height | pixel value | 窗口高度 <br>
hotkeys | yes/no | 在没菜单栏的窗口中设安全退出热键 <br>
innerHeight | pixel value | 窗口中文档的像素高度 <br>
innerWidth | pixel value | 窗口中文档的像素宽度 <br>
location | yes/no | 位置栏是否可见 <br>
menubar | yes/no | 菜单栏是否可见 <br>
outerHeight | pixel value | 设定窗口(包括装饰边框)的像素高度 <br>
outerWidth | pixel value | 设定窗口(包括装饰边框)的像素宽度 <br>
resizable | yes/no | 窗口大小是否可调整 <br>
screenX | pixel value | 窗口距屏幕左边界的像素长度 <br>
screenY | pixel value | 窗口距屏幕上边界的像素长度 <br>
scrollbars | yes/no | 窗口是否可有滚动栏 <br>
titlebar | yes/no | 窗口题目栏是否可见 <br>
toolbar | yes/no | 窗口工具栏是否可见 <br>
Width | pixel value | 窗口的像素宽度 <br>
z-look | yes/no | 窗口被激活后是否浮在其它窗口之上</p>
<p>window.showModalDialog使用手册 <br>
基本介绍：<br>
showModalDialog() (IE 4+ 支持)<br>
showModelessDialog() (IE 5+ 支持)<br>
window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框。<br>
window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框。</p>
<p>使用方法：<br>
vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])<br>
vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures])</p>
<p>参数说明：<br>
sURL--<br>
必选参数，类型：字符串。用来指定对话框要显示的文档的URL。<br>
vArguments--<br>
可选参数，类型：变体。用来向对话框传递参数。传递的参数类型不限，包括数组</p>
<p>等。对话框通过window.dialogArguments来取得传递进来的参数。<br>
sFeatures--<br>
可选参数，类型：字符串。用来描述对话框的外观等信息，可以使用以下的一个或</p>
<p>几个，用分号“;”隔开。<br>
1.dialogHeight :对话框高度，不小于１００px，ＩＥ４中dialogHeight 和 dialogWidth 默</p>
<p>认的单位是em，而ＩＥ５中是px，为方便其见，在定义modal方式的对话框</p>
<p>时，用px做单位。<br>
2.dialogWidth: 对话框宽度。<br>
3.dialogLeft: 离屏幕左的距离。<br>
4.dialogTop: 离屏幕上的距离。<br>
5.center: {yes | no | 1 | 0 }：窗口是否居中，默认yes，但仍可以指定高度和宽度。<br>
6.help: {yes | no | 1 | 0 }：是否显示帮助按钮，默认yes。<br>
7.resizable: {yes | no | 1 | 0 } ［ＩＥ５＋］：是否可被改变大小。默认no。<br>
8.status: {yes | no | 1 | 0 } ［IE5+］：是否显示状态栏。默认为yes[ </p>
<p>Modeless]或no[Modal]。<br>
9.scroll:{ yes | no | 1 | 0 | on | off }：指明对话框是否显示滚动条。默认为yes。<br>
下面几个属性是用在HTA中的，在一般的网页中一般不使用。<br>
10.dialogHide:{ yes | no | 1 | 0 | on | off }：在打印或者打印预览时对话框是否隐藏。</p>
<p>默认为no。<br>
11.edge:{ sunken | raised }：指明对话框的边框样式。默认为raised。<br>
12.unadorned:{ yes | no | 1 | 0 | on | off }：默认为no。</p>
<p>参数传递：<br>
1.要想对话框传递参数，是通过vArguments来进行传递的。类型不限制，对于字符</p>
<p>串类型，最大为4096个字符。也可以传递对象，例如：<br>
-------------------------------<br>
parent.htm<br>
&lt;script&gt;<br>
var obj = new Object();<br>
obj.name="51js";<br>
window.showModalDialog("modal.htm",obj,"dialogWidth=200px;dialogHeight=100px");<br>
&lt;/script&gt;<br>
modal.htm<br>
&lt;script&gt;<br>
var obj = window.dialogArguments<br>
alert("您传递的参数为：" + obj.name)<br>
&lt;/script&gt;<br>
-------------------------------<br>
2.可以通过window.returnValue向打开对话框的窗口返回信息，当然也可以是对象。</p>
<p>例如：<br>
------------------------------<br>
parent.htm<br>
&lt;script&gt;<br>
str =window.showModalDialog("modal.htm",,"dialogWidth=200px;dialogHeight=100px");<br>
alert(str);<br>
&lt;/script&gt;<br>
modal.htm<br>
&lt;script&gt;<br>
window.returnValue="http//blog.csdn.net/marsmao";<br>
&lt;/script&gt;</p>
<p><br>
</p> <a href="http://hi.baidu.com/lhylwh/blog/item/bbcf6d6324571f600d33fa5e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/bbcf6d6324571f600d33fa5e.html#comment">查看评论</a>]]></description>
        <pubDate>2006-12-17  01:56</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/bbcf6d6324571f600d33fa5e.html</guid>
</item>

<item>
        <title><![CDATA[关于在Eclipse中写servlet之serialVersionUID]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/c608c5fdab48e645d7887d75.html]]></link>
        <description><![CDATA[
		
		<font size="2">
<p style="LINE-HEIGHT: 16pt"><span class="bt">我在Eclipse中写Servlet的时候总是有黄色提示,这表示该"东西"没有被使用或是残缺.我就点它的提示,结果给我弄个serialVersionUID,查了查资料.可以了解一下.</span></p>
<p style="LINE-HEIGHT: 16pt"><span class="bt">serialVersionUID作用：&nbsp;<br>
序列化时为了保持版本的兼容性，即在版本升级时反序列化仍保持对象的唯一性。&nbsp;<br>
<br>
你可以随便写一个，在Eclipse中它替你生成一个，有两种生成方式：<br>
一个是默认的1L，比如：private&nbsp;static&nbsp;final&nbsp;long&nbsp;serialVersionUID&nbsp;=&nbsp;1L;<br>
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段，比如：private&nbsp;static&nbsp;final&nbsp;long&nbsp;serialVersionUID&nbsp;=&nbsp;-8940196742313994740L;之类的。<br>
<br>
当你一个类实现了Serializable接口，如果没有定义serialVersionUID，Eclipse会提供这个提示功能告诉你去定义之。&nbsp;<br>
在Eclipse中点击类中warning的图标一下，Eclipse就会自动给定两种生成的方式，如上面所述。如果不想定义它，在Eclipse的设置中也可以把它关掉的，设置如下：&nbsp;<br>
Window&nbsp;==&gt;&nbsp;Preferences&nbsp;==&gt;&nbsp;Java&nbsp;==&gt;&nbsp;Compiler&nbsp;==&gt;&nbsp;Error/Warnings&nbsp;==&gt;&nbsp;Potential&nbsp;programming&nbsp;problems&nbsp;<br>
将Serializable&nbsp;class&nbsp;without&nbsp;serialVersionUID的warning改成ignore即可。&nbsp;<br>
<br>
如果你没有考虑到兼容性问题时，就把它关掉，不过有这个功能是好的，只要任何类别实现了Serializable这个接口的话，如果没有加入serialVersionUID，Eclipse都会给你warning提示，这个serialVersionUID为了让该类别Serializable向后兼容。&nbsp;<br>
<br>
如果你的类Serialized存到硬盘上面后，可是后来你却更改了类别的field(增加或减少或改名)，当你Deserialize时，就会出现Exception的，这样就会造成不兼容性的问题。&nbsp;<br>
<br>
但当serialVersionUID相同时，它就会将不一样的field以type的预设值Deserialize，这个可以避开不兼容性的问题。</span>&nbsp;</p>
</font> <a href="http://hi.baidu.com/lhylwh/blog/item/c608c5fdab48e645d7887d75.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/c608c5fdab48e645d7887d75.html#comment">查看评论</a>]]></description>
        <pubDate>2006-12-16  22:53</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/c608c5fdab48e645d7887d75.html</guid>
</item>

<item>
        <title><![CDATA[Singleton]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/9de4740edbcbbfca7bcbe19b.html]]></link>
        <description><![CDATA[
		
		<p class="MsoNormal" >所谓的<font >singleton</font >指的是在整个<font >webapplication</font >的生命周期内<font >,</font >始终只有一个实例运行的设计模式<font >,</font >这种<font >singleton</font >模式<font >,</font >通常在外部环境和对象的属性相对较为稳定的条件下采用的模式<font >,singleton</font >模式可以节约资源<font >,</font >减少系统不必要的开销<font >,</font >因而最终可以提高系统的性能<font >.</font ></p >
<p class="MsoNormal" >目前可以采用两种方式实现<font >singleton</font >模式<font >,</font >其共同点是把构造器都声明为<font >private,</font >并提供一个<font >public static</font >成员<font >(</font >成员方法或者成员变量<font >),</font >允许客户存取唯一一个实体<font >.</font >下面将具体介绍这两种实现<font >singleton</font >模式的方法<font >:</font ></p >
<p class="MsoNormal" ><strong >方法一:把public static成员声明为final形式<o:p ></o:p ></strong ></p >
<p class="MsoNormal" >例如<font >:</font ></p >
<p class="MsoNormal" ><font >public class SingletonClass{</font ></p >
<p class="MsoNormal" align="center" ><font >public static final SingletonClass INSTANCE= new SingletonClass ();</font ></p >
<p class="MsoNormal" align="center" ><font >&nbsp;<o:p ></o:p ></font ></p >
<p class="MsoNormal" align="center" ><font >private SingletonClass(){</font ></p >
<p class="MsoNormal" align="center" ><font >&nbsp;<o:p ></o:p ></font ></p >
<p class="MsoNormal" align="center" ><font >}</font ></p >
<p class="MsoNormal" align="center" ><font >&nbsp;<o:p ></o:p ></font ></p >
<p class="MsoNormal" ><font >}</font ></p >
<p class="MsoNormal" >注意上面的成员变量声明为<font >final</font >形式<font >,</font >这可以保证<font >,</font >构造<font >SingletonClass</font >实例时<font >,</font >始终是同一个实例<font >,</font >在用<font >SingletonClass. INSTANCE</font >调用构造器时只能调用一次<font >,</font >从而<font >,</font >这种方式最终保证了运行期内<font >,</font >只有一个实例产生<font >.</font ></p >
<p class="MsoNormal" >&Oslash;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong >方法二:用public static factory method实现singleton<o:p ></o:p ></strong ></p >
<p class="MsoNormal" >例如<font >:</font ></p >
<p class="MsoNormal" ><font >public class SingletonClass{</font ></p >
<p class="MsoNormal" align="center" ><font >private static final SingletonClass INSTANCE= new SingletonClass ();</font ><font >&nbsp;<o:p ></o:p ></font ></p >
<p class="MsoNormal" align="center" ><font >private SingletonClass(){</font ><font >}</font ><font >&nbsp;<o:p ></o:p ></font ></p >
<p class="MsoNormal" align="center" ><font >public static SingletonClass getInstance(){</font ></p >
<p class="MsoNormal" align="center" ><font >return INSTANCE;</font ></p >
<p class="MsoNormal" align="center" ><font >}</font ></p >
<p class="MsoNormal" align="center" ><font >&nbsp;<o:p ></o:p ></font ></p >
<p class="MsoNormal" ><font >}</font ></p >
<p class="MsoNormal" >这种方式可以用<font >SingletonClass.getInstance()</font >方法进行单实例的构造<font >,</font >这种方式采用<font >getInstance</font >方法进行单实例的构造<font >,</font >把构造器声明为<font >private</font >形式<font >,</font >避免客户从其它路径进行实例的构造<font >.</font ></p >
<p >&nbsp; 在我们实际开发的过程中,在很多地方会用到单例模式,例如数据库链接池connection的读取,配置文件的读取等等,许多地方应该使用单例模式,以避免因实例的构造过多而造成程序整体性能上的损失</p > <a href="http://hi.baidu.com/lhylwh/blog/item/9de4740edbcbbfca7bcbe19b.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/9de4740edbcbbfca7bcbe19b.html#comment">查看评论</a>]]></description>
        <pubDate>2006-12-06  17:11</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/9de4740edbcbbfca7bcbe19b.html</guid>
</item>

<item>
        <title><![CDATA[血泪教训]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/a96928ddb5be1dd98c10295c.html]]></link>
        <description><![CDATA[
		
		<h4 class="TextColor1" style="MARGIN-BOTTOM: 0px" >JAVA程序员面试32问</h4 >
<div >
<div >第一，谈谈final, finally, finalize的区别。 <br />
final-修饰符（关键字）如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为 abstract的，又被声明为final的。将变量或方法声明为final，可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值，而在以后的引用中只能读取，不可修改。被声明为final的方法也同样只能使用，不能重载 <br />
finally-再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常，那么相匹配的 catch 子句就会执行，然后控制就会进入 finally 块（如果有的话）。 <br />
finalize-方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的，因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 </div >
<div >第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)? <br />
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类，但一个内部类可以作为一个接口，由另一个内部类实现。 </div >
<div >第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。 <br />
Nested Class （一般是C++的说法），Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&amp;page=1 <br />
注： 静态内部类（Inner Class）意味着1创建一个static内部类的对象，不需要一个外部类对象，2不能从一个static内部类的一个对象访问一个外部类对象 </div >
<div >第四，&amp;和&amp;&amp;的区别。 <br />
&amp;是位运算符。&amp;&amp;是布尔逻辑运算符。 </div >
<div >第五，HashMap和Hashtable的区别。 <br />
都属于Map接口的类，实现了将惟一键映射到特定的值上。 <br />
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 <br />
Hashtable 类似于 HashMap，但是不允许 null 键和 null 值。它也比 HashMap 慢，因为它是同步的。 </div >
<div >第六，Collection 和 Collections的区别。 <br />
Collections是个java.util下的类，它包含有各种有关集合操作的静态方法。 <br />
Collection是个java.util下的接口，它是各种集合结构的父接口。 </div >
<div ><br />
第七，什么时候用assert。 <br />
断言是一个包含布尔表达式的语句，在执行这个语句时假定该表达式为 true。如果表达式计算为 false，那么系统会报告一个 AssertionError。它用于调试目的： <br />
assert(a &gt; 0); // throws an AssertionError if a &lt;= 0 <br />
断言可以有两种形式： <br />
assert Expression1 ; <br />
assert Expression1 : Expression2 ; <br />
Expression1 应该总是产生一个布尔值。 <br />
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。 <br />
断言在默认情况下是禁用的。要在编译时启用断言，需要使用 source 1.4 标记： <br />
javac -source 1.4 Test.java <br />
要在运行时启用断言，可使用 -enableassertions 或者 -ea 标记。 <br />
要在运行时选择禁用断言，可使用 -da 或者 -disableassertions 标记。 <br />
要系统类中启用断言，可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。 <br />
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过，断言不应该用于验证传递给公有方法的参数，因为不管是否启用了断言，公有方法都必须检查其参数。不过，既可以在公有方法中，也可以在非公有方法中利用断言测试后置条件。另外，断言不应该以任何方式改变程序的状态。 </div >
<div ><br />
第八，GC是什么? 为什么要有GC? (基础)。 <br />
GC是垃圾收集器。Java 程序员不用担心内存管理，因为垃圾收集器会自动进行管理。要请求垃圾收集，可以调用下面的方法之一： <br />
System.gc() <br />
Runtime.getRuntime().gc() </div >
<div >第九，String s = new String(&quot;xyz&quot;);创建了几个String Object? <br />
两个对象，一个是&ldquo;xyx&rdquo;,一个是指向&ldquo;xyx&rdquo;的引用对象s。 </div >
<div >第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少? <br />
Math.round(11.5)返回（long）12，Math.round(-11.5)返回（long）-11; </div >
<div >第十一，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? <br />
short s1 = 1; s1 = s1 + 1;有错，s1是short型，s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。 </div >
<div >第十二，sleep() 和 wait() 有什么区别? 搞线程的最爱 <br />
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后，线程不一定立即恢复执行。这是因为在那个时刻，其它线程可能正在运行而且没有被调度为放弃执行，除非(a)&ldquo;醒来&rdquo;的线程具有更高的优先级 <br />
(b)正在运行的线程因为其它原因而阻塞。 <br />
wait()是线程交互时，如果线程对一个同步对象x 发出一个wait()调用，该线程会暂停执行，被调对象进入等待状态，直到被唤醒或等待时间到。 </div >
<div >&nbsp;</div >
<div >第十三，Java有没有goto? <br />
Goto-java中的保留字，现在没有在java中使用。 </div >
<div >第十四，数组有没有length()这个方法? String有没有length()这个方法？ <br />
数组没有length()这个方法，有length的属性。 <br />
String有有length()这个方法。 </div >
<div >第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? <br />
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，父类中的定义如同被&ldquo;屏蔽&rdquo;了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 </div >
<div >第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? <br />
Set里的元素是不能重复的，那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 <br />
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖，为的是当两个分离的对象的内容和类型相配的话，返回真值。 </div >
<div >第十七，给我一个你最常见到的runtime exception。 <br />
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, <br />
ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException </div >
<div >第十八，error和exception有什么区别? <br />
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 <br />
exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。 </div >
<div ><br />
第十九，List, Set, Map是否继承自Collection接口? <br />
List，Set是 </div >
<div >Map不是 </div >
<div >第二十，abstract class和interface有什么区别? <br />
声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 <br />
接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，instanceof 运算符可以用来决定某对象的类是否实现了接口。 </div >
<div >第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized? <br />
都不能 </div >
<div >第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? <br />
接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。 </div >
<div >第二十三，启动一个线程是用run()还是start()? <br />
启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 </div >
<div >&nbsp;</div >
<div >第二十四，构造器Constructor是否可被override? <br />
构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。 </div >
<div >第二十五，是否可以继承String类? <br />
String类是final类故不可以继承。 </div >
<div >第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法? <br />
不能，一个对象的一个synchronized方法只能由一个线程访问。 </div >
<div >第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后? <br />
会执行，在return前执行。 </div >
<div ><br />
第二十八，编程题: 用最有效率的方法算出2乘以8等於几? <br />
有C背景的程序员特别喜欢问这种问题。 </div >
<div >2 &lt;&lt; 3 </div >
<div >第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对? <br />
不对，有相同的hash code。 </div >
<div >第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递? <br />
是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。 </div >
<div ><br />
第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上? <br />
switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 </div >
<div >第三十二，编程题: 写一个Singleton出来。 <br />
Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。 <br />
一般Singleton模式通常有几种种形式: <br />
第一种形式: 定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 <br />
public class Singleton { <br />
　　private Singleton(){} <br />
　　//在自己内部定义自己一个实例，是不是很奇怪？ <br />
　　//注意这是private 只供内部调用 <br />
　　private static Singleton instance = new Singleton(); <br />
　　//这里提供了一个供外部访问本class的静态方法，可以直接访问　　 <br />
　　public static Singleton getInstance() { <br />
　　　　return instance; 　　 <br />
　　 } <br />
} <br />
第二种形式: <br />
public class Singleton { <br />
　　private static Singleton instance = null; <br />
　　public static synchronized Singleton getInstance() { <br />
　　//这个方法比上面有所改进，不用每次都进行生成对象，只是第一次　　　 　 <br />
　　//使用时生成实例，提高了效率！ <br />
　　if (instance==null) <br />
　　　　instance＝new Singleton(); <br />
return instance; 　　} <br />
} <br />
其他形式: <br />
定义一个类，它的构造函数为private的，所有方法为static的。 <br />
一般认为第一种形式要更加安全些 <br />
第三十三 Hashtable和HashMap <br />
Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现 </div >
<div >HashMap允许将null作为一个entry的key或者value，而Hashtable不允许 </div >
<div >还有就是，HashMap把Hashtable的contains方法去掉了，改成containsvalue和containsKey。因为contains方法容易让人引起误解。 </div >
<div >最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在 <br />
多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap <br />
就必须为之提供外同步。 </div >
<div >Hashtable和HashMap采用的hash/rehash算法都大概一样，所以性能不会有很大的差异。 <br />
</div >
</div >
<table cellspacing="0" border="0" >
    <tbody >
    </tbody >
</table >
<div class="footerLinks" >20:47&nbsp;| <nobr ><a title="单击为此项添加评论。" href="http://zhupan1984.spaces.live.com/blog/cns!78EBB680961CF721!110.entry#post" bvitemtype="post" ><font color="#370b89" >添加评论</font ></a ></nobr >&nbsp;| <nobr ><a title="单击以显示此项的固定链接。" href="http://zhupan1984.spaces.live.com/blog/cns!78EBB680961CF721!110.entry" ><font color="#370b89" >固定链接</font ></a ></nobr >&nbsp;| <nobr ><a title="单击以显示此项的引用通告。" href="http://zhupan1984.spaces.live.com/blog/cns!78EBB680961CF721!110.entry#trackback" bvitemtype="trackback" ><font color="#370b89" >引用通告 (0)</font ></a ></nobr >&nbsp;| <nobr ><a title="在您的共享空间中记录关于此项的日志。" ><font color="#370b89" >记录它</font ></a ></nobr >&nbsp;| <nobr ><a title="单击以显示此类别的所有项。" href="http://zhupan1984.spaces.live.com/?_c11_BlogPart_blogpart=blogview&amp;_c=BlogPart&amp;partqs=cat%3d%25e8%25ae%25a1%25e7%25ae%2597%25e6%259c%25ba%25e4%25b8%258e%2bInternet" ><font color="#370b89" >计算机与 Internet</font ></a ></nobr ></div >
<div class="footer" ><font color="#370b89" ></font ></div >
<div class="fixedTable bvEntry" bv:cns="cns!78EBB680961CF721!108" bv:ca="true" >
<h4 class="TextColor1" style="MARGIN-BOTTOM: 0px" >SCJP认证考试全接触</h4 >
<div >
<div >Java以其平台无关性、面向对象、支持多线程等优点成为越来越多的程序开发人员的新宠，Java技术以其独特的优势在越来越多的领域得以使用和发展。作为程序开发人员，为了检验对Java掌握的程度，参加Sun公司的Java认证考试是比较好的一个方法。两周前，我以83%成绩通过了SCJP1.4的认证考试，有一些体会想与大家分享。</div >
<div >　　想顺利通过考试，可以从以下几个方面着手:</div >
<div >　　1. 参加培训或自学Java经典课程。如果有C语言和面向对象的基础，只需自学SL275课程以及JDK1.4 API，否则应该参加相应的培训班进行学习。我对C语言和面向对象都有一些基础，同时又参加了SL275+Weblogic+JSP课程的学习。</div >
<div >　　2. 确定考试版本，明确考查的知识点及知识点的考查难度。目前SCJP考试有两个版本1.2和1.4，两个版本的比较如下表:</div >
<div >　　其中选择题有两种形式:(1)给出一段代码让选择其运行结果;(2)给出关于某基本概念的一些描述语句让选择正确的答案。填空题一般是给出一段正确的代码，不提供选择项，而让你填写上运行结果。</div >
<div >　　两个版本考查的知识点最大的差别在于310-025包含I/O、AWT，且对各个知识点的考查难度相对较容易，而310-035中去掉了I/O和AWT部分的内容，但增加了对Assertion的考查，同时对Wrapper classes、Collections、hashcode( )和equals( )考查的难度有所加大。所以要根据自己的情况选择合适的版本。我在复习时觉得I/O这一部分的内容较多且不好记忆，就选择了310-035，这个版本较难，也是对自己的一个挑战。</div >
<div >　　3. 根据考查的知识点做练习题。由于认证考试是以试题的形式来考查对知识点的掌握情况，所以多做题是通过考试的最有效方法之一，通过对SL275课程系统的学习，掌握了有关知识点的基础知识以后，必须通过做题来测试自己对知识点的掌握情况，书中写的有关知识点的内容比较概括，有时自己觉得已经掌握了这部分内容，但做题时可能会出现各式各样的错误，比如在声明main( )方法时应为public static void main( String args[ ] ){&hellip;&hellip;}，如果在声明时漏写了static，则在编译时可以通过，而运行时会提示出错信息;如果main( )中的参数写string args[ ]，则在编译时会提示出错，在考试时有类似的题目，故意设一些陷阱，一不小心看似简单的问题却有可能失分。对于给出一段程序代码要求选择其运行结果的题目，最好亲手调试并分析其结果。</div >
<div >　　对考查Wrapper classes、Collections、hashcode( )和equals( )方法的题目要认真查看API文档(Sun官方网站提供了下载的链接，也可以在Sun网站上在线查看)并做好笔记供以后查阅。通过做题巩固知识点、适应考试题型、找出容易出错的地方，同时对所学知识点也起到了查漏补缺的作用。</div >
<div >　　4. 下载相应的模拟环境进行实战训练，或者在线测试。知识点和题型都掌握以后，还不要急于考试，应该从网上下载一个模拟考试环境的软件进行实战演练。我下载了Jcertify5.0，它需在JDK1.3环境下安装运行，该软件可以设置考查的范围进行practice或者test，是一个很不错的模拟软件，里面的题目与实际考试题目难易程度相当。</div >
<div >　　通过该软件可以检验你在规定的时间内(120分钟)完成题目的情况及各个知识点掌握的程度，这样就可以根据测验结果有针对性的复习掌握的不太好的知识点，反复测验、练习，直到自己满意为止。</div >
<div >　　5. 考前给自己足够的信心。通过做练习和模拟软件测验，对各个知识点都比较有把握以后，其实这时参加考试已经没有问题了，要相信自己的实力，给自己加油，此时切不可再做较难的题目，我当时就犯了这样的大忌，听说310-035的考试比较难，目前通过的人数不多，我怕考试时的题目比我做的练习题难，在考试的前一天，又做了一套题目，共43题，通过率为仅为42%，这个结果令我很失望，也丧失了自信心，晚上做梦一直考试且考试结果很糟糕，第二天醒来头昏脑胀，本来预约好的考试不得不往后推迟，这是沉痛的教训。</div >
<div >　　6. 预约、考试。知名的IT认证厂商在一些大城市都有指定的考试中心，Sun认证也不例外，考试前三天到Sun指定的考试中心报名，由他们帮你注册，除了考试做题，其他的事情你尽管交给考试中心去做就行了。</div >
<div >　　7. 考试注意事项。按预约的时间提前到达考试中心，熟悉考试环境，稳定情绪，考试中心在考场里设置有监视器，你的一举一动都会被录制下来，所以考试来不得半点虚假，尽早打消&ldquo;打小抄&rdquo;的念头。考务人员帮你进入考试系统后，开始进行考试，考试分三个阶段:</div >
<div >　　(1)正式考试前的问卷调查，给定时间为15分，有10来个问题，给出四个选项供你选择，主要调查你对SCJP要考查的知识点的掌握情况，如对数组、类的定义是精通、是了解但需要别人帮助还是不懂等，这部分内容的回答不影响你的考试成绩，如果你读懂问题的意思了，你可以根据自己的实际情况进行选择，否则你尽管随意选一个，一路Next下去，直到所有的问题做完;</div >
<div >　　(2)正式考试，共120分钟，选择题在题面中注明了正确答案的数目(如:choose two)，按Next做下一题，单击exhibit按钮查看题目提供的代码;</div >
<div >　　(3)题目做完后的问卷调查，同样也不影响你的考试结果。问卷结束后紧张、激动的时刻就要到了，此时你可以查看考试结果，考试系统列出你对各个知识点答题情况的一览表，如果你的成绩超过指定的分数底线，则Result即为Pass。</div >
<div >　　拿到考试结果通知单的一刻是令人兴奋的，考后的总体感觉是SCJP认证并不像自己想象的那么难，只要你做好了充分的准备，拿到SCJP认证证书不成问题。<br />
</div >
</div >
</div > <a href="http://hi.baidu.com/lhylwh/blog/item/a96928ddb5be1dd98c10295c.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/a96928ddb5be1dd98c10295c.html#comment">查看评论</a>]]></description>
        <pubDate>2006-12-01  01:00</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/a96928ddb5be1dd98c10295c.html</guid>
</item>

<item>
        <title><![CDATA[J2EE的准备篇，写的不错，看看也好！]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/9449a6ecdd4c0b3d27979119.html]]></link>
        <description><![CDATA[
		
		<p >1 什么是J2EE？它和普通的Java有什么不同？ <br />
答：J2EE全称为Java2 Platform, Enterprise Edition。 <br />
&ldquo;J2EE平台本质上是一个分布式的服务器应用程序设计环境&mdash;&mdash;一个Java环境，它提供了： <br />
&middot;宿主应用的一个运行基础框架环境。 <br />
&middot;一套用来创建应用的Java扩展API。&rdquo;（引自《J2EE服务器端高级编程》） <br />
<br />
2 J2EE好学吗？ <br />
答：J2EE是很多技术的集合体，并且还在成长中。 <br />
你会遇到很多专有名词：比如(X)HTML，Servlet/JSP，JDBC，JMS，JNDI，EJB，XML，Web Service&hellip;&hellip;。 <br />
尤其是XML和Web Service正在快速成长。幸运的是，你不需要等到学会所有技术后再开始编程。 <br />
大体上J2EE可以分成3个主要应用：Servlet/JSP，EJB，XML/Web Service 和一些支撑技术例如JDBC和JNDI。 <br />
你可以一个一个的学。 <br />
<br />
3 J2EE有什么用？ <br />
答：用来建设大型的分布式企业级应用程序。或者用更时髦的名词说就是&ldquo;电子商务&rdquo;应用程序。 <br />
这些企业可能大到拥有中心数据库服务器，Web服务器集群和遍布全国的办公终端，也可能小到只不过想做一个网站。 <br />
<br />
4 学J2EE有前途吗？ <br />
答：在这一市场目前只有一种技术可以和J2EE竞争，那就是Microsoft的.NET。 <br />
相对来说.NET要&ldquo;新&rdquo;一些而J2EE要&ldquo;老&rdquo;一些。 <br />
但是.NET只能用于Windows平台（Microsoft声称要开发C#在Linux上的虚拟机但是尚未兑现该诺言）， <br />
考虑到Linux的发展势头，你可以相信.NET不会一统天下。 <br />
<br />
5 据说J2EE的性能不如.NET好，是真的吗？ <br />
答：在Sun公司提供的样例程序Pet Store上，Microsoft声称不如相同的.NET程序好。 <br />
而Sun公司反驳说这一程序不能真正体现J2EE的性能，并且指责Microsoft在数据库上做了优化。 <br />
作者没有学习过.NET因而不能妄下断言。 <br />
无论如何，大型分布式程序中的性能瓶颈通常首先来自于错误的设计。 <br />
<br />
6 听你说了这么多，我想学着玩玩。 <br />
答：除非你想靠它当饭吃或者作为技术储备，否则请不要浪费你的时间。 <br />
Flash要好玩得多。计算机游戏就更加好玩了。 <br />
<br />
7 学习J2EE该怎么开始？ <br />
答：首先，下载一个J2EE服务器。其次，去java.sun.com下载J2EE的API。第三，找一本好的参考书。最后，找一个顺手的IDE。 <br />
J2EE服务器。你可以用Sun的J2EE SDK（免费），或者Weblogic（性能最好，但是太大，而且作者不推荐盗版行为），或者JBoss（免费，就是文档太少），或者JRun（开发版免费，作者用这个）。参考书作者感觉Wrox的《J2EE服务器端高级编程》不错，但是太老（作者手头的是2001年中文版）。你还需要去下载一些最新的技术资料（当然肯定是英文的）。 <br />
IDE如果你的机器配置够好（内存至少512M以上，256M或以下请勿考虑），可以用IBM的WSAD，不然就继续用Eclipse或者其他。 <br />
你也可以经常去水木清华的Java版逛逛，但是在发贴前先看看精华区里有没有你要的答案。 <br />
<br />
8 我下了一个J2EE服务器但是不会配置。 <br />
答：请认真阅读随机指导文档，不同的服务器的配置都不一样，作者爱莫能助。 <br />
<br />
9 我发现你没有提到Tomcat。 <br />
答：Tomcat只是一个Web服务器，更准确地说主要只是一个Web Container。 <br />
如果你想要学习EJB的话，Tomcat无法满足你的需要。 <br />
<br />
二、 Servlet/JSP篇 <br />
<br />
10 什么是Servlet？ <br />
答：一个Servlet是一个Java类。它处理Http(s)请求并作出响应，包括返回一个HTML页面或转交给其他URL处理。 <br />
Servlet必须运行在一个Web Container例如Tomcat中。 <br />
Servlet必须是javax.servlet.http.HttpServlet的子类， <br />
你可以继承doGet()或者doPost()方法，两者分别对应于Http(s)中的Get请求和Post请求。 <br />
<br />
11 我怎么获得Http请求里的参数？ <br />
答：HttpRequest的getParameter()方法。例如：String paramValue = request.getParameter(&quot;paramName&quot;); <br />
<br />
12 我怎么返回结果？ <br />
答：你可以利用相关API打开一个输出流，并向流中直接写入一个HTML页面。 <br />
但是作者完全不赞成这样做。一方面这样做会很罗嗦。 <br />
另一方面从Model-View-Controller模式（在《J2EE核心模式》中被归为Front Controller模式）的观点来看， <br />
你应当提供一些HTML或者JSP作为视图（view），而Servlet则根据请求参数决定转到哪一个视图。 <br />
你可以利用response.sendRedirect(...)方法或request.getDispatcher(...).forward()方法来实现。 <br />
<br />
13 sendRedirect()和forward()有什么不同？ <br />
答：sendRedirect()是向浏览器发送一个redirect通知，浏览器重定向到新的URL。 <br />
而forward是在服务器端直接转到新的URL，对于浏览器是透明的。 <br />
前者浏览器的地址栏显示的是新的URL，后者浏览器的地址栏显示的是Servlet的URL。 <br />
因而当目标URL会自动刷新时，两者会造成一些差别。 <br />
<br />
14 我写了一个Servlet程序，怎么运行它？ <br />
答：开发J2EE程序有一个部署（deploy）的概念，实际上是开发&mdash;&mdash;部署&mdash;&mdash;运行的三部曲。 <br />
大多数服务器支持Hot deploy。你只需要在相应的Application目录（具体路径依赖于服务器）下面 <br />
建立一个符合WAR或EAR格式（参见16，17）的目录，启动服务器，就可以通过浏览器访问了。 <br />
特别的，你的Servlet的class文件应当放在/WEB-INF/classes目录中。 <br />
注意J2EE SDK不支持Hot deploy，你需要通过它的deploy tool来部署。 <br />
Tomcat只支持WAR格式。 <br />
<br />
15 EAR和WAR有什么不同？ <br />
答：EAR是一个完整的J2EE应用程序，包括Web部分和EJB部分。 <br />
WAR只是其中的Web部分。 <br />
<br />
16 EAR格式是怎样的？ <br />
答：一个EAR可以包含任意多个WAR或EJB JAR，并且包含一个META-INF的目录。 <br />
在/META-INF中包含了一个application.xml，其中描述了这个EAR包含哪些模块，以及安全性配置。 <br />
细节请看参考书。 <br />
<br />
17 WAR格式是怎样的？ <br />
答：一个WAR包含一个WEB-INF的目录，这个目录下包含classes目录，lib目录和web.xml。 <br />
/WEB-INF/classes存放按package组织的class文件，/WEB-INF/lib目录存放jar文件， <br />
web.xml描述了很多东西，请读参考书。 <br />
<br />
18 我的普通HTML文件应当放在哪里？ <br />
答：放在除了/WEB-INF以外的其他地方。 <br />
<br />
19 我访问不到servlet，甚至连HTML文件都访问不到！ <br />
答：第一你没启动服务器。第二你敲错了端口。第三你没有正确配置context-path。 <br />
第四你的服务器不支持auto reload或者你关闭了这一选项，你得重启服务器。 <br />
第五确认你没有把HTML放在/WEB-INF目录下，那是访问不到的。 <br />
<br />
20 我能访问HTML但是访问不到servlet。 <br />
答：请检查你的web.xml文件。确保你正确定义了&lt;servlet&gt;和&lt;servlet-mapping&gt;元素。 <br />
前者标识了一个servlet，后者将一个相对于context-path的URL映射到一个servlet。 <br />
在Tomcat中你可以通过/context-path/servlet/package/servletname的形式访问servlet， <br />
但是这只是Tomcat的便捷访问方式，并不是正式规范。 <br />
细节请看参考书。 <br />
<br />
21 什么是JSP？它和Servlet有什么区别？ <br />
答：你可以将JSP当做一个可扩充的HTML来对待。 <br />
虽然在本质上JSP文件会被服务器自动翻译为相应的Servlet来执行。 <br />
可以说Servlet是面向Java程序员而JSP是面向HTML程序员的，除此之外两者功能完全等价。 <br />
<br />
22 我的JSP显示的汉字是乱码。 <br />
答：在你的JSP开头加上一行 &lt;%@ page contentType=&quot;text/html; charset=gb2312&quot;%&gt; <br />
如果你已经声明了page我想你知道该怎么修改。 <br />
<br />
23 JSP文件存放在哪里？ <br />
答：除了/WEB-INF下的任何地方。 <br />
<br />
24 在JSP里面怎么引用Java Bean。 <br />
答：首先，确认你要引用的类在/WEB-INF/classes下或在/WEB-INF/lib的某个jar内。 <br />
其次，在JSP里加一行 &lt;jsp:useBean id=&quot;...&quot; scope=&quot;...&quot; class=&quot;...&quot;/&gt; <br />
具体解释请看参考书。 <br />
<br />
25 我想在servlet间传递数据。 <br />
答：利用session。在Servlet/JSP中，你可以在4个地方保存数据。 <br />
1) page，本页面。 <br />
2) session，用来存放客户相关的信息，比如购物车，对应接口为javax.servlet.http.HttpSession。 <br />
session机制实际上是cookie和URL Rewrite的抽象，服务器会自动使用cookie或URL Rewrite来实现。 <br />
3) request，可以在forward()时传递信息，对应接口为javax.servlet.http.HttpRequest。 <br />
4) application，或称context，存放全局信息，对应接口为javax.servlet.ServletContext。 <br />
<br />
26 怎么调用cookie？ <br />
答：作者建议使用session，你总是会遇到某些禁用cookie的用户。这时session会自动使用URL重写来实现。 <br />
<br />
27 怎么在JSP里面实现文件下载？ <br />
答：实际上这是一个HTML的问题。答案是一个超链接&lt;a&gt;。 <br />
<br />
28 怎么实现文件上传？ <br />
答：客户端是HTML问题，在form中设置method为post，enctype为multi-part/form-data，加一个&lt;input type=&quot;file&quot;&gt;。 <br />
而在接收的servlet中只是一个I/O问题。 <br />
<br />
29 我想让页面自动刷新，比如聊天室。 <br />
答：这是一个HTML问题，在&lt;head&gt;部分中加一条&lt;meta http-equiv=&quot;refresh&quot; content=&quot;5&quot; url=&quot;...&quot;&gt;。 <br />
这是所谓的Clinet-push，客户端刷新技术。 <br />
<br />
30 我想让用户登录以后才能访问页面。 <br />
答：使用声明式安全措施。 <br />
你只需要在web.xml中定义安全角色（Role），并定义受保护的URL集合只能由特定Role访问。 <br />
大多数服务器支持基于数据库的用户映射，你只要在相应数据库中建立两张表并配置服务器就可以了。 <br />
注意J2EE SDK不支持基于数据库的用户映射。 <br />
细节请看参考书和服务器文档。 <br />
<br />
31 我想要能注册用户。 <br />
答：参看30。在接受注册请求的Servlet中执行写入数据库操作即可。 <br />
<br />
32 怎么在JSP中访问数据库？ <br />
答：标准做法是使用DAO模式，定义一个Java bean来访问数据库并在JSP中使用。 <br />
然而，当你的数据库模式很简单时，你可以使用JSTL中的&lt;sql:query&gt;标签来快速访问。 <br />
<br />
33 什么是JSTL？ <br />
答：JSTL是Jsp Standard Tag Library的缩写。这是一组通用标签并将成为JSP 2.0的一部分。 <br />
其中包含赋值&lt;c:set&gt;，分支&lt;c:if&gt;，循环&lt;c:forEach&gt;，查询数据库&lt;sql:query&gt;，更新数据库&lt;sql:update&gt; <br />
等。目前你需要像添加自定义标签库一样来添加JSTL，但是可以预计JSP 2.0会将JSTL作为组成部分。 <br />
标签库可以在<a href="http://jakarta.apache.org/" target="_blank" >http://jakarta.apache.org</a >下载。注意JSTL需要在支持JSP1.2或更高版本的容器下运行。 <br />
帮助文件可以阅读sun的JSTL正式规范。 <br />
</p > <a href="http://hi.baidu.com/lhylwh/blog/item/9449a6ecdd4c0b3d27979119.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/9449a6ecdd4c0b3d27979119.html#comment">查看评论</a>]]></description>
        <pubDate>2006-11-25  16:15</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/9449a6ecdd4c0b3d27979119.html</guid>
</item>

<item>
        <title><![CDATA[String str=&#34;abc&#34;的工作机制（要弄清楚了哈）]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/899292eeb6f274292cf534d7.html]]></link>
        <description><![CDATA[
		
		<p >先说说关于String str = &quot;abc&quot;的内部工作。Java内部将此语句转化为以下几个步骤：</p >
<p >　　(1)先定义一个名为str的对String类的对象引用变量：String str；</p >
<p >　　(2)在栈中查找有没有存放值为&quot;abc&quot;的地址，如果没有，则开辟一个存放字面值为&quot;abc&quot;的地址，接着创建一个新的String类的对象o，并将 o的字符串值指向这个地址，而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为&quot;abc&quot;的地址，则查找对象o，并返回o的地址。</p >
<p >　　(3)将str指向对象o的地址。</p >
<p >　　值得注意的是，一般String类中字符串值都是直接存值的。但像String str = &quot;abc&quot;；这种场合下，其字符串值却是保存了一个指向存在栈中数据的引用！</p > 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/899292eeb6f274292cf534d7.html#comment">查看评论</a>]]></description>
        <pubDate>2006-11-13  00:57</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/899292eeb6f274292cf534d7.html</guid>
</item>

<item>
        <title><![CDATA[一道Java牛题]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/59a632a81035c3b1ca130cd4.html]]></link>
        <description><![CDATA[
		
		<p >（Java练习题）</p >
<div forimg="1" align="left" ><a target="_blank" href="http://hiphotos.baidu.com/lhylwh/abpic/item/e30b7d899f99ecb30e2444ea.jpg" ></a ></div >
<p ><a target="_blank" href="http://hiphotos.baidu.com/lhylwh/abpic/item/e30b7d899f99ecb30e2444ea.jpg" ><img class="blogimg" border="0" small="1" src="http://hiphotos.baidu.com/lhylwh/abpic/item/e30b7d899f99ecb30e2444ea.jpg" /></a ></p >
<p >要求从键盘输入一数字，然后中文输出（要符合中文语法）<br />
例：12434&nbsp;&nbsp; 输出 一万二千四百三十四。</p >
<p ><br />
</p >
<div forimg="1" align="left" ><a target="_blank" href="http://hiphotos.baidu.com/lhylwh/abpic/item/e30b7d899f99ecb30e2444ea.jpg" ></a ></div > 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/59a632a81035c3b1ca130cd4.html#comment">查看评论</a>]]></description>
        <pubDate>2006-11-13  00:20</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/59a632a81035c3b1ca130cd4.html</guid>
</item>

<item>
        <title><![CDATA[关于集合类的几个问题]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/c608c5fd81c4dc45d7887de9.html]]></link>
        <description><![CDATA[
		
		<div forimg="1" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Collection&lt;--List&lt;--Vector<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection&lt;--List&lt;--ArrayList<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection&lt;--List&lt;--LinkedList<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection&lt;--Set&lt;--HashSet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection&lt;--Set&lt;--HashSet&lt;--LinkedHashSet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection&lt;--Set&lt;--SortedSet&lt;--TreeSet<br />
<br />
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/lhylwh/pic/item/bcc74c90d764908da877a44a.jpg" /></div >
<p >&middot; Collection 接口是一组允许重复的对象。<br />
<br />
　　&middot; Set 接口继承 Collection，但不允许重复，使用自己内部的一个排列机制。 <br />
<br />
　　&middot; List 接口继承 Collection，允许重复，以元素安插的次序来放置元素，不会重新排列。<br />
<br />
　　&middot; Map接口是一组成对的键－值对象，即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。<br />
<br />
　　&middot; 容器中的元素类型都为Object。从容器取得元素时，必须把它转换成原来的类型。<br />
<br />
<br />
　　Java 2简化集合框架图<br />
<br />
<br />
集合接口<br />
<br />
　　1.Collection 接口<br />
<br />
　　用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时，就使用这一接口。<br />
<br />
<br />
<br />
　　(1) 单元素添加、删除操作：<br />
<br />
　　　boolean add(Object o):将对象添加给集合<br />
<br />
　　　boolean remove(Object o): 如果集合中有与o相匹配的对象，则删除对象o<br />
<br />
　　(2) 查询操作：<br />
<br />
　　　int size() ：返回当前集合中元素的数量<br />
<br />
　　　boolean isEmpty() ：判断集合中是否有任何元素<br />
<br />
　　　boolean contains(Object o) ：查找集合中是否含有对象o<br />
<br />
　　　Iterator iterator() ：返回一个迭代器，用来访问集合中的各个元素<br />
<br />
　　(3) 组操作 ：作用于元素组或整个集合<br />
<br />
　　　boolean containsAll(Collection c): 查找集合中是否含有集合c 中所有元素<br />
<br />
　　　boolean addAll(Collection c) : 将集合c 中所有元素添加给该集合<br />
<br />
　　　void clear(): 删除集合中所有元素<br />
<br />
　　　void removeAll(Collection c) : 从集合中删除集合c 中的所有元素<br />
<br />
　　　void retainAll(Collection c) : 从集合中删除集合c 中不包含的元素<br />
<br />
　　(4) Collection转换为Object数组 ：<br />
<br />
　　　Object[] toArray() ：返回一个内含集合所有元素的array<br />
<br />
　　　Object[] toArray(Object[] a) ：返回一个内含集合所有元素的array。运行期返回的array和参数a的型别相同，需要转换为正确型别。<br />
<br />
　　此外，您还可以把集合转换成其它任何其它的对象数组。但是，您不能直接把集合转换成基本数据类型的数组，因为集合必须持有对象。<br />
<br />
　　&ldquo;斜体接口方法是可选的。因为一个接口实现必须实现所有接口方法，调用程序就需要一种途径来知道一个可选的方法是不是不受支持。如果调用一种可选方法时，一个 UnsupportedOperationException 被抛出，则操作失败，因为方法不受支持。此异常类继承 RuntimeException 类，避免了将所有集合操作放入 try-catch 块。&rdquo;<br />
<br />
　　Collection不提供get()方法。如果要遍历Collectin中的元素，就必须用Iterator。<br />
<br />
　　1.1.AbstractCollection 抽象类 <br />
<br />
　　AbstractCollection 类提供具体&ldquo;集合框架&rdquo;类的基本功能。虽然您可以自行实现 Collection 接口的所有方法，但是，除了iterator()和size()方法在恰当的子类中实现以外，其它所有方法都由 AbstractCollection 类来提供实现。如果子类不覆盖某些方法，可选的如add()之类的方法将抛出异常。<br />
<br />
　　1.2.Iterator 接口<br />
<br />
　　Collection 接口的iterator()方法返回一个 Iterator。Iterator接口方法能以迭代方式逐个访问集合中各个元素，并安全的从Collection 中除去适当的元素。<br />
<br />
<br />
<br />
　　(1) boolean hasNext(): 判断是否存在另一个可访问的元素<br />
<br />
　　　　Object next(): 返回要访问的下一个元素。如果到达集合结尾，则抛出NoSuchElementException异常。<br />
<br />
　　(2) void remove(): 删除上次访问返回的对象。本方法必须紧跟在一个元素的访问后执行。如果上次访问后集合已被修改，方法将抛出IllegalStateException。<br />
<br />
　　&ldquo;Iterator中删除操作对底层Collection也有影响。&rdquo;<br />
<br />
　　迭代器是 故障快速修复（fail-fast）的。这意味着，当另一个线程修改底层集合的时候，如果您正在用 Iterator 遍历集合，那么，Iterator就会抛出 ConcurrentModificationException （另一种 RuntimeException异常）异常并立刻失败。<br />
<br />
<br />
2.List接口<br />
<br />
　　List 接口继承了 Collection 接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理，还添加了面向位置的操作。<br />
<br />
<br />
<br />
　　(1) 面向位置的操作包括插入某个元素或 Collection 的功能，还包括获取、除去或更改元素的功能。在 List 中搜索元素可以从列表的头部或尾部开始，如果找到元素，还将报告元素所在的位置 :<br />
<br />
　　void add(int index, Object element): 在指定位置index上添加元素element<br />
<br />
　　boolean addAll(int index, Collection c): 将集合c的所有元素添加到指定位置index<br />
<br />
　　Object get(int index): 返回List中指定位置的元素<br />
<br />
　　int indexOf(Object o): 返回第一个出现元素o的位置，否则返回-1<br />
<br />
　　int lastIndexOf(Object o) ：返回最后一个出现元素o的位置，否则返回-1<br />
<br />
　　Object remove(int index)　：删除指定位置上的元素<br />
<br />
　　Object set(int index, Object element) ：用元素element取代位置index上的元素，并且返回旧的元素<br />
<br />
　　(2) List 接口不但以位置序列迭代的遍历整个列表，还能处理集合的子集：<br />
<br />
　　　ListIterator listIterator() : 返回一个列表迭代器，用来访问列表中的元素<br />
<br />
　　　ListIterator listIterator(int index) : 返回一个列表迭代器，用来从指定位置index开始访问列表中的元素<br />
<br />
　　List subList(int fromIndex, int toIndex) ：返回从指定位置fromIndex（包含）到toIndex（不包含）范围中各个元素的列表视图<br />
<br />
　　&ldquo;对子列表的更改（如 add()、remove() 和 set() 调用）对底层 List 也有影响。&rdquo;<br />
<br />
　　2.1.ListIterator接口<br />
<br />
　　ListIterator 接口继承 Iterator 接口以支持添加或更改底层集合中的元素，还支持双向访问。ListIterator没有当前位置，光标位于调用previous和next方法返回的值之间。一个长度为n的列表，有n+1个有效索引值：<br />
<br />
<br />
<br />
<br />
　　(1) void add(Object o): 将对象o添加到当前位置的前面<br />
<br />
　　　void set(Object o): 用对象o替代next或previous方法访问的上一个元素。如果上次调用后列表结构被修改了，那么将抛出IllegalStateException异常。<br />
<br />
　　(2) boolean hasPrevious(): 判断向后迭代时是否有元素可访问<br />
<br />
　　　Object previous()：返回上一个对象<br />
<br />
　　　int nextIndex(): 返回下次调用next方法时将返回的元素的索引<br />
<br />
　　　int previousIndex():　返回下次调用previous方法时将返回的元素的索引 <br />
<br />
　　&ldquo;正常情况下，不用ListIterator改变某次遍历集合元素的方向 &mdash; 向前或者向后。虽然在技术上可以实现，但previous() 后立刻调用next()，返回的是同一个元素。把调用 next()和previous()的顺序颠倒一下，结果相同。&rdquo;<br />
<br />
　　&ldquo;我们还需要稍微再解释一下 add() 操作。添加一个元素会导致新元素立刻被添加到隐式光标的前面。因此，添加元素后调用 previous() 会返回新元素，而调用 next() 则不起作用，返回添加操作之前的下一个元素。&rdquo;<br />
<br />
　　2.2.AbstractList和AbstractSequentialList抽象类 <br />
<br />
　　有两个抽象的 List 实现类：AbstractList 和 AbstractSequentialList。像 AbstractSet 类一样，它们覆盖了 equals() 和 hashCode() 方法以确保两个相等的集合返回相同的哈希码。若两个列表大小相等且包含顺序相同的相同元素，则这两个列表相等。这里的 hashCode() 实现在 List 接口定义中指定，而在这里实现。<br />
<br />
　　除了equals()和hashCode()，AbstractList和AbstractSequentialList实现了其余 List 方法的一部分。因为数据的随机访问和顺序访问是分别实现的，使得具体列表实现的创建更为容易。需要定义的一套方法取决于您希望支持的行为。您永远不必亲自提供的是 iterator方法的实现。<br />
<br />
　　2.3. LinkedList类和ArrayList类<br />
<br />
　　在&ldquo;集合框架&rdquo;中有两种常规的 List 实现：ArrayList 和 LinkedList。使用两种 List 实现的哪一种取决于您特定的需要。如果要支持随机访问，而不必在除尾部的任何位置插入或除去元素，那么，ArrayList 提供了可选的集合。但如果，您要频繁的从列表的中间位置添加和除去元素，而只要顺序的访问列表元素，那么，LinkedList 实现更好。<br />
<br />
　　&ldquo;ArrayList 和 LinkedList 都实现 Cloneable 接口，都提供了两个构造函数，一个无参的，一个接受另一个Collection&rdquo;<br />
<br />
　　2.3.1. LinkedList类<br />
<br />
　　LinkedList类添加了一些处理列表两端元素的方法。<br />
<br />
<br />
<br />
　　(1) void addFirst(Object o): 将对象o添加到列表的开头<br />
<br />
　　　　void addLast(Object o)：将对象o添加到列表的结尾<br />
<br />
　　(2) Object getFirst(): 返回列表开头的元素<br />
<br />
　　　　Object getLast(): 返回列表结尾的元素<br />
<br />
　　(3) Object removeFirst(): 删除并且返回列表开头的元素<br />
<br />
　　　　Object removeLast():删除并且返回列表结尾的元素<br />
<br />
　　(4) LinkedList(): 构建一个空的链接列表<br />
<br />
　　　　LinkedList(Collection c): 构建一个链接列表，并且添加集合c的所有元素<br />
<br />
　　&ldquo;使用这些新方法，您就可以轻松的把 LinkedList 当作一个堆栈、队列或其它面向端点的数据结构。&rdquo;<br />
<br />
　　2.3.2. ArrayList类<br />
<br />
　　ArrayList类封装了一个动态再分配的Object[]数组。每个ArrayList对象有一个capacity。这个capacity表示存储列表中元素的数组的容量。当元素添加到ArrayList时，它的capacity在常量时间内自动增加。<br />
<br />
　　在向一个ArrayList对象添加大量元素的程序中，可使用ensureCapacity方法增加capacity。这可以减少增加重分配的数量。<br />
<br />
　　(1) void ensureCapacity(int minCapacity): 将ArrayList对象容量增加minCapacity<br />
<br />
　　(2) void trimToSize(): 整理ArrayList对象容量为列表当前大小。程序可使用这个操作减少ArrayList对象存储空间。<br />
<br />
　　2.3.2.1. RandomAccess接口<br />
<br />
　　一个特征接口。该接口没有任何方法，不过你可以使用该接口来测试某个集合是否支持有效的随机访问。ArrayList和Vector类用于实现该接口。<br />
<br />
<br />
3.Set接口<br />
<br />
　　Set 接口继承 Collection 接口，而且它不允许集合中存在重复项，每个具体的 Set 实现类依赖添加的对象的 equals()方法来检查独一性。Set接口没有引入新方法，所以Set就是一个Collection，只不过其行为不同。<br />
<br />
<br />
<br />
　　3.1. Hash表<br />
<br />
　　Hash表是一种数据结构，用来查找对象。Hash表为每个对象计算出一个整数，称为Hash Code(哈希码)。Hash表是个链接式列表的阵列。每个列表称为一个buckets(哈希表元)。对象位置的计算　index = HashCode % buckets (HashCode为对象哈希码，buckets为哈希表元总数)。<br />
<br />
　　当你添加元素时，有时你会遇到已经填充了元素的哈希表元，这种情况称为Hash Collisions(哈希冲突)。这时，你必须判断该元素是否已经存在于该哈希表中。<br />
<br />
　　如果哈希码是合理地随机分布的，并且哈希表元的数量足够大，那么哈希冲突的数量就会减少。同时，你也可以通过设定一个初始的哈希表元数量来更好地控制哈希表的运行。初始哈希表元的数量为　buckets = size * 150% + 1 (size为预期元素的数量)。<br />
<br />
　　如果哈希表中的元素放得太满，就必须进行rehashing(再哈希)。再哈希使哈希表元数增倍，并将原有的对象重新导入新的哈希表元中，而原始的哈希表元被删除。load factor(加载因子)决定何时要对哈希表进行再哈希。在Java编程语言中，加载因子默认值为0.75，默认哈希表元为101。<br />
<br />
　　3.2. Comparable接口和Comparator接口<br />
<br />
　　在&ldquo;集合框架&rdquo;中有两种比较接口：Comparable接口和Comparator接口。像String和Integer等Java内建类实现Comparable接口以提供一定排序方式，但这样只能实现该接口一次。对于那些没有实现Comparable接口的类、或者自定义的类，您可以通过Comparator接口来定义您自己的比较方式。<br />
<br />
　　3.2.1. Comparable接口<br />
<br />
　　在java.lang包中，Comparable接口适用于一个类有自然顺序的时候。假定对象集合是同一类型，该接口允许您把集合排序成自然顺序。<br />
<br />
<br />
<br />
　　(1) int compareTo(Object o): 比较当前实例对象与对象o，如果位于对象o之前，返回负值，如果两个对象在排序中位置相同，则返回0，如果位于对象o后面，则返回正值<br />
<br />
　　在 Java 2 SDK版本1.4中有二十四个类实现Comparable接口。下表展示了8种基本类型的自然排序。虽然一些类共享同一种自然排序，但只有相互可比的类才能排序。<br />
<br />
类 排序 <br />
BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short &nbsp;按数字大小排序 <br />
Character &nbsp;按 Unicode 值的数字大小排序 <br />
String &nbsp;按字符串中字符 Unicode 值排序 <br />
　　<br />
　　利用Comparable接口创建您自己的类的排序顺序，只是实现compareTo()方法的问题。通常就是依赖几个数据成员的自然排序。同时类也应该覆盖equals()和hashCode()以确保两个相等的对象返回同一个哈希码。<br />
<br />
　　3.2.2. Comparator接口<br />
<br />
　　若一个类不能用于实现java.lang.Comparable，或者您不喜欢缺省的Comparable行为并想提供自己的排序顺序(可能多种排序方式)，你可以实现Comparator接口，从而定义一个比较器。<br />
<br />
<br />
<br />
<br />
　　(1)int compare(Object o1, Object o2): 对两个对象o1和o2进行比较，如果o1位于o2的前面，则返回负值，如果在排序顺序中认为o1和o2是相同的，返回0，如果o1位于o2的后面，则返回正值<br />
<br />
　　&ldquo;与Comparable相似，0返回值不表示元素相等。一个0返回值只是表示两个对象排在同一位置。由Comparator用户决定如何处理。如果两个不相等的元素比较的结果为零，您首先应该确信那就是您要的结果，然后记录行为。&rdquo;<br />
<br />
　　(2)boolean equals(Object obj): 指示对象obj是否和比较器相等。<br />
<br />
　　&ldquo;该方法覆写Object的equals()方法，检查的是Comparator实现的等同性，不是处于比较状态下的对象。&rdquo;<br />
<br />
<br />
　　3.3. SortedSet接口<br />
<br />
　　&ldquo;集合框架&rdquo;提供了个特殊的Set接口：SortedSet，它保持元素的有序顺序。SortedSet接口为集的视图(子集)和它的两端（即头和尾）提供了访问方法。当您处理列表的子集时，更改视图会反映到源集。此外，更改源集也会反映在子集上。发生这种情况的原因在于视图由两端的元素而不是下标元素指定，所以如果您想要一个特殊的高端元素（toElement）在子集中，您必须找到下一个元素。 <br />
<br />
　　添加到SortedSet实现类的元素必须实现Comparable接口，否则您必须给它的构造函数提供一个Comparator接口的实现。TreeSet类是它的唯一一份实现。<br />
<br />
　　&ldquo;因为集必须包含唯一的项，如果添加元素时比较两个元素导致了0返回值（通过Comparable的compareTo()方法或Comparator的compare()方法），那么新元素就没有添加进去。如果两个元素相等，那还好。但如果它们不相等的话，您接下来就应该修改比较方法，让比较方法和 equals() 的效果一致。&rdquo;<br />
<br />
<br />
<br />
　　(1) Comparator comparator(): 返回对元素进行排序时使用的比较器，如果使用Comparable接口的compareTo()方法对元素进行比较，则返回null<br />
<br />
　　(2) Object first(): 返回有序集合中第一个(最低)元素<br />
<br />
　　(3) Object last(): 返回有序集合中最后一个(最高)元素<br />
<br />
　　(4) SortedSet subSet(Object fromElement, Object toElement): 返回从fromElement(包括)至toElement(不包括)范围内元素的SortedSet视图(子集)<br />
<br />
　　(5) SortedSet headSet(Object toElement): 返回SortedSet的一个视图，其内各元素皆小于toElement<br />
<br />
　　(6) SortedSet tailSet(Object fromElement): 返回SortedSet的一个视图，其内各元素皆大于或等于fromElement<br />
<br />
　　3.4. AbstractSet抽象类<br />
<br />
　　AbstractSet类覆盖了Object类的equals()和hashCode()方法，以确保两个相等的集返回相同的哈希码。若两个集大小相等且包含相同元素，则这两个集相等。按定义，集的哈希码是集中元素哈希码的总和。因此，不论集的内部顺序如何，两个相等的集会有相同的哈希码。<br />
<br />
　　3.4.1. Object类<br />
<br />
　　(1) boolean equals(Object obj): 对两个对象进行比较，以便确定它们是否相同<br />
<br />
　　(2) int hashCode(): 返回该对象的哈希码。相同的对象必须返回相同的哈希码<br />
<br />
　　3.5. HashSet类类和TreeSet类<br />
<br />
　　&ldquo;集合框架&rdquo;支持Set接口两种普通的实现：HashSet和TreeSet(TreeSet实现SortedSet接口)。在更多情况下，您会使用 HashSet 存储重复自由的集合。考虑到效率，添加到 HashSet 的对象需要采用恰当分配哈希码的方式来实现hashCode()方法。虽然大多数系统类覆盖了 Object中缺省的hashCode()和equals()实现，但创建您自己的要添加到HashSet的类时，别忘了覆盖 hashCode()和equals()。<br />
<br />
　　当您要从集合中以有序的方式插入和抽取元素时，TreeSet实现会有用处。为了能顺利进行，添加到TreeSet的元素必须是可排序的。<br />
<br />
　　3.5.1.HashSet类<br />
<br />
　　(1) HashSet(): 构建一个空的哈希集<br />
<br />
　　(2) HashSet(Collection c): 构建一个哈希集，并且添加集合c中所有元素<br />
<br />
　　(3) HashSet(int initialCapacity): 构建一个拥有特定容量的空哈希集<br />
<br />
　　(4) HashSet(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空哈希集。LoadFactor是0.0至1.0之间的一个数<br />
<br />
　　3.5.2. TreeSet类<br />
<br />
　　(1) TreeSet():构建一个空的树集<br />
<br />
　　(2) TreeSet(Collection c): 构建一个树集，并且添加集合c中所有元素<br />
<br />
　　(3) TreeSet(Comparator c): 构建一个树集，并且使用特定的比较器对其元素进行排序<br />
<br />
　　&ldquo;comparator比较器没有任何数据，它只是比较方法的存放器。这种对象有时称为函数对象。函数对象通常在&ldquo;运行过程中&rdquo;被定义为匿名内部类的一个实例。&rdquo;<br />
<br />
　　TreeSet(SortedSet s): 构建一个树集，添加有序集合s中所有元素，并且使用与有序集合s相同的比较器排序<br />
<br />
　　3.6. LinkedHashSet类 <br />
<br />
　　LinkedHashSet扩展HashSet。如果想跟踪添加给HashSet的元素的顺序，LinkedHashSet实现会有帮助。LinkedHashSet的迭代器按照元素的插入顺序来访问各个元素。它提供了一个可以快速访问各个元素的有序集合。同时，它也增加了实现的代价，因为哈希表元中的各个元素是通过双重链接式列表链接在一起的。<br />
<br />
　　(1) LinkedHashSet(): 构建一个空的链接式哈希集<br />
<br />
　　(2) LinkedHashSet(Collection c): 构建一个链接式哈希集，并且添加集合c中所有元素<br />
<br />
　　(3) LinkedHashSet(int initialCapacity): 构建一个拥有特定容量的空链接式哈希集<br />
<br />
　　(4) LinkedHashSet(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空链接式哈希集。LoadFactor是0.0至1.0之间的一个数<br />
<br />
　　&ldquo;为优化HashSet空间的使用，您可以调优初始容量和负载因子。TreeSet不包含调优选项，因为树总是平衡的。&rdquo;<br />
<br />
<br />
　　4. Map接口<br />
<br />
　　Map接口不是Collection接口的继承。Map接口用于维护键/值对(key/value pairs)。该接口描述了从不重复的键到值的映射。<br />
<br />
<br />
<br />
　　(1) 添加、删除操作：<br />
<br />
　　Object put(Object key, Object value): 将互相关联的一个关键字与一个值放入该映像。如果该关键字已经存在，那么与此关键字相关的新值将取代旧值。方法返回关键字的旧值，如果关键字原先并不存在，则返回null<br />
<br />
　　Object remove(Object key): 从映像中删除与key相关的映射<br />
<br />
　　void putAll(Map t): 将来自特定映像的所有元素添加给该映像<br />
<br />
　　void clear(): 从映像中删除所有映射<br />
<br />
　　&ldquo;键和值都可以为null。但是，您不能把Map作为一个键或值添加给自身。&rdquo;<br />
<br />
　　(2) 查询操作：<br />
<br />
　　Object get(Object key): 获得与关键字key相关的值，并且返回与关键字key相关的对象，如果没有在该映像中找到该关键字，则返回null<br />
<br />
　　boolean containsKey(Object key): 判断映像中是否存在关键字key<br />
<br />
　　boolean containsValue(Object value): 判断映像中是否存在值value<br />
<br />
　　int size(): 返回当前映像中映射的数量<br />
<br />
　　boolean isEmpty() ：判断映像中是否有任何映射<br />
<br />
　　(3) 视图操作 ：处理映像中键/值对组<br />
<br />
　　Set keySet(): 返回映像中所有关键字的视图集<br />
<br />
　　&ldquo;因为映射中键的集合必须是唯一的，您用Set支持。你还可以从视图中删除元素，同时，关键字和它相关的值将从源映像中被删除，但是你不能添加任何元素。&rdquo;<br />
<br />
　　Collection values():返回映像中所有值的视图集<br />
<br />
　　&ldquo;因为映射中值的集合不是唯一的，您用Collection支持。你还可以从视图中删除元素，同时，值和它的关键字将从源映像中被删除，但是你不能添加任何元素。&rdquo;<br />
<br />
　　Set entrySet(): 返回Map.Entry对象的视图集，即映像中的关键字/值对<br />
<br />
　　&ldquo;因为映射是唯一的，您用Set支持。你还可以从视图中删除元素，同时，这些元素将从源映像中被删除，但是你不能添加任何元素。&rdquo;<br />
<br />
　　4.1. Map.Entry接口<br />
<br />
　　Map的entrySet()方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键/值对。<br />
<br />
<br />
<br />
　　通过这个集合的迭代器，您可以获得每一个条目(唯一获取方式)的键或值并对值进行更改。当条目通过迭代器返回后，除非是迭代器自身的remove()方法或者迭代器返回的条目的setValue()方法，其余对源Map外部的修改都会导致此条目集变得无效，同时产生条目行为未定义。<br />
<br />
　　(1) Object getKey(): 返回条目的关键字<br />
<br />
　　(2) Object getValue(): 返回条目的值<br />
<br />
　　(3) Object setValue(Object value): 将相关映像中的值改为value，并且返回旧值<br />
<br />
　　4.2. SortedMap接口 <br />
<br />
　　&ldquo;集合框架&rdquo;提供了个特殊的Map接口：SortedMap，它用来保持键的有序顺序。<br />
<br />
<br />
<br />
　　SortedMap接口为映像的视图(子集)，包括两个端点提供了访问方法。除了排序是作用于映射的键以外，处理SortedMap和处理SortedSet一样。<br />
<br />
　　添加到SortedMap实现类的元素必须实现Comparable接口，否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一份实现。<br />
<br />
　　&ldquo;因为对于映射来说，每个键只能对应一个值，如果在添加一个键/值对时比较两个键产生了0返回值（通过Comparable的compareTo()方法或通过Comparator的compare()方法），那么，原始键对应值被新的值替代。如果两个元素相等，那还好。但如果不相等，那么您就应该修改比较方法，让比较方法和 equals() 的效果一致。&rdquo;<br />
<br />
　　(1) Comparator comparator(): 返回对关键字进行排序时使用的比较器，如果使用Comparable接口的compareTo()方法对关键字进行比较，则返回null<br />
<br />
　　(2) Object firstKey(): 返回映像中第一个(最低)关键字<br />
<br />
　　(3) Object lastKey(): 返回映像中最后一个(最高)关键字<br />
<br />
　　(4) SortedMap subMap(Object fromKey, Object toKey): 返回从fromKey(包括)至toKey(不包括)范围内元素的SortedMap视图(子集)<br />
<br />
　　(5) SortedMap headMap(Object toKey): 返回SortedMap的一个视图，其内各元素的key皆小于toKey<br />
<br />
　　(6) SortedSet tailMap(Object fromKey): 返回SortedMap的一个视图，其内各元素的key皆大于或等于fromKey<br />
<br />
　　4.3. AbstractMap抽象类<br />
<br />
　　和其它抽象集合实现相似，AbstractMap 类覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同，则这两个映射相等。映射的哈希码是映射元素哈希码的总和，其中每个元素是Map.Entry接口的一个实现。因此，不论映射内部顺序如何，两个相等映射会报告相同的哈希码。 <br />
<br />
　　4.4. HashMap类和TreeMap类<br />
<br />
　　&ldquo;集合框架&rdquo;提供两种常规的Map实现：HashMap和TreeMap (TreeMap实现SortedMap接口)。在Map 中插入、删除和定位元素，HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键，那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和equals()的实现。<br />
<br />
　　这个TreeMap没有调优选项，因为该树总处于平衡状态。<br />
<br />
　　4.4.1. HashMap类<br />
<br />
　　为了优化HashMap空间的使用，您可以调优初始容量和负载因子。<br />
<br />
　　(1) HashMap(): 构建一个空的哈希映像<br />
<br />
　　(2) HashMap(Map m): 构建一个哈希映像，并且添加映像m的所有映射<br />
<br />
　　(3) HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像<br />
<br />
　　(4) HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像<br />
<br />
　　4.4.2. TreeMap类<br />
<br />
　　TreeMap没有调优选项，因为该树总处于平衡状态。<br />
<br />
　　(1) TreeMap():构建一个空的映像树<br />
<br />
　　(2) TreeMap(Map m): 构建一个映像树，并且添加映像m中所有元素<br />
<br />
　　(3) TreeMap(Comparator c): 构建一个映像树，并且使用特定的比较器对关键字进行排序<br />
<br />
　　(4) TreeMap(SortedMap s): 构建一个映像树，添加映像树s中所有映射，并且使用与有序映像s相同的比较器排序<br />
<br />
　　4.5. LinkedHashMap类<br />
<br />
　　LinkedHashMap扩展HashMap，以插入顺序将关键字/值对添加进链接哈希映像中。象LinkedHashSet一样，LinkedHashMap内部也采用双重链接式列表。<br />
<br />
　　(1) LinkedHashMap(): 构建一个空链接哈希映像<br />
<br />
　　(2) LinkedHashMap(Map m): 构建一个链接哈希映像,并且添加映像m中所有映射<br />
<br />
　　(3) LinkedHashMap(int initialCapacity): 构建一个拥有特定容量的空的链接哈希映像<br />
<br />
　　(4) LinkedHashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的链接哈希映像<br />
<br />
　　(5) LinkedHashMap(int initialCapacity, float loadFactor, <br />
<br />
　　boolean accessOrder): 构建一个拥有特定容量、加载因子和访问顺序排序的空的链接哈希映像<br />
<br />
　　&ldquo;如果将accessOrder设置为true,那么链接哈希映像将使用访问顺序而不是插入顺序来迭<br />
<br />
　　代各个映像。每次调用get或者put方法时，相关的映射便从它的当前位置上删除，然后放到链接式映像列表的结尾处（只有链接式映像列表中的位置才会受到影响，哈希表元则不受影响。哈希表映射总是待在对应于关键字的哈希码的哈希表元中）。&rdquo;<br />
<br />
　　&ldquo;该特性对于实现高速缓存的&ldquo;删除最近最少使用&rdquo;的原则很有用。例如，你可以希望将最常访问的映射保存在内存中，并且从数据库中读取不经常访问的对象。当你在表中找不到某个映射，并且该表中的映射已经放得非常满时，你可以让迭代器进入该表，将它枚举的开头几个映射删除掉。这些是最近最少使用的映射。&rdquo;<br />
<br />
　　(6) protected boolean removeEldestEntry(Map.Entry eldest): 如果你想删除最老的映射，则覆盖该方法，以便返回true。当某个映射已经添加给映像之后，便调用该方法。它的默认实现方法返回false，表示默认条件下老的映射没有被删除。但是你可以重新定义本方法，以便有选择地在最老的映射符合某个条件，或者映像超过了某个大小时，返回true。<br />
<br />
　　4.6. WeakHashMap类<br />
<br />
　　WeakHashMap是Map的一个特殊实现，它使用WeakReference(弱引用)来存放哈希表关键字。使用这种方式时，当映射的键在 WeakHashMap 的外部不再被引用时，垃圾收集器会将它回收，但它将把到达该对象的弱引用纳入一个队列。WeakHashMap的运行将定期检查该队列，以便找出新到达的弱应用。当一个弱引用到达该队列时，就表示关键字不再被任何人使用，并且它已经被收集起来。然后WeakHashMap便删除相关的映射。<br />
<br />
　　(1) WeakHashMap(): 构建一个空弱哈希映像<br />
<br />
　　(2) WeakHashMap(Map t): 构建一个弱哈希映像,并且添加映像t中所有映射<br />
<br />
　　(3) WeakHashMap(int initialCapacity): 构建一个拥有特定容量的空的弱哈希映像<br />
<br />
　　(4) WeakHashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的弱哈希映像<br />
<br />
　　4.6. IdentityHashMap类<br />
<br />
　　IdentityHashMap也是Map的一个特殊实现。在这个类中，关键字的哈希码不应该由hashCode()方法来计算，而应该由System.identityHashCode方法进行计算(即使已经重新定义了hashCode方法)。这是Object.hashCode根据对象的内存地址来计算哈希码时使用的方法。另外，为了对各个对象进行比较，IdentityHashMap将使用==，而不使用equals方法。<br />
<br />
　　换句话说，不同的关键字对象，即使它们的内容相同，也被视为不同的对象。IdentityHashMap类可以用于实现对象拓扑结构转换(topology-preserving object graph transformations)(比如实现对象的串行化或深度拷贝)，在进行转换时，需要一个&ldquo;节点表&rdquo;跟踪那些已经处理过的对象的引用。即使碰巧有对象相等，&ldquo;节点表&rdquo;也不应视其相等。另一个应用是维护代理对象。比如，调试工具希望在程序调试期间维护每个对象的一个代理对象。<br />
<br />
　　&ldquo;IdentityHashMap类不是一般意义的Map实现！它的实现有意的违背了Map接口要求通过equals方法比较对象的约定。这个类仅使用在很少发生的需要强调等同性语义的情况。&rdquo;<br />
<br />
　　(1) IdentityHashMap (): 构建一个空的全同哈希映像，默认预期最大尺寸为21<br />
<br />
　　&ldquo;预期最大尺寸是映像期望把持的键/值映射的最大数目&rdquo;<br />
<br />
　　(2) IdentityHashMap (Map m): 构建一个全同哈希映像,并且添加映像m中所有映射<br />
<br />
　　(3) IdentityHashMap (int expectedMaxSize): 构建一个拥有预期最大尺寸的空的全同哈希映像。放置超过预期最大尺寸的键/值映射时，将引起内部数据结构的增长，有时可能很费时间 </p > <a href="http://hi.baidu.com/lhylwh/blog/item/c608c5fd81c4dc45d7887de9.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/c608c5fd81c4dc45d7887de9.html#comment">查看评论</a>]]></description>
        <pubDate>2006-11-12  20:50</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/c608c5fd81c4dc45d7887de9.html</guid>
</item>

<item>
        <title><![CDATA[学了这么久的java。其实我连堆栈都不知道，哎~今天弥补一下。]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/4f2b28734f18ff1c8601b0f7.html]]></link>
        <description><![CDATA[
		
		堆栈是一种执行&ldquo;后进先出&rdquo;算法的数据结构。 <br />
<br />
设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球，小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面，可以发现一种规律：先放进去的小球只能后拿出来，反之，后放进去的小球能够先拿出来。所以&ldquo;先进后出&rdquo;就是这种结构的特点。 <br />
<br />
堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域，数据一个一个顺序地存入（也就是&ldquo;压入&mdash;&mdash;push&rdquo;）这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元，存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做&ldquo;栈底&rdquo;。数据一个一个地存入，这个过程叫做&ldquo;压栈&rdquo;。在压栈的过程中，每有一个数据压入堆栈，就放在和前一个单元相连的后面一个单元中，堆栈指示器中的地址自动加1。读取这些数据时，按照堆栈指示器中的地址读取数据，堆栈指示器中的地址数自动减 1。这个过程叫做&ldquo;弹出pop&rdquo;。如此就实现了后进先出的原则。 <br />
<br />
堆栈是计算机中最常用的一种数据结构，比如函数的调用在计算机中是用堆栈实现的。 <br />
堆栈可以用数组存储，也可以用以后会介绍的链表存储。 <br /> <a href="http://hi.baidu.com/lhylwh/blog/item/4f2b28734f18ff1c8601b0f7.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/4f2b28734f18ff1c8601b0f7.html#comment">查看评论</a>]]></description>
        <pubDate>2006-11-10  16:04</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/4f2b28734f18ff1c8601b0f7.html</guid>
</item>

<item>
        <title><![CDATA[setAttribute()和getAttribute()！]]></title>
        <link><![CDATA[http://hi.baidu.com/lhylwh/blog/item/76368402f996e80f4bfb519b.html]]></link>
        <description><![CDATA[
		
		<p >HttpServletRequest类既有getAttribute()方法，也有getParameter()方法，这两个方法有以下区别：<br />
<br />
（1）HttpServletRequest类有setAttribute()方法，而没有setParameter()方法<br />
<br />
（2）当两个Web组件之间为链接关系时，被链接的组件通过getParameter()方法来获得请求参数，例如假定welcome.jsp和authenticate.jsp之间为链接关系，welcome.jsp中有以下代码：<br />
<br />
&lt;a href=&quot;authenticate.jsp?username=weiqin&quot;&gt;authenticate.jsp &lt;/a&gt;<br />
<br />
或者：<br />
<br />
&lt;form name=&quot;form1&quot; method=&quot;post&quot; action=&quot;authenticate.jsp&quot;&gt;<br />
&nbsp;&nbsp;请输入用户姓名：&lt;input type=&quot;text&quot; name=&quot;username&quot;&gt;<br />
&nbsp;&nbsp;&lt;input type=&quot;submit&quot; name=&quot;Submit&quot; value=&quot;提交&quot;&gt;<br />
&lt;/form&gt;<br />
<br />
在authenticate.jsp中通过request.getParameter(&quot;username&quot;)方法来获得请求参数username:<br />
<br />
&lt;% String username=request.getParameter(&quot;username&quot;); %&gt;<br />
<br />
（3）当两个Web组件之间为转发关系时，转发目标组件通过getAttribute()方法来和转发源组件共享request范围内的数据。假定 authenticate.jsp和hello.jsp之间为转发关系。authenticate.jsp希望向hello.jsp传递当前的用户名字，如何传递这一数据呢？先在authenticate.jsp中调用setAttribute()方法：<br />
<br />
&lt;%<br />
String username=request.getParameter(&quot;username&quot;);<br />
request.setAttribute(&quot;username&quot;，username);<br />
%&gt;<br />
<br />
&lt;jsp:forward page=&quot;hello.jsp&quot; /&gt;<br />
<br />
在hello.jsp中通过getAttribute()方法获得用户名字:<br />
<br />
&lt;% String username=(String)request.getAttribute(&quot;username&quot;); %&gt;<br />
Hello: &lt;%=username %&gt;<br />
<br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
从更深的层次考虑，request.getParameter()方法传递的数据，会从Web客户端传到Web服务器端，代表HTTP请求数据。request.getParameter()方法返回String类型的数据。<br />
<br />
request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部，在具有转发关系的Web组件之间共享。这两个方法能够设置Object类型的共享数据。</p >
<p >sendRedirect()和forward()有什么不同？ <br />
sendRedirect()是向浏览器发送一个redirect通知，浏览器重定向到新的URL。 <br />
而forward是在服务器端直接转到新的URL，对于浏览器是透明的。 <br />
前者浏览器的地址栏显示的是新的URL，后者浏览器的地址栏显示的是Servlet的URL。 <br />
因而当目标URL会自动刷新时，两者会造成一些差别<br />
</p > <a href="http://hi.baidu.com/lhylwh/blog/item/76368402f996e80f4bfb519b.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/lhylwh/blog/category/%D4%FD%BC%C7">札记</a>&nbsp;<a href="http://hi.baidu.com/lhylwh/blog/item/76368402f996e80f4bfb519b.html#comment">查看评论</a>]]></description>
        <pubDate>2006-11-09  21:30</pubDate>
        <category><![CDATA[札记]]></category>
        <author><![CDATA[为爱去杀猪]]></author>
		<guid>http://hi.baidu.com/lhylwh/blog/item/76368402f996e80f4bfb519b.html</guid>
</item>


</channel>
</rss>