??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成人综合亚洲AV第一页,亚洲Av永久无码精品黑人,亚洲一级毛片中文字幕http://www.tkk7.com/matthew2006/category/12638.htmlNo Buddha tree at all,And bright mirror nor.Now nothing at all,How dusts any more ? zh-cnTue, 27 Feb 2007 10:31:06 GMTTue, 27 Feb 2007 10:31:06 GMT60Java的内存泄漏-转脓http://www.tkk7.com/matthew2006/archive/2007/01/16/94114.htmlmatthewmatthewTue, 16 Jan 2007 01:56:00 GMThttp://www.tkk7.com/matthew2006/archive/2007/01/16/94114.htmlhttp://www.tkk7.com/matthew2006/comments/94114.htmlhttp://www.tkk7.com/matthew2006/archive/2007/01/16/94114.html#Feedback0http://www.tkk7.com/matthew2006/comments/commentRss/94114.htmlhttp://www.tkk7.com/matthew2006/services/trackbacks/94114.htmlJava的一个重要优点就是通过垃圾攉?Garbage CollectionQGC)自动理内存的回ӞE序员不需要通过调用函数来释攑ֆ存。因此,很多E序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责QQ而是GC或JVM的问题。其实,q种x是不正确的,因ؓJava也存在内存泄Ԍ但它的表CC++不同?随着来多的服务器E序采用Java技术,例如JSPQServletQ?EJB{,服务器程序往往长期q行。另外,在很多嵌入式pȝ中,内存的总量非常有限。内存泄露问题也变得十分关键,即每次q行量泄漏Q长期运行之后,pȝ也是面崩溃的危险?Java是如何管理内?Z判断Java中是否有内存泄露Q我们首先必M解Java是如何管理内存的。Java的内存管理就是对象的分配和释N题。在Java中,E序员需要通过关键字new为每个对象申请内存空?(基本cd除外)Q所有的对象都在?(Heap)中分配空间。另外,对象的释放是由GC军_和执行的。在Java中,内存的分配是q序完成的Q而内存的释放是有GC完成的,q种收支两条U的Ҏ实化了E序员的工作。但同时Q它也加重了JVM的工作。这也是JavaE序q行速度较慢的原因之一。因为,GCZ能够正确释放对象QGC必须监控每一个对象的q行状态,包括对象的申诗引用、被引用、赋值等QGC都需要进行监控?监视对象状态是Z更加准确地、及时地释放对象Q而释攑֯象的Ҏ原则是该对象不再被引用?Z更好理解GC的工作原理,我们可以对象考虑为有向图的顶点,引用关p考虑为图的有向边Q有向边从引用者指向被引对象。另外,每个U程对象可以作ؓ一个图的v始顶点,例如大多E序从mainq程开始执行,那么该图是以mainq程点开始的一|树。在q个有向图中Q根点可达的对象都是有效对象,GC不回收q些对象。如果某个对?(q通子?与这个根点不可?注意Q该图ؓ有向?Q那么我们认?q些)对象不再被引用,可以被GC回收?以下Q我们D一个例子说明如何用有向图表C内存管理。对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情c以下右图,是左边E序q行到第6行的C意图?Java使用有向囄方式q行内存理Q可以消除引用@环的问题Q例如有三个对象Q相互引用,只要它们和根q程不可辄Q那么GC也是可以回收它们的。这U方式的优点是管理内存的_ֺ很高Q但是效率较低。另外一U常用的内存理技术是使用计数器,例如COM模型采用计数器方式管理构Ӟ它与有向囄比,_ֺ行低(很难处理循环引用的问?Q但执行效率很高?

什么是Java中的内存泄露
下面Q我们就可以描述什么是内存泄漏。在Java中,内存泄漏是存在一些被分配的对象,q些对象有下面两个特点,首先Q这些对象是可达的,卛_有向图中Q存在通\可以与其相连Q其ơ,q些对象是无用的Q即E序以后不会再用这些对象。如果对象满两个条gQ这些对象就可以判定为Java中的内存泄漏Q这些对象不会被GC所回收Q然而它却占用内存?在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空_然后却不可达Q由于C++中没有GCQ这些内存将永远收不回来。在Java中,q些不可辄对象都由GC负责回收Q因此程序员不需要考虑q部分的内存泄露?通过分析Q我们得知,对于C++Q程序员需要自q理边和顶点,而对于JavaE序员只需要管理边可以了(不需要管理顶点的释放)。通过q种方式QJava提高了编E的效率?因此Q通过以上分析Q我们知道在Java中也有内存泄漏,但范围比C++要小一些。因为Java从语a上保证,M对象都是可达的,所有的不可辑֯象都由GC理?对于E序员来_GC基本是透明的,不可见的。虽Ӟ我们只有几个函数可以讉KGCQ例如运行GC的函数System.gc()Q但是根据Java语言规范定义Q?该函C保证JVM的垃圾收集器一定会执行。因为,不同的JVM实现者可能用不同的法理GC。通常QGC的线E的优先U别较低。JVM调用GC的策略也有很多种Q有的是内存使用到达一定程度时QGC才开始工作,也有定时执行的,有的是^~执行GCQ有的是中断式执行GC。但通常来说Q我们不需要关心这些。除非在一些特定的场合QGC的执行媄响应用程序的性能Q例如对于基于Web的实时系l,如网l游戏等Q用户不希望GCH然中断应用E序执行而进行垃圑֛Ӟ那么我们需要调整GC的参敎ͼ让GC能够通过q缓的方式释攑ֆ存,例如垃圑֛收分解ؓ一pd的小步骤执行QSun提供的HotSpot JVM支持这一Ҏ?

下面l出了一个简单的内存泄露的例子。在q个例子中,我们循环甌Object对象Qƈ所甌的对象放入一个Vector中,如果我们仅仅释放引用本nQ那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,q必MVector中删除,最单的Ҏ是Vector对象讄为null?Vector v=new Vector(10); for (int i=1;i<100; i++) { Object o=new Object(); v.add(o); o=null; } //此时Q所有的Object对象都没有被释放Q因为变量v引用q些对象?如何内存泄?最后一个重要的问题Q就是如何检Java的内存泄漏。目前,我们通常使用一些工h查JavaE序的内存泄漏问题。市Z已有几种专业查Java内存泄漏的工P它们的基本工作原理大同小异,都是通过监测JavaE序q行Ӟ所有对象的甌、释攄动作Q将内存理的所有信息进行统计、分析、可视化。开发h员将Ҏq些信息判断E序是否有内存泄漏问题。这些工具包括Optimizeit ProfilerQJProbe ProfilerQJinSight , Rational 公司的Purify{?br /> 
下面Q我们将单介lOptimizeit的基本功能和工作原理?Optimizeit Profiler版本4.11支持ApplicationQAppletQServlet和Romote Application四类应用Qƈ且可以支持大多数cd的JVMQ包括SUN JDKpdQIBM的JDKpdQ和Jbuilder的JVM{。ƈ且,该Y件是由Java~写Q因此它支持多种操作pȝ。Optimizeitpdq包括Thread Debugger和Code Coverage两个工具Q分别用于监运行时的线E状态和代码覆盖面?当设|好所有的参数了,我们可以在OptimizeIt环境下运行被程序,在程序运行过E中QOptimizeit可以监视内存的用曲U?如下?Q包括JVM甌的堆(heap)的大,和实际用的内存大小。另外,在运行过E中Q我们可以随时暂停程序的q行Q甚臛_行调用GCQ让GCq行内存回收。通过内存使用曲线Q我们可以整体了解程序用内存的情况。这U监对于长期运行的应用E序非常有必要,也很Ҏ发现内存泄露?在运行过E中Q我们还可以从不同视角观查内存的使用情况QOptimizeit提供了四U方式: 堆视角?q是一个全面的视角Q我们可以了解堆中的所有的对象信息(数量和种c?Qƈq行l计、排序,qo。了解相兛_象的变化情况?Ҏ视角。通过Ҏ视角Q我们可以得知每一U类的对象,都分配在哪些Ҏ中,以及它们的数量?对象视角。给定一个对象,通过对象视角Q我们可以显C它的所有出引用和入引用对象Q我们可以了解这个对象的所有引用关pR?引用图?l定一个根Q通过引用图,我们可以昄从该点出发的所有出引用?在运行过E中Q我们可以随时观察内存的使用情况Q通过q种方式Q我们可以很快找到那些长期不被释放,q且不再使用的对象。我们通过查这些对象的生存周期Q确认其是否为内存泄霌Ӏ在实践当中Q寻扑ֆ存泄露是一仉帔R烦的事情Q它需要程序员Ҏ个程序的代码比较清楚Qƈ且需要丰富的调试l验Q但是这个过E对于很多关键的JavaE序都是十分重要的?lg所qͼJava也存在内存泄露问题,其原因主要是一些对象虽然不再被使用Q但它们仍然被引用。ؓ了解册些问题,我们可以通过软g工具来检查内存泄Ԍ查的主要原理是暴露出所有堆中的对象Q让E序员寻N些无用但仍被引用的对象?

作者简?
Ƨ阳辎ͼ北京大学计算机硕士毕业,98qv开始研I基于java的Y件开发、测试,参与开发、测试过多个ZJava的应用程序和Web服务目?
周欣Q北京大学计机pdd士生Q主要研I方向:E序理解、逆向工程及Y件度量,联系方式 zhouxin@sei.pku.edu.cn

matthew 2007-01-16 09:56 发表评论
]]>
Servlet容器工作原理讲解(2)Q{?/title><link>http://www.tkk7.com/matthew2006/archive/2006/12/06/85799.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Wed, 06 Dec 2006 04:37:00 GMT</pubDate><guid>http://www.tkk7.com/matthew2006/archive/2006/12/06/85799.html</guid><wfw:comment>http://www.tkk7.com/matthew2006/comments/85799.html</wfw:comment><comments>http://www.tkk7.com/matthew2006/archive/2006/12/06/85799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/matthew2006/comments/commentRss/85799.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/matthew2006/services/trackbacks/85799.html</trackback:ping><description><![CDATA[HttpServer1 c?br /><br />此应用程序内的 HttpServer1c 与前文单的 WEB 服务器应用程序中的HttpServer 十分怼。但是,此应用程序内的 HttpServer1 能服务静态资源和 servlet。如果要h一个静态资源,误入以下 URLQ?br /><br /><b><a href="http://machinename:port/staticResource">http://machineName:port/staticResource</a> </b><br /><br />它就是前文中提到的怎样在 WEB 服务器应用程序里h静态资源。如果要h一个 servletQ请输入以下 URLQ?br /><br /><b><a href="http://machinename:port/servlet/servletClass">http://machineName:port/servlet/servletClass</a> </b><br /><br />如果您想在本地浏览器h一个 PrimitiveServle servlet Q请输入以下 URLQ?br /><br /><b><a href="http://localhost:8080/servlet/PrimitiveServlet">http://localhost:8080/servlet/PrimitiveServlet</a></b> <br /><br />下面 Listing 2.2 cȝ await ҎQ是{待一个 HTTP hQ直C个发布 shutdown 命o。与前文的 await Ҏ怼。?br /><br /><b>Listing 2.2. HttpServer1 cȝ await Ҏ<br />public void await() {<br />ServerSocket serverSocket = null;<br />int       port  = 8080;<br />try {<br />serverSocket =  new ServerSocket(port, 1,InetAddress.getByName("127.0.0.1"));<br />    }catch (IOException e) {<br />e.printStackTrace();<br />System.exit(1);<br />    }<br />// 循环Q等待一个请?br />while (!shutdown) {<br />Socket socket       = null;<br />InputStream input   = null;<br />OutputStream output = null;<br />try {<br />socket = serverSocket.accept();<br />input  = socket.getInputStream();<br />output = socket.getOutputStream();<br />// 创徏h对象q解?br />Request request = new Request(input);<br />request.parse();<br />// 创徏回应对象<br />Response response = new Response(output);<br />response.setRequest(request);<br />//是否是 servlet 或静态资源的h<br />//servlet h以?/servlet/" 开始?br />if (request.getUri().startsWith("/servlet/")) {<br />ServletProcessor1 processor = new ServletProcessor1();<br />processor.process(request, response);<br />            }<br />else {<br />StaticResourceProcessor processor =new StaticResourceProcessor();<br />processor.process(request, response);<br />      }<br />// 关闭socket<br />socket.close();<br />//是否前面的 URI 是一个 shutdown 命o<br />shutdown = request.getUri().equals(SHUTDOWN_COMMAND);<br />        }catch (Exception e) {<br />e.printStackTrace();System.exit(1);<br />        }    <br />}<br />}</b> <br /><br />此文 await Ҏ和前文的不同点就是,此文的 await Ҏ中的h调度到StaticResourceProcessor 或 ervletProcessor 。?br />如果 URI中包含?/servlet/."Q请求推q到后面Q否则,h传递到 StaticResourceProcessor 实例 <br /><br />Request c?br /><br />Servlet service Ҏ接受 servlet 容器的 javax.servlet.ServletRequest 和javax.servlet.ServletResponse 实例。因此,容器必须构徏 ServletRequest和ServletResponse对象Q然后将其传递到正在被服务的service Ҏ。?br /><br />ex02.pyrmont.Request cM表一个请求对象传递到 service Ҏ。同样地Q它必须实现 javax.servlet.ServletRequest 接口。这个类必须提供接口内所有方法的实现。这里尽量简化它q只实现几个Ҏ。要~译 Request cȝ话,必须提供q些Ҏ的空实现。再来看看 request c,内部所有需要返回一个对象实例都q回nullQ如下: <br /><br /><b>public Object getAttribute(String attribute) {<br />     return null;<br />  }<br />public Enumeration getAttributeNames() {<br />     return null;<br />  }<br />public String getRealPath(String path) {<br />     return null;<br />  }</b><br />另外Qrequest cM需有前文有介绍的 parse 和getUri Ҏ。?br /><br />Response c?br /><br />response cd玊Wjavax.servlet.ServletResponseQ同P该类也必L供接口内所有方法的实现。类g Request c,除 getWriter Ҏ外,其他Ҏ的实现都为空。?br /><br /><b>public PrintWriter getWriter() {<br />// autoflush is true, println() will flush,<br />// but print() will not.<br />writer = new PrintWriter(output, true);<br />return writer;<br />}</b><br /><br />PrintWriter cL建器的第二个参数是一个代表是否启用 autoflush 布尔|如果为真Q所有调用println Ҏqflush 输出。而 print 调用则不 flush 输出。因此,如果在servelt 的service Ҏ的最后一行调用 printҎQ则从浏览器上看不到此输出 。这个不完整性在后面的应用程序内会有调整。?br /><br />response cM包含有前文中介绍的 sendStaticResourceҎ。?br /><br />StaticResourceProcessor c?br /><br />StaticResourceProcessor cȝ于服务静态资源的h。它唯一的方法是 process。?br /><br /><b>Listing 2.3.StaticResourceProcessor cȝ processҎ.<br />public void process(Request request, Response response) {<br />try {<br />response.sendStaticResource();<br />    }catch (IOException e) {<br />e.printStackTrace();<br />    }<br />}</b><br />process Ҏ接受两个参数QRequest 和 Response 实例。它仅仅是调用 response cȝ sendStaticResource Ҏ?img src ="http://www.tkk7.com/matthew2006/aggbug/85799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/matthew2006/" target="_blank">matthew</a> 2006-12-06 12:37 <a href="http://www.tkk7.com/matthew2006/archive/2006/12/06/85799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java调用存储q程Q{?/title><link>http://www.tkk7.com/matthew2006/archive/2006/11/18/81950.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Sat, 18 Nov 2006 11:12:00 GMT</pubDate><guid>http://www.tkk7.com/matthew2006/archive/2006/11/18/81950.html</guid><wfw:comment>http://www.tkk7.com/matthew2006/comments/81950.html</wfw:comment><comments>http://www.tkk7.com/matthew2006/archive/2006/11/18/81950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/matthew2006/comments/commentRss/81950.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/matthew2006/services/trackbacks/81950.html</trackback:ping><description><![CDATA[本文阐述了怎么使用DBMS存储q程。我阐述了用存储过E的基本的和高Ҏ,比如q回ResultSet。本文假设你对DBMS和JDBC已经非常熟悉Q也假设你能够毫无障地阅读其它语言写成的代码(即不是Java的语aQ,但是Qƈ不要求你有Q何存储过E的~程l历。?br /><br />    存储q程是指保存在数据库q在数据库端执行的程序。你可以使用Ҏ的语法在JavacM调用存储q程。在调用Ӟ存储q程的名U及指定的参数通过JDBCq接发送给DBMSQ执行存储过Eƈ通过q接Q如果有Q返回结果。?br />使用存储q程拥有和用基于EJB或CORBAq样的应用服务器一L好处。区别是存储q程可以从很多流行的DBMS中免费用,而应用服务器大都非常昂贵。这q不只是许可证费用的问题。用应用服务器所需要花费的理、编写代码的费用Q以及客L序所增加的复杂性,都可以通过DBMS中的存储q程所整个地替代。?br /><br />    你可以用JavaQPythonQPerl或C~写存储q程Q但是通常使用你的DBMS所指定的特定语a。Oracle使用PL/SQLQPostgreSQL使用pl/pgsqlQDB2使用Procedural SQL。这些语a都非常相伹{在它们之间UL存储q程q不比在Sun的EJB规范不同实现版本之间ULSession Bean困难。ƈ且,存储q程是ؓ嵌入SQL所设计Q这使得它们比Java或C{语a更加友好地方式表达数据库的机制。?br /><br />    因ؓ存储q程q行在DBMS自nQ这可以帮助减少应用E序中的{待旉。不是在Java代码中执?个或5个SQL语句Q而只需要在服务器端执行1个存储过E。网l上的数据往q次数的减少可以戏剧性地优化性能。?br /><br />使用存储q程 <br /><br />    单的老的JDBC通过CallableStatementcL持存储过E的调用。该cd际上是PreparedStatement的一个子cR假设我们有一个poets数据库。数据库中有一个设|诗人逝世q龄的存储过E。下面是对老酒鬼Dylan ThomasQold soak Dylan ThomasQ不指定是否有关典故、文化,h评指正。译注)q行调用的详l代码: <br /><br />try{ <br />int age = 39;<br />String poetName = "dylan thomas"; <br />CallableStatement proc = connection.prepareCall("{ call set_death_age?, ?) }"); <br />proc.setString(1, poetName); <br />proc.setInt(2, age); <br />cs.execute(); <br />}catch (SQLException e){ // ....} <br /><br />    传给prepareCallҎ的字串是存储q程调用的书写规范。它指定了存储过E的名称Q?代表了你需要指定的参数。?br />和JDBC集成是存储过E的一个很大的便利Qؓ了从应用中调用存储过E,不需要存根(stubQ类或者配|文Ӟ除了你的DBMS的JDBC驱动E序外什么也不需要。?br /><br />    当这D代码执行时Q数据库的存储过E就被调用。我们没有去获取l果Q因存储q程q不q回l果。执行成功或p|通过例外得知。失败可能意味着调用存储q程时的p|Q比如提供的一个参数的cd不正)Q或者一个应用程序的p|Q比如抛Z个例外指C在poets数据库中q不存在“Dylan Thomas”) <br /><br />l合SQL操作与存储过E?br /><br />    映射Java对象到SQL表中的行相当单,但是通常需要执行几个SQL语句Q可能是一个SELECT查找IDQ然后一个INSERT插入指定ID的数据。在高度规格化(W合更高的范式,译注Q的数据库模式中Q可能需要多个表的更斎ͼ因此需要更多的语句。Java代码会很快地膨胀Q每一个语句的|络开销也迅速增加。?br />这些SQL语句转移C个存储过E中大大简化代码,仅涉及一ơ网l调用。所有关联的SQL操作都可以在数据库内部发生。ƈ且,存储q程语言Q例如PL/SQLQ允怋用SQL语法Q这比Java代码更加自然。下面是我们早期的存储过E,使用Oracle的PL/SQL语言~写Q?br /><br />create procedure set_death_age(poet VARCHAR2, poet_age NUMBER) <br />poet_id NUMBER; <br />begin SELECT id INTO poet_id FROM poets WHERE name = poet; <br />INSERT INTO deaths (mort_id, age) VALUES (poet_id, poet_age); <br />end set_death_age; <br /><br />    很独特?不。我打赌你一定期待看C个poets表上的UPDATE。这也暗CZ使用存储q程实现是多么容易的一件事情。set_death_age几乎可以肯定是一个很烂的实现。我们应该在poets表中d一列来存储逝世q龄。Java代码中ƈ不关心数据库模式是怎么实现的,因ؓ它仅调用存储q程。我们以后可以改变数据库模式以提高性能Q但是我们不必修Ҏ们代码。?br /><br />下面是调用上面存储过E的Java代码Q?br /><br />public static void setDeathAge(Poet dyingBard, int age) throws SQLException{ <br />Connection con = null; <br />CallableStatement proc = null; <br />try { <br />con = connectionPool.getConnection(); <br />proc = con.prepareCall("{ call set_death_age(?, ?) }"); <br />proc.setString(1, dyingBard.getName()); <br />proc.setInt(2, age); proc.execute(); <br />} finally { <br />try { <br />proc.close(); <br />} catch (SQLException e) { <br />con.close();  } }<br /><br />    Z保可维护性,使用像这儿这LstaticҎ。这也得调用存储过E的代码集中在一个简单的模版代码中。如果你用到许多存储q程Q就会发C需要拷贝、粘贴就可以创徏新的Ҏ。因Z码的模版化,甚至也可以通过脚本自动生调用存储q程的代码。?br /><br />Functions <br /><br />    存储q程可以有返回|所以CallableStatementcLcMgetResultSetq样的方法来获取q回倹{当存储q程q回一个值时Q你必须使用registerOutParameterҎ告诉JDBC驱动器该值的SQLcd是什么。你也必调整存储过E调用来指示该过E返回一个倹{?br /><br />下面接着上面的例子。这ơ我们查询Dylan Thomas逝世时的q龄。这ơ的存储q程使用PostgreSQL的pl/pgsqlQ?br /><br />create function snuffed_it_when (VARCHAR) returns integer ''declare <br />poet_id NUMBER; <br />poet_age NUMBER; <br />begin <br />--first get the id associated with the poet. <br />SELECT id INTO poet_id FROM poets WHERE name = $1; <br />--get and return the age. <br />SELECT age INTO poet_age FROM deaths WHERE mort_id = poet_id; <br />return age; <br />end;'' language ''pl/pgsql''; <br /><br />    另外Q注意pl/pgsql参数名通过Unix和DOS脚本?n语法引用。同Ӟ也注意嵌入的注释Q这是和Java代码相比的另一个优性。在Java中写q样的注释当然是可以的,但是看v来很凌ؕQƈ且和SQL语句pQ必d入到Java String中。?br /><br />下面是调用这个存储过E的Java代码Q?br /><br />connection.setAutoCommit(false); <br />CallableStatement proc = connection.prepareCall("{ ? = call snuffed_it_when(?) }"); <br />proc.registerOutParameter(1, Types.INTEGER); <br />proc.setString(2, poetName); <br />cs.execute(); <br />int age = proc.getInt(2); <br /><br />    如果指定了错误的q回值类型会怎样Q那么,当调用存储过E时抛Z个RuntimeExceptionQ正如你在ResultSet操作中用了一个错误的cd所到的一栗?br /><br />复杂的返回值?br /><br />    关于存储q程的知识,很多人好像就熟悉我们所讨论的这些。如果这是存储过E的全部功能Q那么存储过E就不是其它q程执行机制的替换方案了。存储过E的功能比这强大得多。?br />    当你执行一个SQL查询ӞDBMS创徏一个叫做cursorQ游标)的数据库对象Q用于在q回l果中P代每一行。ResultSet是当前时间点的游标的一个表C。这是Z么没有缓存或者特定数据库的支持,你只能在ResultSet中向前移动。?br /><br />    某些DBMS允许从存储过E中q回游标的一个引用。JDBCq不支持q个功能Q但是Oracle、PostgreSQL和DB2的JDBC驱动器都支持在ResultSet上打开到游标的指针QpointerQ。?br /><br />    设想列出所有没有活到退休年龄的诗hQ下面是完成q个功能的存储过E,q回一个打开的游标,同样也用PostgreSQL的pl/pgsql语言Q?br /><br />create procedure list_early_deaths () return refcursor as ''declare <br />toesup refcursor; <br />begin open toesup for SELECT poets.name, deaths.age FROM poets, deaths <br />-- all entries in deaths are for poets. <br />-- but the table might become generic. <br />WHERE poets.id = deaths.mort_id AND deaths.age < 60; <br />return toesup; <br />end;'' language ''plpgsql''; <br /><br />下面是调用该存储q程的JavaҎQ将l果输出到PrintWriterQ?br />PrintWriter: <br />static void sendEarlyDeaths(PrintWriter out){ <br />Connection con = null; <br />CallableStatement toesUp = null; <br />try { <br />con = ConnectionPool.getConnection(); // PostgreSQL needs a transaction to do this... con. <br />setAutoCommit(false); // Setup the call. <br />CallableStatement toesUp = connection.prepareCall("{ ? = call list_early_deaths () }"); <br />toesUp.registerOutParameter(1, Types.OTHER); <br />toesUp.execute(); <br />ResultSet rs = (ResultSet) toesUp.getObject(1); <br />while (rs.next()) { <br />String name = rs.getString(1); <br />int age = rs.getInt(2); <br />out.println(name + " was " + age + " years old."); <br />} <br />rs.close(); <br />} catch (SQLException e) { <br />// We should protect these calls. <br />toesUp.close(); <br />con.close(); <br />} <br />} <br /><br />    因ؓJDBCq不直接支持从存储过E中q回游标Q我们用Types.OTHER来指C存储过E的q回cdQ然后调用getObject()Ҏq对q回D行强制类型{换。?br /><br />    q个调用存储q程的JavaҎ是mapping的一个好例子。Mapping是对一个集上的操作q行抽象的方法。不是在q个q程上返回一个集Q我们可以把操作传送进L行。本例中Q操作就是把ResultSet打印C个输出流。这是一个值得举例的很常用的例子,下面是调用同一个存储过E的另外一个方法实玎ͼ <br /><br />public class ProcessPoetDeaths{ <br />public abstract void sendDeath(String name, int age); <br />} <br />static void mapEarlyDeaths(ProcessPoetDeaths mapper){ <br />Connection con = null; <br />CallableStatement toesUp = null; <br />try { <br />con = ConnectionPool.getConnection(); <br />con.setAutoCommit(false); <br />CallableStatement toesUp = connection.prepareCall("{ ? = call list_early_deaths () }"); <br />toesUp.registerOutParameter(1, Types.OTHER); <br />toesUp.execute(); <br />ResultSet rs = (ResultSet) toesUp.getObject(1); <br />while (rs.next()) { <br />String name = rs.getString(1); <br />int age = rs.getInt(2); <br />mapper.sendDeath(name, age); <br />} <br />rs.close(); <br />} catch (SQLException e) { <br />// We should protect these calls. <br />toesUp.close(); <br />con.close(); <br />} <br />} <br /><br />q允许在ResultSet数据上执行Q意的处理Q而不需要改变或者复制获取ResultSet的方法: <br /><br />static void sendEarlyDeaths(final PrintWriter out){ <br />ProcessPoetDeaths myMapper = new ProcessPoetDeaths() { <br />public void sendDeath(String name, int age) { <br />out.println(name + " was " + age + " years old."); <br />} <br />}; <br />mapEarlyDeaths(myMapper); <br />} <br /><br />   q个Ҏ使用ProcessPoetDeaths的一个匿名实例调用mapEarlyDeaths。该实例拥有sendDeathҎ的一个实玎ͼ和我们上面的例子一L方式把结果写入到输出。当Ӟq个技巧ƈ不是存储q程Ҏ的,但是和存储过E中q回的ResultSetl合使用Q是一个非常强大的工具。?br /><br />l论 <br /><br />存储q程可以帮助你在代码中分逻辑Q这基本上L有益的。这个分ȝ好处有: <br />• 快速创建应用,使用和应用一h变和改善的数据库模式。?br />• 数据库模式可以在以后改变而不影响Java对象Q当我们完成应用后,可以重新设计更好的模式。?br />• 存储过E通过更好的SQL嵌入使得复杂的SQL更容易理解。?br />• 编写存储过E比在Java中编写嵌入的SQL拥有更好的工PQ大部分~辑器都提供语法高亮Q?br />• 存储过E可以在MSQL命o行中试Q这使得调试更加Ҏ。?br /><br />q不是所有的数据库都支持存储q程Q但是存在许多很的实现Q包括免?开源的和非免费的,所以移植ƈ不是一个问题。Oracle、PostgreSQL和DB2都有cM的存储过E语aQƈ且有在线的社区很好地支持。?br />存储q程工具很多Q有像TOAD或TORAq样的编辑器、调试器和IDEQ提供了~写、维护PL/SQL或pl/pgsql的强大的环境。?br /><br />存储q程实增加了你的代码的开销Q但是它们和大多数的应用服务器相比,开销得多?br /><br /><font color="#ff33cc"><a title="原文地质" >查看原文</a></font><img src ="http://www.tkk7.com/matthew2006/aggbug/81950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/matthew2006/" target="_blank">matthew</a> 2006-11-18 19:12 <a href="http://www.tkk7.com/matthew2006/archive/2006/11/18/81950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中文q问题Q{?/title><link>http://www.tkk7.com/matthew2006/archive/2006/11/16/81448.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Thu, 16 Nov 2006 02:09:00 GMT</pubDate><guid>http://www.tkk7.com/matthew2006/archive/2006/11/16/81448.html</guid><wfw:comment>http://www.tkk7.com/matthew2006/comments/81448.html</wfw:comment><comments>http://www.tkk7.com/matthew2006/archive/2006/11/16/81448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/matthew2006/comments/commentRss/81448.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/matthew2006/services/trackbacks/81448.html</trackback:ping><description><![CDATA[1.字节和unicode<br />    java内核是unicode的,pclass文g也是Q但是很多媒体,包括文g/的保存方式是用字节流的。因此java要对q些字节经行{化。char是unicode的,而byte是字节。java中byte/char互{的函数在sun.io的包中间有。其中ByteToCharConvertercL中调度,可以用来告诉你,你用的convertor。其中两个很常用的静态函数是 <br />public static ByteToCharConverter getDefault(); <br />public static ByteToCharConverter getConverter(String encoding); <br />如果你不指定converterQ则pȝ会自动用当前的encoding,gbq_上用gbk,enq_上用8859_1?br />byte ――〉charQ?br /> "?的gb码是Q?xc4e3 ,unicode?x4f60<br />  String encoding = "gb2312";<br />  byte b[] = {(byte)'\u00c4',(byte)'\u00e3'};<br />  ByteToCharConverter converter = ByteToCharConverter.getConverter(encoding);<br />  char c[] = converter.convertAll(b);<br />  for (int i = 0; i < c.length; i++) {<br />      System.out.println(Integer.toHexString(c[i]));<br />  }<br /> l果是什么?0x4f60<br /> 如果encoding ="8859_1"Q结果又是什么?0x00c4,0x00e3<br /> 如果代码改ؓ<br /> byte b[] = {(byte)'\u00c4',(byte)'\u00e3'};<br /> ByteToCharConverter converter = ByteToCharConverter. getDefault();<br /> char c[] = converter.convertAll(b);<br /> for (int i = 0; i < c.length; i++) {<br />    System.out.println(Integer.toHexString(c[i]));<br /> }<br /> l果又是什么?Ҏq_的编码而定?br /><br /> char ――〉byteQ?br />    String encoding = "gb2312";<br />    char c[] = {'\u4f60'};<br />    CharToByteConverter converter = CharToByteConverter.getConverter(encoding);<br />    byte b[] = converter.convertAll(c);<br />    for (int i = 0; i < b.length; i++) {<br />       System.out.println(Integer.toHexString(b[i]));<br />    }<br />l果是什么?0x00c4,0x00e3<br />如果encoding ="8859_1"Q结果又是什么?0x3f<br />如果代码改ؓ<br />String encoding = "gb2312";<br />    char c[] = {'\u4f60'};<br />    CharToByteConverter converter = CharToByteConverter.getDefault();<br />    byte b[] = converter.convertAll(c);<br />    for (int i = 0; i < b.length; i++) {<br />       System.out.println(Integer.toHexString(b[i]));<br />    }<br />l果又是什么?Ҏq_的编码而定?br />很多中文问题是从这两个最单的cL生出来的。而却有很多类不直接支持把encoding输入Q这l我们带来诸多不ѝ很多程序难得用encoding了,直接用default的encodingQ这q我们UL带来了很多困难?br /><br />2.utf-8<br />utf-8是和unicode一一对应的,其实现很?br />7位的unicode: 0 _ _ _ _ _ _ _ <br />11位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _ <br />16位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ <br />21位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ <br />大多数情冉|只用到16位以下的unicode: <br />"?的gb码是Q?xc4e3 ,unicode?x4f60<br />    0xc4e3的二q制Q?br />          1100 Q?100 Q?110 Q?011<br />׃只有两位我们按照两位的编码来排,但是我们发现q行不通,因ؓW7位不?因此Q返??"<br />    0x4f60的二q制Q?br />               0100 Q?111 Q?110 Q?000<br />         我们用utf-8补齐Q变成:<br />               1110 Q?100 Q?011 Q?101 Q?010 Q?000<br />         e4--bd-- a0<br />         于是q回Q?xe4,0xbd,0xa0?br /><br />3.string和byte[]<br />string其实核心是char[],然而要把byte转化成stringQ必ȝq编码。string.length()其实是char数组的长度,如果使用不同的编码,很可能会错分Q造成散字和ؕ码?br />例如Q?br />String encoding = “?<br />byte [] b={(byte)'\u00c4',(byte)'\u00e3'}; <br />String str=new String(b,encoding);  <br />如果encoding=8859_1Q会有两个字Q但是encoding=gb2312只有一个字q个问题在处理分|l常发生 ?br /><br />4.Reader,Writer / InputStream,OutputStream<br />Reader和Writer核心是charQInputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char?写InputStream/OutputStream?br />例如Q?br />文gtest.txt只有一??字,0xc4,0xe3<br />String encoding = "gb2312";<br />    InputStreamReader reader = new InputStreamReader(new FileInputStream(<br />        "text.txt"), encoding);<br />    char c[] = new char[10];<br />    int length = reader.read(c);<br />    for (int i = 0; i < length; i++) {<br />       System.out.println(c[i]);<br />    }<br />l果是什么??br />如果encoding ="8859_1"Q结果是什么???两个字符Q表CZ认识?br />反过来的例子自己做?br /><br />5.我们要对java的编译器有所了解Q?br />javac ?encoding<br />我们常常没有用到encodingq个参数。其实encodingq个参数对于跨^台的操作是很重要的。如果没有指定encodingQ则按照pȝ的默认encoding,gbq_上是gb2312Q英文^C是iso8859_1?br />java的编译器实际上是调用sun.tools.javac.main的类Q对文gq行~译Q这个类有compile函数中间有一个encoding的变?-encoding的参数其实直接传lencoding变量。编译器是Ҏq个变量来读取java文g的,然后把用utf-8形式~译成class文g?br />例子代码Q?br />String str = "?;<br />    FileWriter writer = new FileWriter("text.txt");<br />    write.write(str);<br />    writer.close();<br /><br />如果用gb2312~译Q你会找到e4 bd a0的字D ;<br />如果?859_1~译Q?0c4 00e3的二q制Q?br />0000Q?000 Q?100Q?100 Q?000Q?000 Q?110Q?011<br />因ؓ每个字符都大?位,因此?1位编码: <br />1100Q?001Q?000Q?100Q?100Q?011Q?010Q?011 <br />c1-- 84-- c3--  a3 <br />你会扑ֈc1 84 c3 a3 ?br /><br />但是我们往往忽略掉这个参敎ͼ因此q样往往会有跨^台的问题Q?br />样例代码在中文^C~译Q生成zhclass<br />样例代码在英文^C~译Q输出enclass<br />  (1).  zhclass在中文^C执行ok,但是在英文^C不行 <br />  (2).    enclass在英文^C执行ok,但是在中文^C不行<br />原因Q?br />  (1).    在中文^C~译后,其实str在运行态的char[]?x4f60, 在中文^Cq行Qfilewriter的缺省编码是gb2312,因此 chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream中,于是0xc4,0xe3放进了文件。?br />但是如果是在英文q_下,chartobyteconverter的缺省值是8859_1, filewriter会自动调?859_1去{化str,但是他无法解释,因此他会输出"?"<br />  (2).    在英文^C~译后,其实str在运行态的char[]?x00c4 0x00e3, 在中文^Cq行Q中文无法识别,因此会出??Q?br />在英文^CQ?x00c4-->0xc4,0x00e3->0xe3Q因?xc4,0xe3被放q了文g?br /><br />6.    其它原因Q?lt;%@ page contentType="text/html; charset=GBK" %><br />讄览器的昄~码Q如果response的数据是utf8~码Q显C将是ؕ码,但是q和上q原因还不一栗?br /><br />7.    发生~码的地方:<br />    从数据库到javaE序 byte――〉char<br />    从javaE序到数据库 char――〉byte<br />    从文g到javaE序 byte――〉char<br />    从javaE序到文件 char――〉byte<br />    从javaE序到页面显C char――〉byte<br />    从面form提交数据到javaE序byte――〉char<br />    从到javaE序byte――〉char<br />    从javaE序到流char――〉byte<br /><br />谢志钢的解决ҎQ?br />我是使用配置qo器的Ҏ解决中文q的:<br /><br /><web-app><br />  <filter><br />    <filter-name>RequestFilter</filter-name><br />    <filter-class>net.golden.uirs.util.RequestFilter</filter-class><br />    <init-param><br />      <param-name>charset</param-name><br />      <param-value>gb2312</param-value><br />    </init-param><br />  </filter><br />  <filter-mapping><br />    <filter-name>RequestFilter</filter-name><br />    <url-pattern>*.jsp</url-pattern><br />  </filter-mapping><br /></web-app><br /><br /><br />  public void doFilter(ServletRequest req, ServletResponse res,<br />                       FilterChain fChain) throws IOException, ServletException {<br />    HttpServletRequest request = (HttpServletRequest) req;<br />    HttpServletResponse response = (HttpServletResponse) res;<br />    HttpSession session = request.getSession();<br />    String userId = (String) session.getAttribute("userid");<br />req.setCharacterEncoding(this.filterConfig.getInitParameter("charset")); // 讄字符集?<br />实际上是讄了byte ――〉char的encoding<br />    try {<br />      if (userId == null || userId.equals("")) {<br />        if (!request.getRequestURL().toString().matches(<br />            ".*/uirs/logon/logon(Controller){0,1}\\x2Ejsp$")) {<br />          session.invalidate();<br />          response.sendRedirect(request.getContextPath() +<br />                                "/uirs/logon/logon.jsp");<br />        }<br />      }<br />      else { // 看看是否h信息上报pȝ的权?br />        if (!net.golden.uirs.util.UirsChecker.check(userId, "信息上报pȝ",<br />            net.golden.uirs.util.UirsChecker.ACTION_DO)) {<br />          if (!request.getRequestURL().toString().matches(<br />              ".*/uirs/logon/logon(Controller){0,1}\\x2Ejsp$")) {<br />            response.sendRedirect(request.getContextPath() +<br />                                  "/uirs/logon/logonController.jsp");<br />          }<br />        }<br />      }<br />    }<br />    catch (Exception ex) {<br />      response.sendRedirect(request.getContextPath() +<br />                            "/uirs/logon/logon.jsp");<br />    }<br />    fChain.doFilter(req, res);<br />  }<br /><br /><font color="#99cc33"><a title="原文" >点击查看原文</a></font><img src ="http://www.tkk7.com/matthew2006/aggbug/81448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/matthew2006/" target="_blank">matthew</a> 2006-11-16 10:09 <a href="http://www.tkk7.com/matthew2006/archive/2006/11/16/81448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java变量cd间的怺转换Q{?/title><link>http://www.tkk7.com/matthew2006/archive/2006/11/15/81161.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Wed, 15 Nov 2006 01:14:00 GMT</pubDate><guid>http://www.tkk7.com/matthew2006/archive/2006/11/15/81161.html</guid><wfw:comment>http://www.tkk7.com/matthew2006/comments/81161.html</wfw:comment><comments>http://www.tkk7.com/matthew2006/archive/2006/11/15/81161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/matthew2006/comments/commentRss/81161.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/matthew2006/services/trackbacks/81161.html</trackback:ping><description><![CDATA[我们知道QJava的数据类型分Z大类Q即布尔型、字W型和数值型Q而其中数值型又分为整型和点型;相对于数据类型,Java的变量类型ؓ布尔型booleanQ字W型charQ整型byte、short、int、longQQ点型float、double。其中四U整型变量和两种点型变量分别对应于不同的精度和范围。此外,我们q经常用CU类变量Q即String和Date。对于这些变量类型之间的怺转换在我们编E中l常要用刎ͼ在我们今天的q篇文章中,我们来看看如何实现q些转换?br /><br />一、 整型、实型、字W型变量中的怺转换<br />在Java中整型、实型、字W型被视为同一cL据,q些cd׃U到高分别?byteQshortQchar)??int??long??float??doubleQ低U变量可以直接{换ؓ高变量Q例如,下面的语句可以在Java中直接通过Q?br />byte b;<br />int i=b;<br />而将高变量转换ZU变量时Q情况会复杂一些,你可以用强制类型{换。即你必采用下面这U语句格式:<br />int i;<br />byte b=(byte)i;<br />可以惌Q这U{换肯定可能会D溢出或精度的下降Q因此我们ƈ不推荐用这U{换?br /><br />二、Java的包装类<br />在我们讨论其它变量类型之间的怺转换Ӟ我们需要了解一下Java的包装类Q所谓包装类Q就是可以直接将单类型的变量表示Z个类Q在执行变量cd的相互{换时Q我们会大量使用q些包装cRJava共有六个包装c,分别是Boolean、Character、Integer、Long、Float和 DoubleQ从字面上我们就可以看出它们分别对应于 boolean、char、int、long、float和double。而String和Date本n是cR所以也׃存在什么包装类的概念了?br /><br />三、简单类型变量和包装cM间的怺转换<br />单类型的变量转换为相应的包装c,可以利用包装cȝ构造函数。即Q?br />Boolean(boolean value)、Character(char value)、Integer(int value)、Long(long value)、Float(float value)、Double(double value)<br />而在各个包装cMQL形ؓ××Value()的方法,来得到其对应的简单类型数据。利用这U方法,也可以实C同数值型变量间的转换Q例如,对于一个双_ֺ实型c,intValue()可以得到其对应的整型变量Q而doubleValue()可以得到其对应的双精度实型变量?br /><br />四、Stringcd其它数据cd的相互{?br />对于上面的这些包装类Q除了Character以外Q都有可以直接用字W串参数的构造函敎ͼq也׃得我们将Stringc{换ؓq些数据cd变得相当之简单,卻I<br />Boolean(String s)、Integer(String s)、Long(String s)、Float(String s)、Double(String s)<br />而将Stringc{换ؓDatecM可以使用q样的构造函敎ͼDate(String s)<br />现在我们q剩下一个字W型变量Q事实上Stringcd以理解ؓ一个char型数l,因此我们可以在StringcM扑ֈq样的方法来实现q种转换Q charAt(int index)可以得到StringcM某一位置上的字符QtoCharArray()更可以将整个Stringc{换成一个char的数l?br />对于所有的包装c都存在一个名为toString()的方法可以将其{换成对应的Stringc,而对于整型类和长整型c,q可以用 toBinaryString(int i)、toHexString(int i)、toOctalString(int i)分别以二q制、十六进制和八进制的形式q行到Stringcȝ转换?br /><br />五、将字符型直接做为数D{换ؓ其它数据cd<br />字W型变量转换为数值型变量实际上有两种对应关系Q在我们在第一部分所说的那种转换中,实际上是其转换成对应的ASCII码,但是我们有时q需要另一U{换关p,例如Q?’就是指的数?Q而不是其ASCII码,对于q种转换Q我们可以用Character的getNumericValue(char ch)Ҏ?br /><br />六、DatecM其它数据cd的相互{?br />整型和DatecM间ƈ不存在直接的对应关系Q只是你可以使用int型ؓ分别表示q、月、日、时、分、秒Q这样就在两者之间徏立了一个对应关p,在作q种转换Ӟ你可以用DatecL造函数的三种形式Q?br />Date(int year, int month, int date)Q以int型表C年、月、日<br />Date(int year, int month, int date, int hrs, int min)Q以int型表C年、月、日、时、分<br />Date(int year, int month, int date, int hrs, int min, int sec)Q以int型表C年、月、日、时、分、秒<br />在长整型和DatecM间有一个很有趣的对应关p,是一个时间表CZؓ距离格林治标准旉1970q?????U的毫秒数。对于这U对应关p,DatecM有其相应的构造函敎ͼDate(long date)<br />获取DatecM的年、月、日、时、分、秒以及星期你可以用DatecȝgetYear()、getMonth()、getDate()、 getHours()、getMinutes()、getSeconds()、getDay()ҎQ你也可以将其理解ؓDatec{换成int?br />而DatecȝgetTime()Ҏ可以得到我们前面所说的一个时间对应的长整型数Q与包装cMPDatecM有一个toString()Ҏ可以其转换为StringcR?br />在Java的数据类型{换中Q你q有一些其它方法可用,但是Q上面所介绍的这些方法对于你的实际编E已l够了Q不是吗Q?br /><br /><br /><a title="原文地址" >原文地址</a><br /><img src ="http://www.tkk7.com/matthew2006/aggbug/81161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/matthew2006/" target="_blank">matthew</a> 2006-11-15 09:14 <a href="http://www.tkk7.com/matthew2006/archive/2006/11/15/81161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA字符集-转脓http://www.tkk7.com/matthew2006/archive/2006/11/15/81159.htmlmatthewmatthewWed, 15 Nov 2006 01:11:00 GMThttp://www.tkk7.com/matthew2006/archive/2006/11/15/81159.htmlhttp://www.tkk7.com/matthew2006/comments/81159.htmlhttp://www.tkk7.com/matthew2006/archive/2006/11/15/81159.html#Feedback0http://www.tkk7.com/matthew2006/comments/commentRss/81159.htmlhttp://www.tkk7.com/matthew2006/services/trackbacks/81159.html
本文主要包括以下几个斚wQ编码基本知识,javaQ系lYӞurlQ工兯Y件等。?br />
在下面的描述中,以"中文"两个字ؓ例,l查表可以知道其GB2312~码?d6d0 cec4"QUnicode~码?4e2d 6587"Q UTF~码是"e4b8ad e69687"。注意,q两个字没有iso8859-1~码Q但可以用iso8859-1~码?表示"。?br />
2. ~码基本知识 

最早的~码是iso8859-1Q和ascii~码怼。但Z方便表示各种各样的语aQ逐渐出现了很多标准编码,重要的有如下几个。?br />
2.1. iso8859-1 

属于单字节编码,最多能表示的字W范围是0-255Q应用于英文pd。比如,字母'a'的编码ؓ0x61=97。?br />
很明显,iso8859-1~码表示的字W范围很H,无法表示中文字符。但是,׃是单字节~码Q和计算机最基础的表C单位一_所以很多时候,仍旧使用 iso8859-1~码来表C。而且在很多协议上Q默认用该~码。比如,虽然"中文"两个字不存在iso8859-1~码Q以gb2312~码ZQ应该是"d6d0 cec4"两个字符Q用iso8859-1~码的时候则它拆开?个字节来表示Q?d6 d0 ce c4"Q事实上Q在q行存储的时候,也是以字节ؓ单位处理的)。而如果是UTF~码Q则?个字?e4 b8 ad e6 96 87"。很明显Q这U表C方法还需要以另一U编码ؓ基础。?br />
2.2. GB2312/GBK 

q就是汉子的国标码,专门用来表示汉字Q是双字节编码,而英文字母和iso8859-1一_兼容iso8859-1~码Q。其中gbk~码能够用来同时表示J体字和体字Q而gb2312只能表示体字Qgbk是兼容gb2312~码的。?br />
2.3. unicode 

q是最l一的编码,可以用来表示所有语a的字W,而且是定长双字节Q也有四字节的)~码Q包括英文字母在内。所以可以说它是不兼容iso8859-1~码的,也不兼容M~码。不q,相对于iso8859-1~码来说Quniocode~码只是在前面增加了一?字节Q比如字?a'?00 61"。?br />
需要说明的是,定长~码便于计算机处理(注意GB2312/GBK不是定长~码Q,而unicode又可以用来表C所有字W,所以在很多软g内部是用unicode~码来处理的Q比如java。?br />
2.4. UTF 

考虑到unicode~码不兼容iso8859-1~码Q而且Ҏ占用更多的空_因ؓ对于英文字母Qunicode也需要两个字节来表示。所以 unicode不便于传输和存储。因此而生了utf~码Qutf~码兼容iso8859-1~码Q同时也可以用来表示所有语a的字W,不过Qutf~码是不定长~码Q每一个字W的长度?-6个字节不{。另外,utf~码自带单的校验功能。一般来Ԍ英文字母都是用一个字节表C,而汉字用三个字节。 ?br />
注意Q虽然说utf是ؓ了用更的I间而用的Q但那只是相对于unicode~码来说Q如果已l知道是汉字Q则使用 GB2312/GBK无疑是最节省的。不q另一斚wQ值得说明的是Q虽然utf~码Ҏ字?个字节,但即使对于汉字网,utf~码也会比 unicode~码节省Q因为网中包含了很多的英文字符。?br />
3. java对字W的处理 

在java应用软g中,会有多处涉及到字W集~码Q有些地斚w要进行正的讄Q有些地斚w要进行一定程度的处理。?br />
3.1. getBytes(charset) 

q是java字符串处理的一个标准函敎ͼ其作用是字W串所表示的字W按照charset~码Qƈ以字节方式表C。注意字W串在java内存中L按 unicode~码存储的。比?中文"Q正常情况下Q即没有错误的时候)存储?4e2d 6587"Q如果charset?gbk"Q则被编码ؓ "d6d0 cec4"Q然后返回字?d6 d0 ce c4"。如果charset?utf8"则最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1"Q则׃无法~码Q最后返回?3f 3f"Q两个问P。?br />
3.2. new String(charset) 

q是java字符串处理的另一个标准函敎ͼ和上一个函数的作用相反Q将字节数组按照charset~码q行l合识别Q最后{换ؓunicode存储。参考上qgetBytes的例子,"gbk" ?utf8"都可以得出正的l果"4e2d 6587"Q但iso8859-1最后变成了 "003f 003f"Q两个问P。?br />
因ؓutf8可以用来表示/~码所有字W,所以new String( str.getBytes( "utf8" ), "utf8" ) === strQ即完全可逆。?br />
3.3. setCharacterEncoding() 

该函数用来设|httph或者相应的~码。?br />
对于requestQ是指提交内容的~码Q指定后可以通过getParameter()则直接获得正的字符Ԍ如果不指定,则默认用iso8859-1 ~码Q需要进一步处理。参见下q?表单输入"。值得注意的是在执行setCharacterEncoding()之前Q不能执行Q何 getParameter()。java doc上说明: This method must be called prior to reading request parameters or reading input using getReader ()。而且Q该指定只对POSTҎ有效Q对GETҎ无效。分析原因,应该是在执行W一个getParameter()的时候,java会按照~码分析所有的提交内容Q而后l的getParameter()不再q行分析Q所以setCharacterEncoding()无效。而对于GETҎ提交表单是,提交的内容在URL中,一开始就已经按照~码分析所有的提交内容QsetCharacterEncoding()自然无效。?br />
对于responseQ则是指定输出内容的~码Q同Ӟ该设|会传递给览器,告诉览器输出内Ҏ采用的编码。?br />
3.4. 处理q程 

下面分析两个有代表性的例子Q说明java对编码有关问题的处理Ҏ。?br />
3.4.1. 表单输入 

User input  * (gbk:d6d0 cec4)  browser  *(gbk:d6d0 cec4)  web server  iso8859-1(00d6 00d 000ce 00c4)   classQ需要在class中进行处理:getbytes("iso8859-1")为d6 d0 ce c4Qnew String ("gbk")为d6d0 cec4Q内存中以unicode~码则ؓ4e2d 6587。?br />
l 用户输入的编码方式和面指定的编码有养I也和用户的操作系l有养I所以是不确定的Q上例以gbkZ。?br />
l 从browser到web serverQ可以在表单中指定提交内Ҏ使用的字W集Q否则会使用面指定的编码。而如果在url中直接用?的方式输入参敎ͼ则其~码往往是操作系l本w的~码Q因时和面无关。上qC旧以gbk~码Z。?br />
l Web server 接收到的是字节流Q默认时QgetParameterQ会以iso8859-1~码处理之,l果是不正确的,所以需要进行处理。但如果预先讄了编码(通过request. setCharacterEncoding ()Q,则能够直接获取到正确的结果。?br />
l 在页面中指定~码是个好习惯,否则可能失去控制Q无法指定正的~码。?br />
3.4.2. 文g~译 

假设文g是gbk~码保存的,而编译有两种~码选择Qgbk或者iso8859-1Q前者是中文windows的默认编码,后者是linux的默认编码,当然也可以在~译时指定编码。?br />
Jsp  * (gbk:d6d0 cec4)  java file  *(gbk:d6d0 cec4)  compiler read  uincode(gbk:  4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)  compiler write  utf(gbk: e4b8ad e69687;  iso8859-1: *)  compiled file  unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4)   class。所以用gbk~码保存Q而用iso8859-1~译的结果是不正的。?br />
class  unicode(4e2d 6587)  system.out / jsp.out  gbk(d6d0 cec4)  os console / browser。?br />
l 文g可以以多U编码方式保存,中文windows下,默认为ansi/gbk。?br />
l  ~译器读取文件时Q需要得到文件的~码Q如果未指定Q则使用pȝ默认~码。一般class文gQ是以系l默认编码保存的Q所以编译不会出问题Q但对于 jsp文gQ如果在中文windows下编辑保存,而部|在英文linux下运?~译Q则会出现问题。所以需要在jsp文g中用 pageEncoding指定~码。?br />
l Java~译的时候会转换成统一的unicode~码处理Q最后保存的时候再转换为utf~码。?br />
l  当系l输出字W的时候,会按指定~码输出Q对于中文windows下,System.out用gbk~码Q而对于responseQ浏览器Q,则用 jsp文g头指定的contentTypeQ或者可以直接ؓresponse指定~码。同Ӟ会告诉browser|页的编码。如果未指定Q则会用 iso8859-1~码。对于中文,应该为browser指定输出字符串的~码。?br />
l browser昄|页的时候,首先使用response中指定的~码Qjsp文g头指定的contentType最l也反映在response上)Q如果未指定Q则会用网中metaҎ定中的contentType。?br />
3.5. 几处讄 

对于web应用E序Q和~码有关的设|或者函数如下。?br />
3.5.1. jsp~译 

指定文g的存储编码,很明显,该设|应该置于文件的开头。例如:<%@page pageEncoding="GBK"%>。另外,对于一般class文gQ可以在~译的时候指定编码。?br />
3.5.2. jsp输出 

指定文g输出到browser是用的~码Q该讄也应该置于文件的开头。例如:<%@ page contentType="text/html;  charset= GBK" %>。该讄和response.setCharacterEncoding("GBK"){效。?br />
3.5.3. meta讄 

指定|页使用的编码,该设|对静态网尤其有作用。因为静态网|法采用jsp的设|,而且也无法执行response.setCharacterEncoding()。例如: 

如果同时采用了jsp输出和meta讄两种~码指定方式Q则jsp指定的优先。因为jsp指定的直接体现在response中。?br />
需要注意的是,apache有一个设|可以给无编码指定的|页指定~码Q该指定{同于jsp的编码指定方式,所以会覆盖静态网中的meta指定。所以有人徏议关闭该讄。?br />
3.5.4. form讄 

当浏览器提交表单的时候,可以指定相应的编码。例如:。一般不必不使用该设|,览器会直接使用|页的编码。?br />
4. pȝ软g 

下面讨论几个相关的系lY件。?br />
4.1. mysql数据库?br />
很明显,要支持多语言Q应该将数据库的~码讄成utf或者unicodeQ而utf更适合与存储。但是,如果中文数据中包含的英文字母很少Q其实unicode更ؓ适合。?br />
数据库的~码可以通过mysql的配|文件设|,例如default-character-set=utf8。还可以在数据库链接URL中设|,例如Q  useUnicode=true&characterEncoding=UTF-8。注意这两者应该保持一_在新的sql版本里,在数据库链接URL里可以不q行讄Q但也不能是错误的设|。?br />
4.2. apache 

appache和编码有关的配置在httpd.conf中,例如AddDefaultCharset UTF-8。如前所qͼ该功能会所有静态页面的~码讄为UTF-8Q最好关闭该功能。?br />
另外Qapacheq有单独的模块来处理|页响应_其中也可能对~码q行讄。?br />
4.3. linux默认~码 

q里所说的linux默认~码Q是指运行时的环境变量。两个重要的环境变量是LC_ALL和LANGQ默认编码会影响到java URLEncode的行为,下面有描q。?br />
都设|ؓ"zh_CN.UTF-8"。?br />
4.4. 其它 

Z支持中文文g名,linux在加载磁盘时应该指定字符集,例如Qmount /dev/hda5 /mnt/hda5/ -t ntfs -o iocharset=gb2312。?br />
另外Q如前所qͼ使用GETҎ提交的信息不支持request.setCharacterEncoding()Q但可以通过tomcat的配|文件指定字W集Q在tomcat的server.xml文g中,形如Q。这U方法将l一讄所有请求,而不能针对具体页面进行设|,也不一定和browser使用的编码相同,所以有时候ƈ不是所期望的。?br />
5. URL地址 

URL地址中含有中文字W是很麻烦的Q前面描q过使用GETҎ提交表单的情况,使用GETҎӞ参数是包含在URL中。?br />
5.1. URL~码 

对于URL中的一些特D字W,览器会自动q行~码。这些字W除?/?&"{外Q还包括unicode字符Q比如汉子。这时的~码比较Ҏ。?br />
IE 有一个选项"L使用UTF-8发送URL"Q当该选项有效ӞIE会对特D字W进行UTF-8~码Q同时进行URL~码。如果改选项无效Q则使用默认~码"GBK"Qƈ且不q行URL~码。但是,对于URL后面的参敎ͼ则L不进行编码,相当于UTF-8选项无效。比?中文.html?a=中文"Q当UTF-8选项有效Ӟ发送链?%e4%b8%ad%e6%96%87.html?a=\x4e\x2d\x65\x87"Q而UTF-8选项无效Ӟ发送链?\x4e\x2d\x65\x87.html?a=\x4e\x2d\x65\x87"。注意后者前面的"中文"两个字只?个字节,而前者却?8个字节,q主要时URL~码的原因。?br />
当web serverQtomcatQ接收到该链接时Q将会进行URL解码Q即L "%"Q同时按照ISO8859-1~码Q上面已l描qͼ可以使用URLEncoding来设|成其它~码Q识别。上qC子的l果分别?\ue4\ ub8\uad\ue6\u96\u87.html?a=\u4e\u2d\u65\u87"?\u4e\u2d\u65\u87.html?a=\ u4e\u2d\u65\u87"Q注意前者前面的"中文"两个字恢复成?个字W。这里用"\u"Q表C是unicode。?br />
所以,׃客户端设|的不同Q相同的链接Q在服务器上得到了不同结果。这个问题不h都遇刎ͼ却没有很好的解决办法。所以有的网站会用户试关闭UTF-8选项。不q,下面会描qC个更好的处理办法。?br />
5.2. rewrite 

熟悉的h都知道,apache有一个功能强大的rewrite模块Q这里不描述其功能。需要说明的是该模块会自动将URL解码Q去?Q,卛_成上qWweb serverQtomcatQ的部分功能。有相关文档介绍说可以用[NE]参数来关闭该功能Q但我试验ƈ未成功,可能是因为版本(我用的是 apache 2.0.54Q问题。另外,当参C含有"?& "{符L时候,该功能将Dpȝ得不到正常结果。?br />
rewrite本ng完全是采用字节处理的方式Q而不考虑字符串的~码Q所以不会带来编码问题。?br />
5.3. URLEncode.encode() 

q是Java本n提供对的URL~码函数Q完成的工作和上qUTF-8选项有效时浏览器所做的工作怼。值得说明的是Qjava已经不赞成不指定~码来用该ҎQdeprecatedQ。应该在使用的时候增加编码指定。?br />
当不指定~码的时候,该方法用系l默认编码,q会D软gq行l果得不定。比如对?中文"Q当pȝ默认~码?gb2312"Ӟl果?%4e% 2d%65%87"Q而默认编码ؓ"UTF-8"Q结果却?%e4%b8%ad%e6%96%87"Q后l程序将难以处理。另外,q儿说的pȝ默认~码是由q行tomcat时的环境变量LC_ALL和LANG{决定的Q曾l出现过tomcat重启后就出现q的问题,最后才郁闷的发现是因ؓ修改修改了这两个环境变量。?br />
l一指定?UTF-8"~码Q可能需要修改相应的E序。?br />
5.4. 一个解x案?br />
上面说vq,因ؓ览器设|的不同Q对于同一个链接,web server收到的是不同内容Q而Y件系l有无法知道q中间的区别Q所以这一协议目前q存在缺陗?br />
针对具体问题Q不应该侥幸认ؓ所有客LIE讄都是UTF-8有效的,也不应该_暴的徏议用户修改IE讄Q要知道Q用户不可能去记住每一个web server的设|。所以,接下来的解决办法只能是让自qE序多一Ҏ能:Ҏ内容来分析编码是否UTF-8。?br />
比较q运的是UTF-8~码相当有规律,所以可以通过分析传输q来的链接内容,来判断是否是正确的UTF-8字符Q如果是Q则以UTF-8处理之,如果不是Q则使用客户默认~码Q比?GBK"Q,下面是一个判断是否UTF-8的例子,如果你了解相应规律,容易理解。?br />
public static boolean isValidUtf8(byte[] b,int aMaxCount){ 

       int lLen=b.length,lCharCount=0; 

       for(int i=0;i

              byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;) 

              if(lByte>=0) continue;//>=0 is normal ascii 

              if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false; 

              int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4 

                     :lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1; 

              if(i+lCount>lLen) return false; 

              for(int j=0;j=(byte)0xc0) return false; 

       } 

       return true; 



相应圎ͼ一个用上q方法的例子如下Q?br />
public static String getUrlParam(String aStr,String aDefaultCharset) 

throws UnsupportedEncodingException{ 

       if(aStr==null) return null; 

       byte[] lBytes=aStr.getBytes("ISO-8859-1"); 

       return new String(lBytes,StringUtil.isValidUtf8(lBytes)?"utf8":aDefaultCharset); 



不过Q该Ҏ也存在缺P如下两方面: 

l 没有包括对用户默认编码的识别Q这可以Ҏh信息的语a来判断,但不一定正,因ؓ我们有时候也会输入一些韩文,或者其他文字。?br />
l 可能会错误判断UTF-8字符Q一个例子是"学习"两个字,其GBK~码? \xd1\xa7\xcf\xb0"Q如果用上qisValidUtf8Ҏ判断Q将q回true。可以考虑使用更严格的判断ҎQ不q估计效果不大。?br />
有一个例子可以证明google也遇C上述问题Q而且也采用了和上q相似的处理ҎQ比如,如果在地址栏中输入"http: //www.google.com/search?hl=zh-CN&newwindow=1&q=学习"Qgoogle无法正识别,而其他汉字一般能够正常识别。?br />
最后,应该补充说明一下,如果不用rewrite规则Q或者通过表单提交数据Q其实ƈ不一定会遇到上述问题Q因时可以在提交数据时指定希望的~码。另外,中文文g名确实会带来问题Q应该}慎用。?br />
6. 其它 

下面描述一些和~码有关的其他问题。?br />
6.1. SecureCRT 

除了览器和控制C~码有关外,一些客L也很有关pR比如在使用SecureCRTq接linuxӞ应该让SecureCRT的显C编码(不同的sessionQ可以有不同的编码设|)和linux的编码环境变量保持一致。否则看到的一些帮助信息,可能是q。?br />
另外Qmysql有自q~码讄Q也应该保持和SecureCRT的显C编码一致。否则通过SecureCRT执行sql语句的时候,可能无法处理中文字符Q查询结果也会出Cؕ码。?br />
对于Utf-8文gQ很多编辑器Q比如记事本Q会在文件开头增加三个不可见的标志字节,如果作ؓmysql的输入文Ӟ则必要Lq三个字W。(用 linux的vi保存可以Lq三个字W)。一个有的现象是,在中文windows下,创徏一个新txt文gQ用C本打开Q输?q?两个字,保存Q再打开Q你会发C个字没了Q只留下一个小黑点。?br />
6.2. qo器?br />
如果需要统一讄~码Q则通过filterq行讄是个不错的选择。在filter class中,可以l一为需要的h或者回应设|编码。参加上qsetCharacterEncoding()。这个类apache已经l出了可以直接用的例子SetCharacterEncodingFilter。?br />
6.3. POST和GET 

很明显,以POST提交信息ӞURL有更好的可读性,而且可以方便的用setCharacterEncoding()来处理字W集问题。但GETҎ形成的URL能够更容易表辄늚实际内容Q也能够用于收藏。?br />
从统一的角度考虑问题Q徏议采用GETҎQ这要求在程序中获得参数是进行特D处理,而无法用setCharacterEncoding()的便利,如果不考虑rewriteQ就不存在IE的UTF-8问题Q可以考虑通过讄URIEncoding来方便获取URL中的参数。?br />
6.4. J体~码转换 

GBK 同时包含体和J体~码Q也是说同一个字Q由于编码不同,在GBK~码下属于两个字。有时候,Z正确取得完整的结果,应该繁体和体进行统一。可以考虑UTF、GBK中的所有繁体字Q{换ؓ相应的简体字QBIG5~码的数据,也应该{化成相应的简体字。当Ӟ仍旧以UTF~码存储。?br />
例如Q对?语言 ?a"Q用UTF表示?\xE8\xAF\xAD\xE8\xA8\x80 \xE8\xAA\x9E\xE8\xA8\x80"Q进行简J体~码转换后应该是两个相同的?\xE8\xAF\xAD\xE8\xA8\x80>"。?br />

matthew 2006-11-15 09:11 发表评论
]]>
MD5加密及Java的实现方式- 转脓http://www.tkk7.com/matthew2006/archive/2006/08/10/62719.htmlmatthewmatthewThu, 10 Aug 2006 01:51:00 GMThttp://www.tkk7.com/matthew2006/archive/2006/08/10/62719.htmlhttp://www.tkk7.com/matthew2006/comments/62719.htmlhttp://www.tkk7.com/matthew2006/archive/2006/08/10/62719.html#Feedback0http://www.tkk7.com/matthew2006/comments/commentRss/62719.htmlhttp://www.tkk7.com/matthew2006/services/trackbacks/62719.html首先
   我看到很多脓子,上面描述MD5加密解密{话题,因此写此文章Z把MD5加密问题单的说个透彻Qƈ且给大家已经实践q的代码?br />
其次
   MD5加密q不是把原文加密Q这个大家得注意Q既然没有把原文加密何来的解密呢Q简直是个笑话。MD5的用途就是把一D原文数据通过一定的法生成16字节的密文,通过q个密文我们可以查原文的数据是否被修改过。常用在|络中明文数据传输,防止传输q程中内容被恶意修改。典型的应用协议为radiusQradius协议中有16byte是MD5所留的Q把用户的密码加在报文尾部进行MD5Q把l果存在|络中,所以明文部分看不到用户的密码,当服务器收到此包Q用同样的方法进行MD5Q如果加密出来的16byte一P说明是有效的未被恶意修改的网l包?br />
最?/b>
附上实现的代?br />
  1. import java.security.*;
  2. public class MD5 {
  3.   /**
  4.    * MD5
  5.    *
  6.    * @author Dreamer
  7.    */
  8.   public MD5() {
  9.   }
  10.   public static byte[] md5(byte[] in) {
  11.     MessageDigest md = null;
  12.     byte[] out = new byte[16];
  13.     try {
  14.       md = MessageDigest.getInstance("MD5");
  15.     }
  16.     catch (NoSuchAlgorithmException ex) {
  17.       System.out.println(ex.toString());
  18.     }
  19.     md.reset();
  20.     md.update(in);
  21.     out = md.digest();
  22.     return out;
  23.   }
  24.   public static byte[] md5(byte[] in, int len) {
  25.     MessageDigest md = null;
  26.     byte[] out = new byte[16];
  27.     try {
  28.       md = MessageDigest.getInstance("MD5");
  29.     }
  30.     catch (NoSuchAlgorithmException ex) {
  31.       System.out.println(ex.toString());
  32.     }
  33.     md.reset();
  34.     md.update(in, 0, len);
  35.     out = md.digest();
  36.     return out;
  37.   }
  38. }


matthew 2006-08-10 09:51 发表评论
]]>
Java中的日期处理Q{?/title><link>http://www.tkk7.com/matthew2006/archive/2006/07/15/58325.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Sat, 15 Jul 2006 06:52:00 GMT</pubDate><guid>http://www.tkk7.com/matthew2006/archive/2006/07/15/58325.html</guid><wfw:comment>http://www.tkk7.com/matthew2006/comments/58325.html</wfw:comment><comments>http://www.tkk7.com/matthew2006/archive/2006/07/15/58325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/matthew2006/comments/commentRss/58325.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/matthew2006/services/trackbacks/58325.html</trackback:ping><description><![CDATA[q来上网查了些java日期处理的资料,其中有些内容觉得比较有实际用处。脓出来做个记录Q?br /><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><font size="6"><strong><span lang="ZH-CN" style="FONT-SIZE: 22pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN"></span></strong></font><strong><span lang="EN-US" style="FONT-SIZE: 22pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN"><?XML:NAMESPACE PREFIX = O /?><o:p><font size="4">1 日期模板</font></o:p></span></strong></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="ZH-CN" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">模板定义如下Q?/span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">y </span><span lang="ZH-CN" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">q号Q如</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">1996<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">M 月䆾Q如July 或?7<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">d 月中W几天,?2<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">H </span><span lang="ZH-CN" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">时</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">(24 </span><span lang="ZH-CN" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">?/span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">)</span><span lang="ZH-CN" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">Q如</span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">0</span><span lang="ZH-CN" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">?/span><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt; mso-fareast-language: ZH-CN">17<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">m 分钟,?2<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">s 钞钟Q如55<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">S 微钞Q如978<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">E 星期几,如Tuesday<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">D 一q中的第几天Q如189<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">w week in year (Number) 27<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">W week in month (Number) 2<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">a am/pm marker (Text) PM<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">k hour in day (1~24) (Number) 24<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">K hour in am/pm (0~11) (Number) 0<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">z time zone (Text) Pacific Standard Time<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">' escape for text (Delimiter)<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">'' single quote (Literal) '<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><strong><span lang="EN-US" style="FONT-SIZE: 22pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><o:p><font size="4">2 日期格式</font></o:p></span></strong></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">使用<span lang="EN-US">SimpleDateFormat cL式化日期Q如果日期格式不对,会生异常?o:p></o:p></span></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">import java.text.*;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">import java.util.*;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">public class TestDate {<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">public static void main(String[] args) {<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">String dStr = "2001.12.12-08.23.21";<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">Date d = null;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd- HH.mm.ss");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">try {</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">http://www.54he.com </span><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">何vq?span lang="EN-US">hp54@163.com<o:p></o:p></span></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">d = sdf.parse(dStr);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">} catch (ParseException pe) {<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">System.out.println(pe.getMessage());<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">}<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">System.out.println(d);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">System.out.println(d.getTime());<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">}<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">}<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">?span lang="EN-US">java.text 包中扑ֈ那个SimpleDateFormat c,l它一个模板,可以parse 成一个DateQ然后用Date<o:p></o:p></span></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">cȝ<span lang="EN-US">getItme() ҎQ可以得C个Long 数据?o:p></o:p></span></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><font size="4"><strong>3 取得当前日期</strong></font><br />public String GetDateTime()<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">{<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">Calendar cal = Calendar.getInstance();<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">SimpleDateFormat formatter = new SimpleDateFormat("yyyy- MM-dd HH:mm:ss");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">String mDateTime=formatter.format(cal.getTime());<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">return (mDateTime);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">}<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">public java.sql.Date GetDate()<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">{<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">java.sql.Date mDate;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">Calendar cal = Calendar.getInstance();<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">SimpleDateFormat formatter = new SimpleDateFormat("yyyy- MM-dd HH:mm:ss");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">String mDateTime=formatter.format(cal.getTime());<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">return (java.sql.Date.valueOf(mDateTime));<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">}<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><strong><span lang="EN-US" style="FONT-SIZE: 22pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><o:p><font size="4">4 当前旉</font></o:p></span></strong></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">Calendar cal = Calendar.getInstance();<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">// SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM- dd HH:mm:ss");</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><span lang="EN-US"><o:p></o:p></span></span> </p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss G E D F w W a E F");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">String mDateTime=formatter.format(cal.getTime());<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println(mDateTime);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println("<br>");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><strong><span lang="EN-US" style="FONT-SIZE: 22pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><o:p><font size="4">5 一q前日期</font></o:p></span></strong></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">java.util.Date myDate=new java.util.Date();<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">long myTime=(myDate.getTime()/1000)-60*60*24*365;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">myDate.setTime(myTime*1000);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">String mDate=formatter.format(myDate);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println(mDate);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println("<br>");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><strong><span lang="EN-US" style="FONT-SIZE: 22pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><o:p><font size="4">6 明天日期</font></o:p></span></strong></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">myDate=new java.util.Date();<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">myTime=(myDate.getTime()/1000)+60*60*24;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">myDate.setTime(myTime*1000);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">mDate=formatter.format(myDate);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println(mDate);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println("<br>");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><strong><font size="4">7 两个旉之间的天?/font></strong><br />SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM- dd");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">java.util.Date date= myFormatter.parse("2003-05-1");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">java.util.Date mydate= myFormatter.parse("1899-12-30");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println(day);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println("<br>");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><strong><span lang="EN-US" style="FONT-SIZE: 22pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><o:p><font size="4">8 加半时</font></o:p></span></strong></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">java.util.Date date1 = format.parse("2002-02-28 23:16:00");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">long Time=(date1.getTime()/1000)+60*30;<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">date1.setTime(Time*1000);</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><span lang="EN-US"><o:p></o:p></span></span> </p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">String mydate1=formatter.format(date1);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println(mydate1);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println("<br>");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><strong><span lang="EN-US" style="FONT-SIZE: 22pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><o:p><font size="4">9 q月周求日期</font></o:p></span></strong></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM F E");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">java.util.Date date2= formatter2.parse("2003-05 5 星期?);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">SimpleDateFormat formatter3 = new SimpleDateFormat("yyyy-MM-dd");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">String mydate2=formatter3.format(date2);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println(mydate2);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println("<br>");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><strong><span lang="EN-US" style="FONT-SIZE: 22pt; COLOR: black; FONT-FAMILY: SimSun; mso-font-kerning: 0pt"><o:p><font size="4">10 求给定日期是星期?/font></o:p></span></strong></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">mydate= myFormatter.parse("2001-1-1");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">SimpleDateFormat formatter4 = new SimpleDateFormat("E");<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">String mydate3=formatter4.format(mydate);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println(mydate3);<o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0mm 0mm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: SimSun; mso-font-kerning: 0pt">out.println("<br>");<o:p></o:p></span></p><img src ="http://www.tkk7.com/matthew2006/aggbug/58325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/matthew2006/" target="_blank">matthew</a> 2006-07-15 14:52 <a href="http://www.tkk7.com/matthew2006/archive/2006/07/15/58325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见java面试?/title><link>http://www.tkk7.com/matthew2006/archive/2006/06/29/55813.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Thu, 29 Jun 2006 12:08:00 GMT</pubDate><guid>http://www.tkk7.com/matthew2006/archive/2006/06/29/55813.html</guid><wfw:comment>http://www.tkk7.com/matthew2006/comments/55813.html</wfw:comment><comments>http://www.tkk7.com/matthew2006/archive/2006/06/29/55813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/matthew2006/comments/commentRss/55813.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/matthew2006/services/trackbacks/55813.html</trackback:ping><description><![CDATA[ <p>Java基础斚w:</p> <p>1,作用域public,protected,private,以及不写时的区别</p> <p>          <font color="#0033ff">作用域   ?/font>                  <font color="#0033ff">当前c             ?同一package             子孙c          ?其他package </font></p> <p> <font color="#0033ff">           </font> <font color="#cc3333">public                           √                       ?√                       ?√                      ??/font> </p> <p> <font color="#cc3333">          </font> <font color="#cc3333"> protected                       √                      ?√                       ?√                       ?×</font> </p> <p> <font color="#cc3333">         </font> <font color="#cc3366"> friendly                          √                       ?√                         ×                       ?×</font> </p> <p> <font color="#cc3366">        </font> <font color="#993333">  private                            √                       ?×                        ×                          ×</font> </p> <p> <font color="#993333">          不写旉认ؓfriendly <br /></font> </p> <p>2,ArrayList和Vector的区?HashMap和Hashtable的区?/p> <p> <font color="#0033ff">{:ArrayList与Vector主要从二斚w来说. <br />一.同步?Vector是线E安全的Q也是说是同步的,而ArrayList是线E序不安全的Q不是同步的 <br />?数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一?<br />HashMap与HashTable主要从三斚w来说?<br />一.历史原因:Hashtable是基于陈旧的DictionarycȝQHashMap是Java 1.2引进的Map接口的一个实?<br />?同步?Hashtable是线E安全的Q也是说是同步的,而HashMap是线E序不安全的Q不是同步的 <br />?|只有HashMap可以让你空gZ个表的条目的key或value </font> </p> <p>3,char型变量能不能定义Z个中?Z?</p> <p> <font color="#0033ff">是能够定义成Z个中文的Q因为java中以unicode~码Q一个char?6个字节,所以放一个中文是没问题的 <br /></font> </p> <p>4,多线E有几种表示Ҏ,都是什?同步有几U实现方?都是什?</p> <p> <font color="#0033ff">多线E有两种实现ҎQ分别是l承ThreadcM实现Runnable接口 <br />同步的实现方面有一U,使用synchronized,wait,notify <br /></font> </p> <p>5,l承时候类的执行顺序问?一般都是选择?问你会打印Z?</p> <p>6,内部cȝ实现方式?</p> <p>7,垃圾回收机制,如何优化E序?</p> <p>8,float型float f=3.4是否正确?</p> <p>Jsp斚w</p> <p>1,jsp有哪些内|对?作用分别是什?</p> <p>2,jsp有哪些动?作用分别是什?</p> <p>3,include的两U实现方式的区别?</p> <p>4,两种跌{方式分别是什?有什么区?</p> <p>Servlet斚w</p> <p>1,说一说Servlet的生命周?</p> <p>2,Servlet版本?忘了问的是哪两个版本?的不?</p> <p>Jdbc,Jdo斚w</p> <p>1,可能会让你写一DJdbcqOracle的程?</p> <p>2,Class.forName的作?Z么要?</p> <p>3,Jdo是什?</p> <p> <font color="#0000ff">JDO是Java对象持久化的规范之一Qؓjava data object的简U?是一个用于存取某U数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发h员来_存储数据对象完全不需要额外的代码Q如JDBC API的用)。这些繁琐的例行工作已经转移到JDO产品提供商n上,使开发h员解脱出来,从而集中时间和_֊在业务逻辑上。另外,JDO很灵z,因ؓ它可以在M数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用Q提供到M数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMSQ等{,使得应用可移植性更强?/font> </p> <p>Xml斚w</p> <p>1,xml有哪些解析技?区别是什?</p> <p> <font color="#0000cc">DOM:处理大型文g时其性能下降的非常厉実뀂这个问题是由DOM的树l构所造成的,q种l构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随?/font> </p> <p> <font color="#0000cc">SAX:不现于DOM,SAX是事仉动型的XML解析方式。它序dXML文gQ不需要一ơ全部装载整个文件。当遇到像文件开_文档l束Q或者标{ּ头与标签l束Ӟ它会触发一个事Ӟ用户通过在其回调事g中写入处理代码来处理XML文gQ适合对XML的顺序访?</font> </p> <p> <font color="#0000cc"> <br />STAX:Streaming API for XML (StAX)</font> </p> <p>2,你在目中用Cxml技术的哪些斚w?如何实现?</p> <p> <font color="#0000ff">用到了数据存贮,信息配置两方面。在做数据交换^台时Q将不同数据源的数据l装成XML文gQ然后将XML文g压羃打包加密后通过|络传送给接收者,接收解密与解压羃后再同XML文g中还原相关信息进行处理。在做Y仉|时Q利用XML可以很方便的q行QY件的各种配置参数都存贮在XML文g中?/font> <br /> </p> <p>3,用jdom解析xml文g时如何解决中文问?如何解析?</p> <p>EJB斚w</p> <p>1,EJB2.0有哪些内?分别用在什么场? EJB2.0和EJB1.1的区?</p> <p>MVC斚w</p> <p>1,MVC的各个部分都有那些技术来实现?如何实现?</p> <p>设计模式斚w:</p> <p>1,开发中都用C那些设计模式?用在什么场?</p> <p>JavaScript斚w</p> <p>      1,如何校验数字?</p> <p>CORBA</p> <p>      1,CORBA是什?用途是什?</p> <p> </p> <p>以上是我的ȝ,可能不是全部,因ؓ旉问题,如果能够记v?我会再加?有些问题描述的可能不准确,希望大家批评指正,问题都很基础,即不知?׃一Ҏ间查?csdn/java?p弄懂,希望Ҏ在找工作的朋友有所帮助,有所提醒.一份正率很高的笔试卷可能会ؓ你的面试减轻负担,问不少问题.</p> <p>当然我还是要提醒?br /></p> <h2 align="center"> <a id="viewpost" > <font style="BACKGROUND-COLOR: #f5f5dc" color="#800080"> <u>Java陷阱一筐----面试题集</u> </font> </a> </h2> <p>扑ַ作要面试Q有面试有对付面试的办法。以下一些题目来自我和我朋友痛苦的面试经历,提这些问题的公司包括IBM, E*Trade, Siebel, Motorola, SUN, 以及其它大小公司?br /><br />面试是没什么道理可讲的Q它的题目有的不合情理、脱d际。有在纸上写的,有当面考你的,也有在电话里问的Q给你IDE的估计很?否则你赶快去买彩, 说不定中)。所以如果你看完此文后,请不要抱怨说q些问题都能用IDE来解冟뀂你必须在Q何情况下准确回答q些问题Q在面试中如果出C两题回答不准很 有可能你p拒之门外了?br /><br />当然q些都是Java的基本题Q那些面试的人大多数不会问你Hibernate有多先进QEclipse的三个组成部分,或command design patternQ他们都是老一辈了Q最喜欢问的是基础知识。别看了这些基Q我朋友水^一,l果栽在一到基知识的问题下Q和高薪无缘?br /><br />好了废话说Q开始正题?br /><br />W一Q谈谈final, finally, finalize的区别?br />最常被问到?/p> <p> <font color="#0033ff">final—修饰符Q关键字Q如果一个类被声明ؓfinalQ意味着它不能再z出新的子c,不能作ؓ父类被ѝ因此一个类不能既被声明?abstract的,又被声明为final的。将变量或方法声明ؓfinalQ可以保证它们在使用中不被改变。被声明为final的变量必d声明时给定初|而在以后的引用中只能dQ不可修攏V被声明为final的方法也同样只能使用Q不能重?<br />finally—再异常处理时提?finally 块来执行M清除操作。如果抛Z个异常,那么相匹配的 catch 子句׃执行Q然后控制就会进?finally 块(如果有的话)?<br />finalize—方法名。Java 技术允怋?finalize() Ҏ在垃圾收集器对象从内存中清除出M前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对q个对象调用的。它是在 Object cM定义的,因此所有的c都l承了它。子c覆?finalize() Ҏ以整理系l资源或者执行其他清理工作。finalize() Ҏ是在垃圾攉器删除对象之前对q个对象调用的?<br /><br /></font> <br />W二QAnonymous Inner Class (匿名内部c? 是否可以extends(l承)其它c,是否可以implements(实现)interface(接口)?<br /></p> <p> <font color="#0033ff">匿名的内部类是没有名字的内部cR不能extends(l承) 其它c,但一个内部类可以作ؓ一个接口,由另一个内部类实现?/font> </p> <p> <br />W三QStatic Nested Class ?Inner Class的不同,说得多好(面试题有的很W统)?/p> <p> </p> <p> <font color="#0033ff">Nested Class Q一般是C++的说法)QInner Class (一般是JAVA的说?。Java内部cMC++嵌套cL大的不同在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&page=1 <br />注: 静态内部类QInner ClassQ意味着1创徏一个static内部cȝ对象Q不需要一个外部类对象Q?不能从一个static内部cȝ一个对象访问一个外部类对象 <br /><br /></font> <br />W四Q?amp;?amp;&的区别?br />q个问得很少?/p> <p> <font color="#0033ff">&是位q算W?amp;&是布逻辑q算W?br /></font> <br />W五QHashMap和Hashtable的区别?br />帔R?/p> <p> <font color="#0033ff">都属于Map接口的类Q实C惟一键映到特定的g?<br />HashMap cL有分cL者排序。它允许一?null 键和多个 null 倹{?<br />Hashtable cM?HashMapQ但是不允许 null 键和 null 倹{它也比 HashMap 慢,因ؓ它是同步的?br /></font> <br />W六QCollection ?Collections的区别?br />你千万别说一个是单数一个是复数?/p> <p> <font color="#0033ff">Collections是个java.util下的c,它包含有各种有关集合操作的静态方法?<br />Collection是个java.util下的接口Q它是各U集合结构的父接口?<br /></font> <br /> <br />W七Q什么时候用assert?br />APIU的技术h员有可能会问q个?/p> <p> <font color="#0033ff">断言是一个包含布表辑ּ的语句,在执行这个语句时假定该表辑ּ?true。如果表辑ּ计算?falseQ那么系l会报告一?AssertionError。它用于调试目的Q?<br />assert(a > 0); // throws an AssertionError if a <= 0 <br />断言可以有两UŞ式: <br />assert Expression1 ; <br />assert Expression1 : Expression2 ; <br />Expression1 应该L产生一个布倹{?<br />Expression2 可以是得Z个值的L表达式。这个值用于生成显C更多调试信息的 String 消息?<br />断言在默认情况下是禁用的。要在编译时启用断言Q需要?source 1.4 标记Q?<br />javac -source 1.4 Test.java <br />要在q行时启用断aQ可使用 -enableassertions 或?-ea 标记?<br />要在q行旉择用断言Q可使用 -da 或?-disableassertions 标记?<br />要系l类中启用断aQ可使用 -esa 或?-dsa 标记。还可以在包的基上启用或者禁用断a?<br />可以在预计正常情况下不会到达的Q何位|上攄断言。断a可以用于验证传递给U有Ҏ的参数。不q,断言不应该用于验证传递给公有Ҏ的参敎ͼ因ؓ不管是否启用了断aQ公有方法都必须查其参数。不q,既可以在公有Ҏ中,也可以在非公有方法中利用断言试后置条g。另外,断言不应该以M方式改变E序的状态?<br /></font> <br /> <br />W八QGC是什? Z么要有GC? <br />基础?br /></p> <p> <font color="#0033cc">GC是垃圾收集器。Java E序员不用担心内存管理,因ؓ垃圾攉器会自动q行理。要h垃圾攉Q可以调用下面的Ҏ之一Q?<br />System.gc() <br />Runtime.getRuntime().gc() <br /></font> <br />W九QString s = new String("xyz");创徏了几个String Object?</p> <p> <font color="#0033ff">问题太bt,偶不回答Q?br /></font> <br />W十QMath.round(11.5){於多少? Math.round(-11.5){於多少?</p> <p> <font color="#0033ff">Math.round(11.5)q回QlongQ?2QMath.round(-11.5)q回QlongQ?11; <br /></font> <br />W十一Qshort s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?<br />面试题都是很变态的Q要做好受虐的准备?/p> <p> <font color="#0033ff">short s1 = 1; s1 = s1 + 1;有错Qs1是short型,s1+1是int?不能昑ּ转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。?Q?br /><br /></font>W十二,sleep() ?wait() 有什么区?<br />搞线E的最爱?/p> <p> <font color="#0033ff">sleep()Ҏ是ɾU程停止一D|间的Ҏ。在sleep 旉间隔期满后,U程不一定立x复执行。这是因为在那个时刻Q其它线E可能正在运行而且没有被调度ؓ攑ּ执行Q除?a)“醒来”的U程h更高的优先 <br />(b)正在q行的线E因为其它原因而阻塞?<br />wait()是线E交互时Q如果线E对一个同步对象x 发出一个wait()调用Q该U程会暂停执行,被调对象q入{待状态,直到被唤醒或{待旉到?<br /><br /></font> <br />W十三,Java有没有goto?<br />很十三的问题Q如果哪个面试的问到q个问题Q我劝你q是别进q家公司?/p> <p> <font color="#0033ff">Goto—java中的保留字,现在没有在java中用?/font> <br /> <br />W十四,数组有没有length()q个Ҏ? String有没有length()q个Ҏ?</p> <p> <font color="#0033ff">数组没有length()q个ҎQ有length的属性?<br />String有有length()q个Ҏ?<br /></font> <br /> <br />W十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的cd?<br />帔R?/p> <p> <font color="#0033ff">Ҏ的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父cM子类之间多态性的一U表玎ͼ重蝲Overloading是一个类中多态性的一U表现。如果在子类中定义某Ҏ与其父类有相同的名称和参敎ͼ我们说该Ҏ被重?(Overriding)。子cȝ对象使用q个ҎӞ调用子cM的定义,对它而言Q父cM的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参C数或有不同的参数cdQ则UCؓҎ的重?Overloading)。Overloaded的方法是可以改变q回值的cd?<br /></font> <br /> <br />W十六,Set里的元素是不能重复的Q那么用什么方法来区分重复与否? 是用==q是equals()? 它们有何区别?</p> <p> <font color="#0033ff">Set里的元素是不能重复的Q那么用iterator()Ҏ来区分重复与否。equals()是判M个Set是否相等?<br />equals()?=Ҏ军_引用值是否指向同一对象equals()在类中被覆盖Qؓ的是当两个分ȝ对象的内容和cd盔R的话Q返回真倹{?Q不知所云)<br /><br /></font> <br />W十七,l我一个你最常见到的runtime exception?br />如果你这个答不出来,面试的h会认Z没有实际~程l验?/p> <p> <font color="#0033ff">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 <br /></font> <br /> <br />W十八,error和exception有什么区?</p> <p> <font color="#0033ff">error 表示恢复不是不可能但很困隄情况下的一U严重问题。比如说内存溢出。不可能指望E序能处理这L情况?<br />exception 表示一U设计或实现问题。也是_它表C如果程序运行正常,从不会发生的情况</font>?br /><br />W十九,List, Set, Map是否l承自Collection接口?</p> <p> <font color="#0033ff">ListQSet?<br /><br />Map不是 <br /></font> <br /> <br />W二十,abstract class和interface有什么区?<br />帔R?/p> <p> <font color="#0033ff">声明Ҏ的存在而不d现它的类被叫做抽象类Qabstract classQ,它用于要创徏一个体现某些基本行为的c,qؓ该类声明ҎQ但不能在该cM实现该类的情c不能创建abstract cȝ实例。然而可以创Z个变量,其类型是一个抽象类Qƈ让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract cȝ子类为它们父cM的所有抽象方法提供实玎ͼ否则它们也是抽象cMؓ。取而代之,在子cM实现该方法。知道其行ؓ的其它类可以在类中实现这些方法?<br />接口QinterfaceQ是抽象cȝ变体。在接口中,所有方法都是抽象的。多l承性可通过实现q样的接口而获得。接口中的所有方法都是抽象的Q没有一个有E序体。接口只可以定义static final成员变量。接口的实现与子cȝ|除了该实现类不能从接口定义中l承行ؓ。当cd现特D接口时Q它定义Q即程序体l予Q所有这U接口的Ҏ。然后,它可以在实现了该接口的类的Q何对象上调用接口的方法。由于有抽象c,它允怋用接口名作ؓ引用变量的类型。通常的动态联~将生效。引用可以{换到接口cd或从接口cd转换Qinstanceof q算W可以用来决定某对象的类是否实现了接口?/font> <br /> <br /> <br />W二十一Qabstract的method是否可同时是static,是否可同时是nativeQ是否可同时是synchronized?</p> <p> <font color="#0000cc">不能</font> <br /> <br /> <br />W二十二Q接口是否可l承接口? 抽象cL否可实现(implements)接口? 抽象cL否可l承实体c?concrete class)?</p> <p> <font color="#0000cc">接口可以l承接口。抽象类可以实现(implements)接口Q抽象类是否可承实体类Q但前提是实体类必须有明的构造函数?<br /></font> <br /> <br />W二十三Q启动一个线E是用run()q是start()?</p> <p> <font color="#0000cc">启动一个线E是调用start()ҎQɾU程所代表的虚拟处理机处于可运行状态,q意味着它可以由JVM调度q执行。这q不意味着U程׃立即q行。run()Ҏ实执行的内容?/font> <br /> <br />W二十四Q构造器Constructor是否可被override?</p> <p> <font color="#0000cc">构造器Constructor不能被承,因此不能重写OverridingQ但可以被重载Overloading?/font> <br /> <br />W二十五Q是否可以承Stringc?<br /><br />W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方?<br /><br />W二十七Qtry {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后?<br /><br />W二十八Q编E题: 用最有效率的Ҏ出2乘以8{於?<br />有C背景的程序员特别喜欢问这U问题?br /><br />W二十九Q两个对象值相?x.equals(y) == true)Q但却可有不同的hash codeQ这句话对不?<br /><br />W三十,当一个对象被当作参数传递到一个方法后Q此Ҏ可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传?<br /><br />W三十一Qswtich是否能作用在byte上,是否能作用在long上,是否能作用在String?<br /><br />W三十二Q编E题: 写一个Singleton出来?br /></p> <img src ="http://www.tkk7.com/matthew2006/aggbug/55813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/matthew2006/" target="_blank">matthew</a> 2006-06-29 20:08 <a href="http://www.tkk7.com/matthew2006/archive/2006/06/29/55813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://bying100.com" target="_blank">ɫƷһ</a>| <a href="http://7uj3.com" target="_blank">վ߹ۿ</a>| <a href="http://lshwork.com" target="_blank">AVרAV</a>| <a href="http://dd99com.com" target="_blank">Ʒ޳a߹ۿ</a>| <a href="http://666fzw.com" target="_blank">ƷСƵ</a>| <a href="http://w6626.com" target="_blank">˾Ʒһ</a>| <a href="http://kekead.com" target="_blank">޳aһ</a>| <a href="http://653349.com" target="_blank">ŮڵƵվ</a>| <a href="http://www-3499.com" target="_blank">ѿŮճˮƵ</a>| <a href="http://by11gun.com" target="_blank">ɫҳѹۿ</a>| <a href="http://33a55.com" target="_blank">þþ뾫Ʒպ </a>| <a href="http://tzkanglong.com" target="_blank">þþþרav</a>| <a href="http://xmmn77.com" target="_blank">ؼëƬ69ѹۿ</a>| <a href="http://ajguild.com" target="_blank">Ʒ޶߹ۿ</a>| <a href="http://cqkalai.com" target="_blank">91Ѹվ</a>| <a href="http://rr433.com" target="_blank">AVŷAVվ</a>| <a href="http://zzhdrsqwx.com" target="_blank">һƵѸ</a>| <a href="http://dqcjlb.com" target="_blank">ۺС˵ </a>| <a href="http://sxjttxkywl.com" target="_blank">ҸŮˬ߳Ƭ</a>| <a href="http://zndijgch.com" target="_blank">ֻѸۿ</a>| <a href="http://mmm19.com" target="_blank">ƷƬ߻</a>| <a href="http://kkxzz.com" target="_blank">Ļպ</a>| <a href="http://7755ga.com" target="_blank">ҹAV</a>| <a href="http://zhaoav7.com" target="_blank">޼Ƶվ</a>| <a href="http://xieehuomh.com" target="_blank">ѻɫСƵվ</a>| <a href="http://ahsuibao.com" target="_blank">һɫëƬ</a>| <a href="http://gzltchem.com" target="_blank">۲ӰԺþþƷ</a>| <a href="http://moushengguigz.com" target="_blank">ҰߵӰۿƵ</a>| <a href="http://www-777730.com" target="_blank">ۺϾþþƷɫ</a>| <a href="http://nblfkj.com" target="_blank">ѳ¼Ƶ</a>| <a href="http://ssdtsz.com" target="_blank">ɫtvվѿ</a>| <a href="http://as5566.com" target="_blank">Ļ</a>| <a href="http://25gh.com" target="_blank">ձĻһ </a>| <a href="http://28896543.com" target="_blank">޹һƷ</a>| <a href="http://sdzntg.com" target="_blank">ĻmvߵӰ</a>| <a href="http://6wss.com" target="_blank">޳aëƬ</a>| <a href="http://qq2071.com" target="_blank">ĻһƷһ</a>| <a href="http://mtripmall.com" target="_blank">6080ҹһëƬѿ </a>| <a href="http://zddzbp.com" target="_blank">þavСݲ</a>| <a href="http://chandou8.com" target="_blank">һavҩ߳</a>| <a href="http://www-840012.com" target="_blank">޹Ӱavַ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>