﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-風向逆轉 - 就要爪哇-文章分类-JavaSE&amp;JavaEE</title><link>http://www.blogjava.net/iKingQu/category/8101.html</link><description>Java菜鸟升级中...</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:26:03 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:26:03 GMT</pubDate><ttl>60</ttl><item><title>[收藏]Random类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80355.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80355.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80355.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80355.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80355.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80355.html</trackback:ping><description><![CDATA[
		<span style="COLOR: indigo">属于包：java.util.Random</span>
		<br />
		<br />
		<b>Random：随机类型</b>
		<br />
		<br />
		<span style="COLOR: blue">１、属性。</span>
		<br />
		<br />无。<br /><br /><span style="COLOR: blue">２、构造函数。</span><br /><br /><span style="COLOR: green">Random()</span> ：创建一个新的随机数发生器。<br /><br /><span style="COLOR: green">Random(long seed) </span>：用一个种子（长整型）创建一个随机数发生器。<br /><br /><span style="COLOR: blue">３、方法。</span><br /><span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span><span style="COLOR: olive"><br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span><br /><br /><br /><ul>1. <span style="COLOR: green">protected int next(int bits) </span>：产生下一个伪随机数。<br /><br />2. <span style="COLOR: green">boolean nextBoolean() </span>：返回下一个从随机发生器的系列中得到的均匀分布的布尔值。<br /><br />3. <span style="COLOR: green">void nextBytes(byte[] bytes) </span>：产生随机字节数组放到指定的数组中。<br /><br />4. <span style="COLOR: green">double nextDouble() </span>：返回下一个从随机发生器的系列中得到的均匀分布的0.0到1.0的双精度类型值。<br /><br />5. <span style="COLOR: green">float nextFloat() </span>：返回下一个从随机发生器的系列中得到的均匀分布的0.0到1.0的浮点类型值。<br /><br />6. <span style="COLOR: green">double nextGaussian()</span> ：返回下一个从随机发生器的系列中得到的符合均匀分布的0.0的平均数到1.0方差的高斯分布双精度类型值。<br /><br />7. <span style="COLOR: green">int nextInt() </span>：返回下一个从随机发生器的系列中得到的均匀分布的整型值。<br /><br />8. <span style="COLOR: green">int nextInt(int n) </span>：返回下一个从随机发生器的系列中得到的均匀分布的0到指定整型数（n）之间的整型值。<br /><br />9. <span style="COLOR: green">long nextLong() </span>：返回下一个从随机发生器的系列中得到的均匀分布的长整型值。<br /><br />10. <span style="COLOR: green">void setSeed(long seed) </span>：设置随机数发生器的种子为一个长整型数。</ul><br /><br /><span style="COLOR: red">关于种子的描述：</span><br />这个类的对象使用一个48位的种子，<br />如果这个类的两个实例是用同一个种子创建的，<br />并且，各自对它们以同样的顺序调用方法，<br />则它们会产生相同的数字序列。<br /><br />下面就对上面的介绍做一个实验，<br />尤其注意相同种子时的结果，<br /><span style="COLOR: brown">如果用默认的构造函数构造对象，<br />他们是属于同一个种子的。</span><br /><br /><pre>import java.util.Random;<br /><br />public class TestRandom{<br />	public static void main(String[] args){<br />		Random r1 = new Random(50);<br />		System.out.println("第一个种子为50的Random对象");<br />		System.out.println("r1.nextBoolean():\t" + r1.nextBoolean());<br />		System.out.println("r1.nextInt():\t\t" + r1.nextInt());<br />		System.out.println("r1.nextDouble():\t" + r1.nextDouble());<br />		System.out.println("r1.nextGaussian():\t" + r1.nextGaussian());<br />		System.out.println("---------------------------");<br /><br />		Random r2 = new Random(50);<br />		System.out.println("第二个种子为50的Random对象");<br />		System.out.println("r2.nextBoolean():\t" + r2.nextBoolean());<br />		System.out.println("r2.nextInt():\t\t" + r2.nextInt());<br />		System.out.println("r2.nextDouble():\t" + r2.nextDouble());<br />		System.out.println("r2.nextGaussian():\t" + r2.nextGaussian());<br />		System.out.println("---------------------------");<br /><br />		Random r3 = new Random(100);<br />		System.out.println("种子为100的Random对象");<br />		System.out.println("r3.nextBoolean():\t" + r3.nextBoolean());<br />		System.out.println("r3.nextInt():\t\t" + r3.nextInt());<br />		System.out.println("r3.nextDouble():\t" + r3.nextDouble());<br />		System.out.println("r3.nextGaussian():\t" + r3.nextGaussian());<br /><br />		System.out.println("结果一目了然！");<br />	}<br />}</pre><br />结果：<br /><pre><br />第一个种子为50的Random对象<br />r1.nextBoolean():       true<br />r1.nextInt():           -1727040520<br />r1.nextDouble():        0.6141579720626675<br />r1.nextGaussian():      2.377650302287946<br />---------------------------<br />第二个种子为50的Random对象<br />r2.nextBoolean():       true<br />r2.nextInt():           -1727040520<br />r2.nextDouble():        0.6141579720626675<br />r2.nextGaussian():      2.377650302287946<br />---------------------------<br />种子为100的Random对象<br />r3.nextBoolean():       true<br />r3.nextInt():           -1139614796<br />r3.nextDouble():        0.19497605734770518<br />r3.nextGaussian():      0.6762208162903859<br />结果一目了然！</pre><img src ="http://www.blogjava.net/iKingQu/aggbug/80355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:37 <a href="http://www.blogjava.net/iKingQu/articles/80355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]StringBuffer类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80354.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80354.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80354.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80354.html</trackback:ping><description><![CDATA[
		<strong>StringBuffer：StringBuffer类型<br /><br /></strong>
		<span style="COLOR: darkblue">描述：在实际应用中，经常回遇到对字符串进行动态修改。这时候，String类的功能受到限制，而StringBuffer类可以完成字符串的动态添加、插入和替换等操作。</span>
		<br />
		<br />
		<span style="COLOR: blue">１、构造函数。</span>
		<br />
		<ul>
				<span style="COLOR: green">StringBuffer() </span>：构造一个没有任何字符的StringBuffer类。<br /><span style="COLOR: green">StringBuffer(int length) </span>： ：构造一个没有任何字符的StringBuffer类，并且，其长度为length。<br /><span style="COLOR: green">StringBuffer(String str) </span>：以str为初始值构造一个StringBuffer类。</ul>
		<br />
		<br />
		<span style="COLOR: blue">２、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>
				<span style="COLOR: green">1. StringBuffer append(boolean b) <br />2. StringBuffer append(char c) <br />3. StringBuffer append(char[] str) <br />4. StringBuffer append(char[] str, int offset, int len) <br />5. StringBuffer append(double d) <br />6. StringBuffer append(float f) <br />7. StringBuffer append(int i) <br />8. StringBuffer append(long l) <br />9. StringBuffer append(Object obj) <br />10. StringBuffer append(String str) <br />11. StringBuffer append(StringBuffer sb) </span>
				<br />
				<br />以上的方法都是向字符串缓冲区“追加”元素，但是，这个“元素”参数可以是布尔量、字符、字符数组、双精度数、浮点数、整型数、长整型数对象类型的字符串、字符串和StringBuffer类等。如果添加的字符超出了字符串缓冲区的长度，Java将自动进行扩充。</ul>
		<br />
		<pre>		String question = new String("1+1=");<br />		int answer = 3;<br />		boolean result = (1+1==3);<br /><br />		StringBuffer sb = new StringBuffer();<br />		sb.append(question);<br />		sb.append(answer);<br />		sb.append('\t');<br />		sb.append(result);<br /><br />		System.out.println(sb);<br />结果为：<br />1+1=3   false</pre>
		<br />
		<ul>12. <span style="COLOR: green">int capacity() </span>：返回当前StringBuffer对象（字符串缓冲区）的总空间，而非字符号串的长度。<br />13. <span style="COLOR: green">char charAt(int index) </span>：在当前StringBuffer对象中取索引号为index的字符。第一个字符的索引为“0”<br />14. <span style="COLOR: green">StringBuffer delete(int start, int end) </span>：删除当前StringBuffer对象中以索引号start开始，到end结束的子串。<br />15. <span style="COLOR: green">StringBuffer deleteCharAt(int index) </span>：删除当前StringBuffer对象中索引号为index的字符。<br />16. <span style="COLOR: green">void ensureCapacity(int minimumCapacity)</span> ：重新设置字符号串缓冲区的总空间。如果minimumCapacity大于当前的总空间，则新的空间被设置：一种结果是minimumCapacity；另一种结果是{“老空间”乘2加2}。</ul>
		<br />
		<pre>		StringBuffer sb1 = new StringBuffer(5);<br />		StringBuffer sb2 = new StringBuffer(5);<br /><br />		sb1.ensureCapacity(6);<br />		sb2.ensureCapacity(100);<br /><br />		System.out.println( "sb1.Capacity: " + sb1.capacity() );<br />		System.out.println( "sb2.Capacity: " + sb2.capacity() );<br />结果为：<br />sb1.Capacity: 12<br />sb2.Capacity: 100</pre>
		<br />
		<ul>17. <span style="COLOR: green">void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)</span> ：从当前StringBuffer对象的索引号srcBegin开始，到srcEnd结束的子串，赋值到字符数组dst中，并且从dst的索引号dstBegin开始。</ul>
		<br />
		<pre>		StringBuffer sb = new StringBuffer("I love her!");<br />		char[] i = {'I',' ','l','o','v','e',' ','y','o','u'};<br /><br />		sb.getChars(7,10,i,7);<br /><br />		System.out.println( "sb: " + sb );<br />结果为：sb: I love her!</pre>
		<br />
		<ul>18. <span style="COLOR: green">int indexOf(String str)</span> ：返回当前StringBuffer对象中，第一个满足str子串的位置。<br />19. <span style="COLOR: green">int indexOf(String str, int fromIndex)</span> ：从当前StringBuffer对象的fromIndex开始查找，返回第一个满足str子串的位置。<br /><span style="COLOR: green">20. StringBuffer insert(int offset, boolean b) <br />21. StringBuffer insert(int offset, char c) <br />22. StringBuffer insert(int offset, char[] str) <br />23. StringBuffer insert(int index, char[] str, int offset, int len) <br />24. StringBuffer insert(int offset, double d) <br />25. StringBuffer insert(int offset, float f) <br />26. StringBuffer insert(int offset, int i) <br />27. StringBuffer insert(int offset, long l) <br />28. StringBuffer insert(int offset, Object obj) <br />29. StringBuffer insert(int offset, String str) </span><br /><br />以上的方法都是在当前StringBuffer对象中插入一个元素，在索引号offset处插入相应的值。<br />30. <span style="COLOR: green">int lastIndexOf(String str) </span>：返回当前StringBuffer对象中，最后一个满足str子串的位置。<br />31. <span style="COLOR: green">int lastIndexOf(String str, int fromIndex)</span> ：从当前StringBuffer对象的fromIndex开始查找，返回最后一个满足str子串的位置。<br />32. <span style="COLOR: green">int length() </span>：返回当前StringBuffer对象（字符缓冲区）中，字符串的长度。<span style="COLOR: red">注意：此方法与capacity() 不同。</span><br />33. <span style="COLOR: green">StringBuffer replace(int start, int end, String str)</span> ：替换当前StringBuffer对象的字符串。从start开始，到end结束的位置替换成str。<br />34. <span style="COLOR: green">StringBuffer reverse() </span>：将字符串翻转。</ul>
		<br />
		<pre>		StringBuffer sb = new StringBuffer("0123456789");<br />		System.out.println( "sb.reverse(): " + sb.reverse() );<br />结果为：sb.reverse(): 9876543210</pre>
		<br />
		<ul>35. <span style="COLOR: green">void setCharAt(int index, char ch)</span> ：设置索引号index的字符为ch。<br />36. <span style="COLOR: green">void setLength(int newLength) </span>：重新设置字符串缓冲区中字符串的长度，如果newLength小于当前的字符串长度，将截去多余的字符。</ul>
		<br />
		<pre>		StringBuffer sb = new StringBuffer("0123456789");<br />		sb.setLength(5);<br />		System.out.println( "sb: " + sb );<br />结果为：sb: 01234</pre>
		<br />
		<ul>37.<span style="COLOR: green"> String substring(int start) </span>：取当前StringBuffer对象中，从start开始到结尾的子串。<br />38. <span style="COLOR: green">String substring(int start, int end) </span>：取当前StringBuffer对象中，从start开始到end的子串。<br />39. <span style="COLOR: green">String toString() </span>：将当前StringBuffer对象转换成String对象。</ul>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:36 <a href="http://www.blogjava.net/iKingQu/articles/80354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]StringTokenizer类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80352.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80352.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80352.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80352.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80352.html</trackback:ping><description><![CDATA[
		<strong>StringTokenizer：字符串分隔解析类型<br /></strong>
		<span style="COLOR: indigo">属于：java.util包。</span>
		<br />
		<br />
		<span style="COLOR: blue">１、构造函数。</span>
		<br />
		<ul>
				<br />1. <span style="COLOR: green">StringTokenizer(String str)</span> ：构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。<br />2. <span style="COLOR: green">StringTokenizer(String str, String delim) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符。<br />3. <span style="COLOR: green">StringTokenizer(String str, String delim, boolean returnDelims) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符，同时，指定是否返回分隔符。</ul>
		<br />
		<br />
		<span style="COLOR: blue">２、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>1. <span style="COLOR: green">int countTokens() </span>：返回nextToken方法被调用的次数。如果采用构造函数1和2，返回的就是分隔符数量(例2)。<br />2. <span style="COLOR: green">boolean hasMoreTokens() </span>：返回是否还有分隔符。<br />3. <span style="COLOR: green">boolean hasMoreElements() </span>：结果同2。<br />4. <span style="COLOR: green">String nextToken()</span> ：返回从当前位置到下一个分隔符的字符串。<br />5. <span style="COLOR: green">Object nextElement() </span>：结果同4。<br />6. <span style="COLOR: green">String nextToken(String delim)</span> ：与4类似，以指定的分隔符返回结果。</ul>
		<br />
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>		String s = new String("The Java platform is the ideal platform for network computing");<br />		StringTokenizer st = new StringTokenizer(s);<br />		System.out.println( "Token Total: " + st.countTokens() );<br />		while( st.hasMoreElements() ){<br />			System.out.println( st.nextToken() );<br />　　　　　　　　　　　}<br />结果为：<br />Token Total: 10<br />The<br />Java<br />platform<br />is<br />the<br />ideal<br />platform<br />for<br />network<br />computing<br /></pre>
		<br />
		<span style="COLOR: olive">例2:</span>
		<br />
		<pre>		String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing");<br />		StringTokenizer st = new StringTokenizer(s,"=",true);<br />		System.out.println( "Token Total: " + st.countTokens() );<br />		while( st.hasMoreElements() ){<br />			System.out.println( st.nextToken() );<br />		}<br />结果为：<br />Token Total: 19<br />The<br />=<br />Java<br />=<br />platform<br />=<br />is<br />=<br />the<br />=<br />ideal<br />=<br />platform<br />=<br />for<br />=<br />network<br />=<br />computing<br /></pre>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:35 <a href="http://www.blogjava.net/iKingQu/articles/80352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]String类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80347.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80347.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80347.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80347.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80347.html</trackback:ping><description><![CDATA[
		<strong>String：字符串类型<br /></strong>
		<span style="COLOR: brown">此帖参考了maxlyy朋友的帖子，在这里特别感谢。</span>
		<br />
		<span style="COLOR: blue">１、构造函数。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">String()</span> ：构造一个空字符串对象。<br /><span style="COLOR: green">String(byte[] bytes)</span> ：通过byte数组构造字符串对象。<br /><span style="COLOR: green">String(byte[] bytes, int offset, int length)</span> ：通过byte数组，从offset开始，总共length长的字节构造字符串对象。<br /><span style="COLOR: green">String(char[] value)</span> ：通过char数组构造字符串对象。<br /><span style="COLOR: green">String(char[] value, int offset, int count) </span>：通过char数组，从offset开始，总共length长的字节构造字符串对象。<br /><span style="COLOR: green">String(String original)</span> ：构造一个original的副本。既，拷贝一个original。<br /><span style="COLOR: green">String(StringBuffer buffer) </span>：通过StringBuffer数组构造字符串对象；<br /></ul>
		<br />
		<pre>	byte[] b = {'a','b','c','d','e','f','g','h','i','j'};<br />	char[] c = {'0','1','2','3','4','5','6','7','8','9'};<br /><br />	String sb = new String(b);<br />	String sb_sub = new String(b,3,2);<br />	String sc = new String(c);<br />	String sc_sub = new String(c,3,2);<br />	String sb_copy = new String(sb);<br /><br />	System.out.println("sb: " + sb );<br />	System.out.println("sb_sub: " + sb_sub );<br />	System.out.println("sc: " + sc );<br />	System.out.println("sc_sub: " + sc_sub );<br />	System.out.println("sb_copy: " + sb_copy );<br />结果为：<br />sb: abcdefghij<br />sb_sub: de<br />sc: 0123456789<br />sc_sub: 34<br />sb_copy: abcdefghij</pre>
		<br />
		<span style="COLOR: blue">２、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>
				<br />1. <span style="COLOR: green">char charAt(int index)</span> ：取字符串中的某一个字符，其中的参数index指的是字符串中序数。字符串的序数从0开始到length()-1 。</ul>
		<br />
		<pre>	String s = new String("abcdefghijklmnopqrstuvwxyz");<br />	System.out.println("s.charAt(5): " + s.charAt(5) );<br />结果为：s.charAt(5): f</pre>
		<br />
		<ul>2. <span style="COLOR: green">int compareTo(String anotherString)</span> ：当前String对象与anotherString比较。相等关系返回０；不相等时，从两个字符串第0个字符开始比较，返回第一个不相等的字符差，另一种情况，较长字符串的前面部分恰巧是较短的字符串，返回它们的长度差。<br />3. <span style="COLOR: green">int compareTo(Object o)</span> ：如果o是String对象，和2的功能一样；否则抛出ClassCastException异常。</ul>
		<br />
		<pre>	String s1 = new String("abcdefghijklmn");<br />	String s2 = new String("abcdefghij");<br />	String s3 = new String("abcdefghijalmn");<br /><br />	System.out.println("s1.compareTo(s2): " + s1.compareTo(s2) );//返回长度差<br />	System.out.println("s1.compareTo(s3): " + s1.compareTo(s3) );//返回'k'-'a'的差<br />结果为：<br />s1.compareTo(s2): 4<br />s1.compareTo(s3): 10</pre>
		<br />
		<ul>
				<br />4. <span style="COLOR: green">String concat(String str) </span>：将该String对象与str连接在一起。<br />5. <span style="COLOR: green">boolean contentEquals(StringBuffer sb)</span> ：将该String对象与StringBuffer对象sb进行比较。<br />6. <span style="COLOR: green">static String copyValueOf(char[] data) </span>：<br />7. <span style="COLOR: green">static String copyValueOf(char[] data, int offset, int count)</span> ：这两个方法将char数组转换成String，与其中一个构造函数类似。<br />8. <span style="COLOR: green">boolean endsWith(String suffix) </span>：该String对象是否以suffix结尾。</ul>
		<br />
		<pre>	String s1 = new String("abcdefghij");<br />	String s2 = new String("ghij");<br />	System.out.println("s1.endsWith(s2): " + s1.endsWith(s2) );<br />结果为：s1.endsWith(s2): true</pre>
		<br />
		<ul>
				<br />9. <span style="COLOR: green">boolean equals(Object anObject)</span> ：当anObject不为空并且与当前String对象一样，返回true；否则，返回false。<br />10. <span style="COLOR: green">byte[] getBytes()</span> ：将该String对象转换成byte数组。<br />11. <span style="COLOR: green">void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) </span>：该方法将字符串拷贝到字符数组中。其中，srcBegin为拷贝的起始位置、srcEnd为拷贝的结束位置、字符串数值dst为目标字符数组、dstBegin为目标字符数组的拷贝起始位置。</ul>
		<br />
		<pre>	char[] s1 = {'I',' ','l','o','v','e',' ','h','e','r','!'};//s1=I love her!<br />	String s2 = new String("you!");<br />	s2.getChars(0,3,s1,7);	//s1=I love you!<br />	System.out.println( s1 );<br />结果为：I love you!</pre>
		<br />
		<ul>12. <span style="COLOR: green">int hashCode() </span>：返回当前字符的哈希表码。<br />13. <span style="COLOR: green">int indexOf(int ch) </span>：只找第一个匹配字符位置。<br />14. <span style="COLOR: green">int indexOf(int ch, int fromIndex)</span> ：从fromIndex开始找第一个匹配字符位置。<br />15. <span style="COLOR: green">int indexOf(String str)</span> ：只找第一个匹配字符串位置。<br />16. <span style="COLOR: green">int indexOf(String str, int fromIndex) </span>：从fromIndex开始找第一个匹配字符串位置。</ul>
		<br />
		<pre>	String s = new String("write once, run anywhere!");<br />	String ss = new String("run");<br />	System.out.println("s.indexOf('r'): " + s.indexOf('r') );<br />	System.out.println("s.indexOf('r',2): " + s.indexOf('r',2) );<br />	System.out.println("s.indexOf(ss): " + s.indexOf(ss) );<br />结果为：<br />s.indexOf('r'): 1<br />s.indexOf('r',2): 12<br />s.indexOf(ss): 12</pre>
		<br />
		<ul>17. <span style="COLOR: green">int lastIndexOf(int ch) </span><br />18. <span style="COLOR: green">int lastIndexOf(int ch, int fromIndex) </span><br />19. <span style="COLOR: green">int lastIndexOf(String str) </span><br />20. <span style="COLOR: green">int lastIndexOf(String str, int fromIndex) </span>以上四个方法与13、14、15、16类似，不同的是：找最后一个匹配的内容。<br />21. <span style="COLOR: green">int length() </span>：返回当前字符串长度。<br />22. <span style="COLOR: green">String replace(char oldChar, char newChar)</span> ：将字符号串中第一个oldChar替换成newChar。<br />23. <span style="COLOR: green">boolean startsWith(String prefix)</span> ：该String对象是否以prefix开始。<br />24. <span style="COLOR: green">boolean startsWith(String prefix, int toffset)</span> ：该String对象从toffset位置算起，是否以prefix开始。</ul>
		<br />
		<pre>	String s = new String("write once, run anywhere!");<br />	String ss = new String("write");<br />	String sss = new String("once");<br />	System.out.println("s.startsWith(ss): " + s.startsWith(ss) );<br />	System.out.println("s.startsWith(sss,6): " + s.startsWith(sss,6) );<br />结果为：<br />s.startsWith(ss): true<br />s.startsWith(sss,6): true</pre>
		<br />
		<ul>25. <span style="COLOR: green">String substring(int beginIndex)</span> ：取从beginIndex位置开始到结束的子字符串。<br />26.<span style="COLOR: green">String substring(int beginIndex, int endIndex) </span>：取从beginIndex位置开始到endIndex位置的子字符串。<br />27. <span style="COLOR: green">char[] toCharArray() </span>：将该String对象转换成char数组。<br />28. <span style="COLOR: green">String toLowerCase() </span>：将字符串转换成小写。<br />29. <span style="COLOR: green">String toUpperCase()</span> ：将字符串转换成大写。</ul>
		<br />
		<pre>	String s = new String("java.lang.Class String");<br />	System.out.println("s.toUpperCase(): " + s.toUpperCase() );<br />	System.out.println("s.toLowerCase(): " + s.toLowerCase() );<br />结果为：<br />s.toUpperCase(): JAVA.LANG.CLASS STRING<br />s.toLowerCase(): java.lang.class string</pre>
		<br />
		<ul>30. <span style="COLOR: green">static String valueOf(boolean b) </span><br />31. <span style="COLOR: green">static String valueOf(char c) </span><br />32. <span style="COLOR: green">static String valueOf(char[] data) </span><br />33. <span style="COLOR: green">static String valueOf(char[] data, int offset, int count) </span><br />34. <span style="COLOR: green">static String valueOf(double d) </span><br />35. <span style="COLOR: green">static String valueOf(float f) </span><br />36. <span style="COLOR: green">static String valueOf(int i) </span><br />37. <span style="COLOR: green">static String valueOf(long l) </span><br />38. <span style="COLOR: green">static String valueOf(Object obj) </span><br />以上方法用于将各种不同类型转换成Java字符型。这些都是类方法。</ul>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:29 <a href="http://www.blogjava.net/iKingQu/articles/80347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Character类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80346.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80346.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80346.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80346.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80346.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80346.html</trackback:ping><description><![CDATA[
		<strong>Character：字符类型<br /><br /></strong>
		<span style="COLOR: blue">１、属性。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">static int MIN_RADIX </span>：返回最小基数。<br /><span style="COLOR: green">static int MAX_RADIX</span> ：返回最大基数。<br /><span style="COLOR: green">static char MAX_VALUE</span> ：字符类型的最大值。<br /><span style="COLOR: green">static char MIN_VALUE</span> ：字符类型的最小值。<br /><span style="COLOR: green">static Class TYPE </span>：返回当前类型。</ul>
		<br />
		<span style="COLOR: blue">２、构造函数。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">Character(char value)</span>：以char参数构造一个Character对象。</ul>
		<br />
		<span style="COLOR: blue">３、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<ul>
				<br />1. <span style="COLOR: green">char charValue() </span>：返回字符对象的值。<br />2. <span style="COLOR: green">int compareTo(Character anotherCharacter)</span> ：当前Character对象与anotherCharacter比较。相等关系返回０；小于关系返回负数；大于关系返回正数。<br />3. <span style="COLOR: green">int compareTo(Object o) </span>：当前对象与另一个对象进行比较。如果o是Character对象，则与2功能一样；否则，抛出ClassCastException异常。<br />4. <span style="COLOR: green">static int digit(char ch, int radix) </span>：根据基数返回当前字符的值的十进制。如果不满足Character.MIN_RADIX &lt;= radix &lt;= Character.MAX_RADIX，或者，ch不是radix基数中的有效值，返回"-1"；如果ch是“大写”的A到Z之间，则返回ch - 'A' + 10 的值；如果是“小写”a到z之间，返回ch - 'a' + 10 的值。</ul>
		<br />
		<pre>System.out.println("Character.MIN_RADIX: " + Character.MIN_RADIX );<br />System.out.println("Character.MAX_RADIX: " + Character.MAX_RADIX );<br />System.out.println("Character.digit('2',2): " + Character.digit('2',2) );<br />System.out.println("Character.digit('7',10): " + Character.digit('7',10) );<br />System.out.println("Character.digit('F',16): " + Character.digit('F',16) );<br />结果为：<br />Character.MIN_RADIX: 2<br />Character.MAX_RADIX: 36<br />Character.digit('2',2): -1<br />Character.digit('7',10): 7<br />Character.digit('F',16): 15</pre>
		<br />
		<ul>5. <span style="COLOR: green">boolean equals(Object obj) </span>：与obj对象比较。当且仅当obj不为“null”并且和当前Character对象一致时返回“true”。<br />6. <span style="COLOR: green">static char forDigit(int digit, int radix)</span> ：根据特定基数判断当前数值表示的字符。4的逆运算，非法数值时返回“'\u0000'”。</ul>
		<br />
		<pre>System.out.println("Character.MIN_RADIX: " + Character.MIN_RADIX );<br />System.out.println("Character.MAX_RADIX: " + Character.MAX_RADIX );<br />System.out.println("Character.forDigit(2,2): " + Character.forDigit(2,2) );<br />System.out.println("Character.forDigit(7,10): " + Character.forDigit(7,10) );<br />System.out.println("Character.forDigit(15,16): " + Character.forDigit(15,16) );<br />结果为：<br />Character.MIN_RADIX: 2<br />Character.MAX_RADIX: 36<br />Character.forDigit(2,2): <br />Character.forDigit(7,10): 7<br />Character.forDigit(15,16): f<br /></pre>
		<br />
		<ul>
				<br />7. <span style="COLOR: green">static int getNumericValue(char ch) </span>：返回字符ch的数值。<br />8. <span style="COLOR: green">static int getType(char ch)</span> ：返回字符所属类型。具体有哪些种类请查看Java文档资料。<br />9. <span style="COLOR: green">int hashCode()</span> ：返回当前字符的哈希表码。<br />10. <span style="COLOR: green">static boolean isDefined(char ch)</span> ：判断字符ch在Unicode字符集是否用明确定义。<br />11. <span style="COLOR: green">static boolean isDigit(char ch) </span>：判断字符ch是否为数字。<br />12. <span style="COLOR: green">static boolean isIdentifierIgnorable(char ch) </span>：判断字符ch是否为Unicode字符集中可忽略的字符。<br />13. <span style="COLOR: green">static boolean isISOControl(char ch) </span>：判断字符ch是否为ISO标准中的控制字符。<br />14.<span style="COLOR: green">static boolean isJavaIdentifierPart(char ch) </span>：判断字符ch是否为Java中的部分标识符。<br />15. <span style="COLOR: green">static boolean isJavaIdentifierStart(char ch)</span> ：判断字符ch是否为Java中的第一个标识符。<br />16. <span style="COLOR: green">static boolean isLetter(char ch)</span> ：判断字符ch是否为字母。<br />17. <span style="COLOR: green">static boolean isLetterOrDigit(char ch) </span>：判断字符ch是否为字母或数字。<br />18. <span style="COLOR: green">static boolean isLowerCase(char ch) </span>：判断字符ch是否为小写字母。<br />19. <span style="COLOR: green">static boolean isMirrored(char c)</span> ：根据Unicode表判断字符c是否存在与之方向相反的字符。例如：“［”存在与之方向相反的“］”，结果为：true。<br />20. <span style="COLOR: green">static boolean isSpaceChar(char ch)</span> ：判断字符ch是否为Unicode中的空格。<br />21. <span style="COLOR: green">static boolean isUpperCase(char ch)</span> ：判断字符ch是否为大写字母。<br />22. <span style="COLOR: green">static boolean isWhitespace(char ch)</span> ：判断字符ch是否为Java定义中的空字符。<br /><pre>其中包括： <br />	char c1 = '\u0009';//水平列表符<br />	char c2 = '\u000A';//换行<br />	char c3 = '\u000B';//垂直列表符<br />	char c4 = '\u000C';//换页<br />	char c5 = '\u000D';//回车<br />	char c6 = '\u001C';//文件分隔符<br />	char c7 = '\u001D';//组分隔符<br />	char c8 = '\u001E';//记录分隔符<br />	char c9 = '\u001F';//单元分隔符</pre><br />23. <span style="COLOR: green">static char toLowerCase(char ch) </span>：转换ch是否为小写。<br />24. <span style="COLOR: green">String toString()</span> ：将当前Character对象转换成字符串。<br />25. <span style="COLOR: green">static String toString(char c) </span>：此为类方法，将c转换成字符串。<br />26. <span style="COLOR: green">static char toUpperCase(char ch)</span> ：转换ch是否为大写。</ul>
		<br />
		<pre>System.out.println("Character.toUpperCase('q'): " + Character.toUpperCase('q') );<br />System.out.println("Character.toLowerCaseCase('B'): " + Character.toLowerCase('B') );<br />结果为：<br />Character.toUpperCase('q'): Q<br />Character.toLowerCaseCase('B'): b</pre>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:28 <a href="http://www.blogjava.net/iKingQu/articles/80346.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Double类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80345.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80345.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80345.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80345.html</trackback:ping><description><![CDATA[
		<strong>Double：双精度类型<br /><br /></strong>
		<span style="COLOR: blue">１、属性。</span>
		<br />
		<br />
		<ul>
				<br />1. <span style="COLOR: green">static Double MAX_VALUE</span> ： 返回最大双精度数，在不同硬件平台中由Double.longBitsToDouble(0x7fefffffffffffffL)计算得出。<br />2. <span style="COLOR: green">static Double MIN_VALUE</span> ： 返回最小双精度数，在不同硬件平台中由Double.longBitsToDouble(0x1L)计算得出。 <br />3. <span style="COLOR: green">static Double NaN </span>： 表示非数值类型的双精度数，在不同硬件平台中由Double.longBitsToDouble(0x7ff8000000000000L)计算得出。 <br />4. <span style="COLOR: green">static Double NEGATIVE_INFINITY</span>：返回负无穷双精度数，在不同硬件平台中由Double.longBitsToDouble(0xfff0000000000000L)计算得出。<br />5. <span style="COLOR: green">static Double POSITIVE_INFINITY </span>：返回正无穷双精度数，在不同硬件平台中由Double.longBitsToDouble(0x7ff0000000000000L)计算得出。<br />6. <span style="COLOR: green">static Class TYPE</span> ：返回当前类型。</ul>
		<br />
		<span style="COLOR: blue">２、构造函数。</span>
		<br />
		<br />
		<ul>
				<span style="COLOR: green">Double(double value)</span> ：以double类型为参数创建Double对象。<br /><span style="COLOR: green">Double(String s)</span> ：以String类型为参数创建String对象。</ul>
		<br />
		<span style="COLOR: blue">３、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>
				<br />1. <span style="COLOR: green">byte byteValue()</span> ：返回以字节表示的双精度数。<br />2. <span style="COLOR: green">static int compare(double d1, double d2) </span>：此为类方法，比较d1和d2。相当于new Double(d1).compareTo(new Double(d2))。如果d1与d2相等，返回０；小于关系，返回负数；大于关系，返回正数。<br />3. <span style="COLOR: green">int compareTo(Double anotherDouble)</span> ：此为对象方法，当前对象与anotherDouble比较。与2的比较规则相同。<br />4. <span style="COLOR: green">int compareTo(Object o)</span> ：当前对象与o进行比较，如果o属于Double类，那么，相当于3；如果是其他类，则抛出ClassCastException异常。<br />5. <span style="COLOR: green">static long doubleToLongBits(double value) </span>：把value按照IEEE 754转化成long并输出它的十进制数值。<br />6. <span style="COLOR: green">double doubleValue() </span>：返回该双精度数对象的双精度数值。<br />7. <span style="COLOR: green">boolean equals(Object obj) </span>：比较当前Double对象与obj的内容是否相同。大多数情况是比较两个Double对象的值是否相等，相当于d1.doubleValue() == d2.doubleValue()的值。<br />8. <span style="COLOR: green">float floatValue()</span> ：返回该浮点数对象的浮点数值。<br />9. <span style="COLOR: green">int hashCode() </span>：返回该Double对象的哈希表码。<br />10. <span style="COLOR: green">int intValue()</span> ：返回该Double对象的整数值（整数部分）。<br />11. <span style="COLOR: green">boolean isInfinite()</span> ：判断该Double对象是否是无穷。<br />12. <span style="COLOR: green">static boolean isInfinite(double v) </span>：与11类似，不同的是：此为类方法，判断的是v。<br />13. <span style="COLOR: green">boolean isNaN()</span> ：判断该Double对象是否为非数值。<br />14. <span style="COLOR: green">static boolean isNaN(double v) </span>：功能与13一样，只不过判断v。<br />15. <span style="COLOR: green">long longValue()</span> ：返回该Double对象的长整数值。<br />16. <span style="COLOR: green">static float parseFloat(String s) </span>：将字符串转换成双精度数。<br />17. <span style="COLOR: green">short shortValue()</span> ：返回该Double对象的短整数值。<br />18. <span style="COLOR: green">String toString()</span> ：将该Double对象转换成字符串。<br />19. <span style="COLOR: green">static String toString(Double f)</span> ：功能与18一样，只是转换f。<br />20. <span style="COLOR: green">static Double valueOf(String s)</span> ：将字符串转换成双精度数。</ul>
		<br />
		<span style="COLOR: olive">例子：</span>与Float类的相似。<br /><img src ="http://www.blogjava.net/iKingQu/aggbug/80345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:27 <a href="http://www.blogjava.net/iKingQu/articles/80345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Float类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80344.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80344.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80344.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80344.html</trackback:ping><description><![CDATA[
		<strong>Float：实数类型<br /><br /></strong>
		<span style="COLOR: blue">１、属性。</span>
		<br />
		<ul>
				<br />1. <span style="COLOR: green">static float MAX_VALUE </span>： 返回最大浮点数，在不同硬件平台中由Float.intBitsToFloat(0x7f7fffff)计算得出。<br />2. <span style="COLOR: green">static float MIN_VALUE</span> ： 返回最小浮点数，在不同硬件平台中由Float.intBitsToFloat(0x1)计算得出。 <br />3. <span style="COLOR: green">static float NaN </span>： 表示非数值类型的浮点数，在不同硬件平台中由Float.intBitsToFloat(0x7fc00000)计算得出。 <br />4. <span style="COLOR: green">static float NEGATIVE_INFINITY</span>：返回负无穷浮点数，在不同硬件平台中由Float.intBitsToFloat(0xff800000)计算得出。<br />5. <span style="COLOR: green">static float POSITIVE_INFINITY </span>：返回正无穷浮点数，在不同硬件平台中由Float.intBitsToFloat(0x7f800000)计算得出。<br />6. <span style="COLOR: green">static Class TYPE</span> ：返回当前类型。</ul>
		<br />
		<br />
		<span style="COLOR: blue">２、构造函数。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">Float(double value) </span>：以double类型为参数构造Float对象。<br /><span style="COLOR: green">Float(float value) </span>：以Float类型为参数构造Float对象。<br /><span style="COLOR: green">Float(String s)</span> ：以String类型为参数构造Float对象。</ul>
		<br />
		<br />
		<span style="COLOR: blue">３、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>
				<br />1. <span style="COLOR: green">byte byteValue() </span>：返回以字节表示的浮点数。<br />2. <span style="COLOR: green">static int compare(float f1, float f2)</span> ：此为类方法，比较f1和f2。相当于new Float(f1).compareTo(new Float(f2))。如果f1与f2相等，返回０；小于关系，返回负数；大于关系，返回正数。<br />3. <span style="COLOR: green">int compareTo(Float anotherFloat) </span>：此为对象方法，当前对象与anotherFloat比较。与2的比较规则相同。<br />4. <span style="COLOR: green">int compareTo(Object o)</span> ：当前对象与o进行比较，如果o属于Float类，那么，相当于3；如果是其他类，则抛出ClassCastException异常。<br />5. <span style="COLOR: green">double doubleValue()</span> ：返回浮点数的双精度值。<br />6. <span style="COLOR: green">boolean equals(Object obj)</span> ：比较当前Float对象与obj的内容是否相同。大多数情况是比较两个Float对象的值是否相等，相当于f1.floatValue() == f2.floatValue()的值。与2、3、4不同的是：6返回boolean型。<br />7. <span style="COLOR: green">static int floatToIntBits(float value)</span>：按照IEEE 754转化成float并输出它的十进制数值。<br />8. <span style="COLOR: green">float floatValue()</span> ：返回该浮点数对象的浮点数值。<br />9. <span style="COLOR: green">int hashCode()</span> ：返回该Float对象的哈希表码。<br />10. <span style="COLOR: green">int intValue() </span>：返回该Float对象的整数值（整数部分）。<br />11. <span style="COLOR: green">boolean isInfinite()</span> ：判断该Float对象是否是无穷。<br />12. st<span style="COLOR: green">atic boolean isInfinite(float v)</span> ：与11类似，不同的是：此为类方法，判断的是v。<br />13. <span style="COLOR: green">boolean isNaN()</span> ：判断该Float对象是否为非数值。<br />14. <span style="COLOR: green">static boolean isNaN(float v) </span>：功能与13一样，只不过判断v。<br />15. <span style="COLOR: green">long longValue() </span>：返回该Float对象的长整数值。<br />16. <span style="COLOR: green">static float parseFloat(String s) </span>：将字符串转换成浮点数。<br />17. <span style="COLOR: green">short shortValue() </span>：返回该Float对象的短整数值。<br />18. <span style="COLOR: green">String toString()</span> ：将该Float对象转换成字符串。<br />19. <span style="COLOR: green">static String toString(float f) </span>：功能与18一样，只是转换f。<br />20. <span style="COLOR: green">static Float valueOf(String s)</span> ：将字符串转换成浮点数。</ul>
		<br />
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>Float f = new Float(1237.45);<br />Float fs = new Float("123.45");<br />Float fd = new Float(1234146865679824657987947924623724749.16416925);<br /><br />System.out.println("f.compare(fs): " + f.compareTo(fs) );<br />System.out.println("f.compareTo(fd): " + f.compareTo(fd) );<br />System.out.println("Float.compare(1.23f,3.25f): " + Float.compare(1.23f,3.25f) );<br />结果为：<br />f.compare(fs): 1<br />f.compareTo(fd): -1<br />Float.compare(1.23f,3.25f): -1</pre>
		<br />
		<br />
		<pre>Float f = new Float(1237.45);<br />System.out.println("f.equals(fs): " + f.equals(fs) );<br />结果为：f.equals(fs): false</pre>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:26 <a href="http://www.blogjava.net/iKingQu/articles/80344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Integer类的使用方法 </title><link>http://www.blogjava.net/iKingQu/articles/80342.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80342.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80342.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80342.html</trackback:ping><description><![CDATA[
		<strong>Interger：整数类型<br /><br /></strong>
		<span style="COLOR: blue">１、属性。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">static int MAX_VALUE</span>：返回最大的整型数；<br /><span style="COLOR: green">static int MIN_VALUE</span>：返回最小的整型数；<br /><span style="COLOR: green">static Class TYPE </span>：返回当前类型。</ul>
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>System.out.println("Integer.MAX_VALUE: " + Integer.MAX_VALUE );<br />结果为：Integer.MAX_VALUE: 2147483647<br /></pre>
		<br />
		<br />
		<span style="COLOR: blue">２、构造函数。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">Integer(int value)</span> ：通过一个int的类型构造对象；<br /><span style="COLOR: green">Integer(String s)</span> ：通过一个String的类型构造对象；</ul>
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>Integer i = new Integer("1234");<br />生成了一个值为1234的Integer对象。<br /></pre>
		<br />
		<br />
		<span style="COLOR: blue">３、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>
				<br />1. <span style="COLOR: green">byteValue()：</span>取得用byte类型表示的整数；<br />2. <span style="COLOR: green">int compareTo(Integer anotherInteger) </span>：比较两个整数。相等时返回０；小于时返回负数；大于时返回正数。</ul>
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>
				<br />Integer i = new Integer(1234);<br />System.out.println("i.compareTo: " + i.compareTo(new Integer(123)) );<br />结果为：i.compareTo: 1<br /></pre>
		<br />
		<ul>
				<br />3. <span style="COLOR: green">int compareTo(Object o) </span>：将该整数与其他类进行比较。如果o也为Integer类，进行方法2 的操作；否则，抛出ClassCastException异常。<br />4. <span style="COLOR: green">static Integer decode(String nm)</span> ：将字符串转换为整数。<br />5. <span style="COLOR: green">double doubleValue()</span> ：取得该整数的双精度表示。<br />6. <span style="COLOR: green">boolean equals(Object obj) </span>：比较两个对象。<br />7. <span style="COLOR: green">float floatValue() </span>：取得该整数的浮点数表示。<br />8. <span style="COLOR: green">static Integer getInteger(String nm) </span>：根据指定名确定系统特征值。<br />9. <span style="COLOR: green">static Integer getInteger(String nm, int val)</span> ：上面的重载。<br />10. <span style="COLOR: green">static Integer getInteger(String nm, Integer val) </span>：上面的重载。<br />11. <span style="COLOR: green">int hashCode() </span>：返回该整数类型的哈希表码。<br />12. <span style="COLOR: green">int intValue()</span> ： 返回该整型数所表示的整数。<br />13. <span style="COLOR: green">long longValue() </span>：返回该整型数所表示的长整数。<br />14. <span style="COLOR: green">static int parseInt(String s)</span> ：将字符串转换成整数。s必须是时进制数组成，否则抛出NumberFormatException异常。<br />15. <span style="COLOR: green">static int parseInt(String s, int radix)</span> ：以radix为基数radix返回s的十进制数。<span style="COLOR: red">所谓的基数，就是“几进制”。</span></ul>
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>
				<br />String s1 = new String("1010");<br />System.out.println("Integer.parseInt(String s, int radix): " + Integer.parseInt(s1,2) );<br />结果为：Integer.parseInt(String s, int radix): 10<br /></pre>
		<br />
		<ul>
				<br />16. <span style="COLOR: green">short shortValue() </span>：返回该整型数所表示的短整数。<br />17. <span style="COLOR: green">static String toBinaryString(int i) </span>：将整数转为二进制数的字符串。<br />18. <span style="COLOR: green">static String toHexString(int i)</span> ：将整数转为十六进制数的字符串。<br />19. <span style="COLOR: green">static String toOctalString(int i) </span>：将整数转为八进制数的字符串。<br />20. <span style="COLOR: green">String toString()</span> ：将该整数类型转换为字符串。<br />21. <span style="COLOR: green">static String toString(int i) </span>：将该整数类型转换为字符串。不同的是，此为类方法。<br />22. <span style="COLOR: green">static String toString(int i, int radix) </span>：将整数i以基数radix的形式转换成字符串。</ul>
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>int i1 = 54321;<br />System.out.println("Integer.toString(int i, int radix): " + Integer.toString(i1,16) );<br />结果为：Integer.toString(int i, int radix): d431</pre>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">23. static Integer valueOf(String s)</span> ：将字符串转换成整数类型。<br /><span style="COLOR: green">24. static Integer valueOf(String s, int radix) </span>：将字符串以基数radix的要求转换成整数类型。</ul>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:25 <a href="http://www.blogjava.net/iKingQu/articles/80342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]JAVA 正则表达式实现</title><link>http://www.blogjava.net/iKingQu/articles/75783.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 17 Oct 2006 18:22:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/75783.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/75783.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/75783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/75783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/75783.html</trackback:ping><description><![CDATA[§1黑暗岁月<br />       有一个String，如何查询其中是否有y和f字符？最黑暗的办法就是：<br />程序1：我知道if、for语句和charAt()啊。<br />class Test{<br />  public static void main(String args[]) {<br />         String str="For my money, the important thing "+<br />         "about the meeting was bridge-building";<br />         char x='y';<br />         char y='f';<br />         boolean result=false;<br />         for(int i=0;i&lt;str.length();i++){<br />                char z=str.charAt(i);  //System.out.println(z);<br />                if(x==z||y==z) {<br />                       result=true;<br />                       break;<br />                }<br />                else result=false;<br />         }   <br />         System.out.println(result);<br />       }<br />}<br />       好像很直观，但这种方式难以应付复杂的工作。如查询一段文字中，是否有is？是否有thing或ting等。这是一个讨厌的工作。<br />§2 Java的java.util.regex包<br />       按照面向对象的思路，把希望查询的字符串如is、thing或ting封装成一个对象，以这个对象作为模板去匹配一段文字，就更加自然了。作为模板的那个东西就是下面要讨论的正则表达式。先不考虑那么复杂，看一个例子：<br />程序2：不懂。先看看可以吧？<br />import java.util.regex.*;<br />class Regex1{<br />  public static void main(String args[]) {<br />         String str="For my money, the important thing "+<br />         "about the meeting was bridge-building";<br />         String regEx="a|f";   //表示a或f <br />         Pattern p=Pattern.compile(regEx);<br />         Matcher m=p.matcher(str);<br />         boolean result=m.find();<br />         System.out.println(result);<br />       }<br />}<br />       如果str匹配regEx，那么result为true，否则为flase。如果想在查找时忽略大小写，则可以写成：<br />Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);<br />       虽然暂时不知道Pattern（模板、模式）和Matcher（匹配器）的细节，程序的感觉就比较爽，如果先查询is、后来又要查询thing或ting，我们只需要修改一下模板Pattern，而不是考虑if语句和for语句，或者通过charAt()。<br />1、写一个特殊的字符串??正则表达式如a|f。<br />2、将正则表达式编译成一个模板：p<br />3、用模板p去匹配字符串str。<br />       思路清楚了，现在看Java是如何处理的（Java程序员直到JDK1.4才能使用这些类。<br />§3 Pattern类与查找<br />       ①public final class java.util.regex.Pattern是正则表达式编译后的表达法。下面的语句将创建一个Pattern对象并赋值给句柄p：Pattern p=Pattern.compile(regEx);<br />       有趣的是，Pattern类是final类，而且它的构造器是private。也许有人告诉你一些设计模式的东西，或者你自己查有关资料。这里的结论是：Pattern类不能被继承，我们不能通过new创建Pattern类的对象。<br />       因此在Pattern类中，提供了2个重载的静态方法，其返回值是Pattern对象（的引用）。如：<br />    public static Pattern compile(String regex) {<br />        return new Pattern(regex, 0);<br />    }<br />       当然，我们可以声明Pattern类的句柄，如Pattern p=null；<br />       ②p.matcher(str)表示以用模板p去生成一个字符串str的匹配器，它的返回值是一个Matcher类的引用，为什么要这个东西呢？按照自然的想法，返回一个boolean值不行吗？<br />       我们可以简单的使用如下方法：<br />       boolean result=Pattern.compile(regEx).matcher(str).find();<br />       呵呵，其实是三个语句合并的无句柄方式。无句柄常常不是好方式。后面再学习Matcher类吧。先看看regEx??这个怪咚咚。<br />§4 正则表达式之限定符<br />       正则表达式（Regular Expression）是一种生成字符串的字符串。晕吧。比如说，String regEx="me+";这里字符串me+能够生成的字符串是：me、mee、meee、meeeeeeeeee等等，一个正则表达式可能生成无穷的字符串，所以我们不可能（有必要吗？）输出正则表达式产生的所有东西。<br />反过来考虑，对于字符串：me、mee、meee、meeeeeeeeee等等，我们能否有一种语言去描述它们呢？显然，正则表达式语言是这种语言，它是一些字符串的模式??简洁而深刻的描述。<br />我们使用正则表达式，用于字符串查找、匹配、指定字符串替换、字符串分割等等目的。<br /> <br />       生成字符串的字符串??正则表达式，真有些复杂，因为我们希望由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）描述任意的字符串，而且要准确。<br />       先搞几个正则表达式例子：<br />       程序3：我们总用这个程序测试正则表达式。<br />       import java.util.regex.*;<br />class Regex1{<br />  public static void main(String args[]) {<br />         String str="For my money, the important thing "；<br />         String regEx="ab*"; <br />         boolean result=Pattern.compile(regEx).matcher(str).find();<br />         System.out.println(result);<br />       }<br />}//ture<br />①"ab*"??能匹配a、ab、abb、abbb……。所以，*表示前面字符可以有零次或多次。如果仅仅考虑查找，直接用"a"也一样。但想想替换的情况。 问题regEx="abb*"结果如何？<br />②"ab+"??能匹配ab、abb、abbb……。等价于"abb*"。问题regEx="or+"结果如何？<br />③"or?"??能匹配o和or。? 表示前面字符可以有零次或一次。<br />       这些限定符*、+、?方便地表示了其前面字符(子串)出现的次数（我们用{}来描述）：<br />x*    零次或多次 ≡{0,}<br />x+    一次或多次 ≡{1,}<br />x?    零次或一次 ≡{0,1}<br />x{n}    n次（n&gt;0）<br />x{n,m}    最少n次至最多m次（0&lt;n&lt;m）<br />x{n,}    最少n次,<br />       <br />现在我们知道了连续字符串的查找、匹配。下面的是一些练习题：<br />①查找粗体字符串（不要求精确或要求精确匹配），写出其正则表达式：<br />str    regEX(不要求精确)    regEX(要求精确)    试一试<br />abcffd    b或bcff或bcf*或bc*或bc+    bcff或bcf{2}    bc{3}<br />gooooogle    o{1,}、o+    o{5}     <br />banana    (an)+    (an){2}a、a(na) {2}     <br />                <br />                <br />                <br />②正则表达式匹配字符串，输出是什么？<br />§5替换（删除）、Matcher类<br />现在我们可能厌烦了true/false，我们看看替换。如把book，google替换成bak（这个文件后缀名，在EditPlus中还行）、look或goooogle。<br />       程序4：字符串的替换。<br />       import java.util.regex.*;<br />class Regex1{<br />       public static void main(String args[]) {<br />              String regEx="a+";//表示一个或多个a<br />              String str="abbbaaa an banana hhaana";<br />              Pattern p=Pattern.compile(regEx);<br />              Matcher m=p.matcher(str);<br />              String s=m.replaceAll("⊙⊙"); // ("") 删除<br />              System.out.println(s);<br />       }<br />}        <br />       这个程序与前面的程序的区别，在于使用了m.replaceAll(String)方法。看来Matcher类还有点用处。<br />①    public final class Matcher是一个匹配器。可以把他看成一个人，一手拿着模子（Pattern类的对象），一手拿着一个字符序列（CharSequence），通过解释该模子而对字符序列进行匹配操作（match operations）。常常我们这样编程：“喂，模子p，你和字符串str一起创建一个匹配器对象”。即Matcher m=p.matcher(str);<br />②    m可以进行一些操作，如public String replaceAll(String replacement)，它以replacement替换所有匹配的字符串。<br />§6正则表达式之特殊字符<br />我们熟悉这样一个字符串"\n" 如：System.out.print(s+"\nbbb");这是Java中常用的转移字符之一。其实转移字符就是一种正则表达式，它使用了特殊字符 \ 。<br /> <br />下面是正则表达式中常用的特殊字符：<br />匹配次数符号    *    +    ？    {n}、{n,}、{n,m}<br />“或”符号    |     程序2已经使用过了<br />句点符号    .     句点符号匹配所有字符（一个），包括空格、Tab字符甚至换行符。<br />方括号    [ ]   仅仅匹配方括号其中的字符)<br />圆括号    ()    分组，圆括号中的字符视为一个整体。<br />连字符    -     表示一个范围。 <br />“否”符号    ^    表示不希望被匹配的字符（排除）<br />我们一下子学不了太多的东西，这不是正则表达式的全部内容和用法。但已经够我们忙活的了。我们用程序4 验证。(⊙⊙表示替换的字符)<br />①    regEx为下列字符串时，能够表示什么？<br />regEx    匹配    测试用str<br />(a|b){2}    aa、ab、bb、ba    aabbfooaabfooabfoob<br />a[abc]b    aab、abb、acb    3dfacb5ooyfo6abbfooaab<br />.     all string    3dfac<br />a.     aa、ax……等等    3dfacgg<br />d[^j]a    daa、d9a等等，除dja    3dfacggdjad5a<br />[d-g][ac]c    dac、ecc、gac等    3dfacggggccad5c<br />[d-g].{2}c    d⊙⊙c……    3dfacggggccad5c<br />g{1,10}    g、ggg……    3dfacggggccad5c<br />[a|c][^a]         3dfacggggccad5c<br /> <br />②    下列字符串如何用regEx表示？<br />测试用str    匹配    regEx<br />aabbfoaoabfooafobob     a⊙⊙b    a..b<br />aabbfoaaobfooafbob    a⊙b、除aab    a[^a]b、<br />gooooooogle    oooo……变成oo    o{2,20}<br />一本书中的“tan”、“ten”、“tin”和“ton”    t.n、t[aeio]n<br />abcaccbcbaacabccaa    删除ac、ca    (ca)|(ac)<br />abccbcbaabca    再删除ab、ba    结果ccbcca（如何与上面的合并）<br />           <br />           <br />           <br />注：<br />1、String str="一本书中的tan、ten、tin和ton"; <br />输出：     一本书中的⊙⊙、⊙⊙、⊙⊙和⊙⊙<br />2、String str=" abcaccbcbaacabccaa "; 输出：ccbcca<br />       程序5：if、for语句和charAt()，886。<br />import java.util.regex.*;<br />class Regex1{<br />    public static void main(String args[]) {<br />           String str="abcaccbcbaacabccaa";<br />           String regEx="(ac)|(ca)";<br />           Pattern p=Pattern.compile(regEx);<br />           Matcher m=p.matcher(str);<br />           String s=m.replaceAll("");//⊙⊙<br />           regEx="(ab)|(ba)";<br />           p=Pattern.compile(regEx);<br />           s=p.matcher(s).replaceAll("");<br /> <br />           System.out.print(s+"\n");<br />    }<br />}<br /> <br />§7 开始<br />好像我们知道了一些正则表达式与 Java的知识，事实上，我们才刚刚开始。这里列出我们知道的东西，也说一点我们不知道的东西。<br />①              Java在JDK1.4引入了（java.util.regex包）以支持正则表达式，包中有两个类，分别是Pattern和Matcher。它们都有很多的方法，我们还不知道。String类中的split、matches方法等等也使用到了正则表达式。StringTokenizer是否没有用处了？<br />②             正则表达式是一门语言。有许多正则表达式语法、选项和特殊字符，在Pattern.java源文件中大家可以查看。可能比想象中的要复杂。系统学习正则表达式的历史、语法、全部特殊字符（相当于Java中的关键字的地位），组合逻辑是下一步的事情。<br />③             正则表达式是文本处理的重要技术，在Perl、PHP、Python、JavaScript、Java、C＃中被广泛支持。被列为“保证你现在和未来不失业的十种关键技术”，呵呵，信不信由你<br /><img src ="http://www.blogjava.net/iKingQu/aggbug/75783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-10-18 02:22 <a href="http://www.blogjava.net/iKingQu/articles/75783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]在JAVA中使用正则表达式</title><link>http://www.blogjava.net/iKingQu/articles/75782.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 17 Oct 2006 18:20:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/75782.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/75782.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/75782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/75782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/75782.html</trackback:ping><description><![CDATA[jdk1.4中加入了java.util.regex包提供对正则表达式的支持。而且Java.lang.String类中的replaceAll和split函数也是调用的正则表达式来实现的。<br /><br /><script id="ad_text_pcjob" src="/script/ad_text_pcjob.js" defer=""></script>
　正则表达式对字符串的操作主要包括：字符串匹配，指定字符串替换，指定字符串查找和字符串分割。下面就用一个例子来说明这些操作是如何实现的：<br /><br />　　&lt; %@ page import="java.util.regex.*"%&gt;<br /><br />　　&lt; %<br /><br />　　Pattern p=null; //正则表达式<br /><br />　　Matcher m=null; //操作的字符串<br /><br />　　boolean b;<br /><br />　　String s=null;<br /><br />　　StringBuffer sb=null;<br /><br />　　int i=0;<br /><br />　　//字符串匹配，这是不符合的<br /><br />　　p = Pattern.compile("a*b");<br /><br />　　m = p.matcher("baaaaab");<br /><br />　　b = m.matches();<br /><br />　　out.println(b+"&lt; br&gt;");<br /><br />　　//字符串匹配，这是符合的 <br /><br clear="all" />　　p = Pattern.compile("a*b");<br /><br />　　m = p.matcher("aaaaab");<br /><br />　　b = m.matches();<br /><br />　　out.println(b+"&lt; br&gt;");<br /><br />　　//字符串替换<br /><br />　　p = Pattern.compile("ab");<br /><br />　　m = p.matcher("aaaaab");<br /><br />　　s = m.replaceAll("d"); <br /><br />　　out.println(s+"&lt; br&gt;");<br /><br />　　p = Pattern.compile("a*b");<br /><br />　　m = p.matcher("aaaaab");<br /><br />　　s = m.replaceAll("d"); <br /><br />　　out.println(s+"&lt; br&gt;");<br /><br />　　p = Pattern.compile("a*b"); <br /><br clear="all" />　　m = p.matcher("caaaaab");<br /><br />　　s = m.replaceAll("d"); <br /><br />　　out.println(s+"&lt; br&gt;");<br /><br />　　//字符串查找<br /><br />　　p = Pattern.compile("cat");<br /><br />　　m = p.matcher("one cat two cats in the yard");<br /><br />　　sb = new StringBuffer();<br /><br />　　while (m.find()) {<br /><br />m.appendReplacement(sb, "dog");<br /><br />i++;<br /><br />　　}<br /><br />　　m.appendTail(sb);<br /><br />　　out.println(sb.toString()+"&lt; br&gt;");<br /><br />　　out.println(i+"&lt; br&gt;");<br /><br />　　i=0; <br clear="all" /><br />　　p = Pattern.compile("cat");<br /><br />　　m = p.matcher("one cat two ca tsi nthe yard");<br /><br />　　sb = new StringBuffer();<br /><br />　　while (m.find()) {<br /><br />m.appendReplacement(sb, "dog");<br /><br />i++;<br /><br />　　}<br /><br />　　m.appendTail(sb);<br /><br />　　 out.println(sb.toString()+"&lt; br&gt;");<br /><br />　　out.println(i+"&lt; br&gt;");<br /><br /><br /><br /><br /><br />　　p = Pattern.compile("cat");<br /><br />　　m = p.matcher("one cat two cats in the yard");<br /><br />　　p=m.pattern(); <br clear="all" /><br />　　m = p.matcher("bacatab");<br /><br />　　b = m.matches();<br /><br />　　out.println(b+"&lt; br&gt;"); <br /><br />　　s = m.replaceAll("dog"); <br /><br />　　out.println(s+"&lt; br&gt;"); <br /><br /><br /><br />　　 i=0;<br /><br />　　p = Pattern.compile("(fds){2,}");<br /><br />　　 m = p.matcher("dsa da fdsfds aaafdsafds aaf");<br /><br />　　 sb = new StringBuffer();<br /><br />　　while (m.find()) {<br /><br />m.appendReplacement(sb, "dog");<br /><br />i++;<br /><br />　　}<br /><br />　　m.appendTail(sb);<br /><br />　　out.println(sb.toString()+"&lt; br&gt;"); <br clear="all" /><br />　　out.println(i+"&lt; br&gt;");<br /><br /><br /><br />　　 p = Pattern.compile("cat");<br /><br />　　 m = p.matcher("one cat two cats in the yard");<br /><br />　　 sb = new StringBuffer();<br /><br />　　while (m.find()) {<br /><br />m.appendReplacement(sb, "<font color="#00ed00">cat</font>");<br /><br />　　 }<br /><br />　　m.appendTail(sb);<br /><br />　　out.println(sb.toString()+"&lt; br&gt;");<br /><br />　　String aa=sb.toString();<br /><br />　　out.println(aa+"&lt; br&gt;");<br /><br />　　//字符串分割<br /><br />　　 p = Pattern.compile("a+");<br /><br />　　 String[] a=p.split("caaaaaat");<br /><br />　　 for(i=0;i<br />　　 {<br /><br />　　 out.println(a[i]+"&lt; br&gt;");<br /><br />　　 }<br /><br />　　 p = Pattern.compile("a+");<br /><br />　　 a=p.split("c aa aaaa t",0);<br /><br />　　 for(i=0;i<a.length;i++)><br /><br />　　 {<br /><br />　　 out.println(a[i]+"&lt; br&gt;");<br /><br />　　 }<br /><br />　　 p = Pattern.compile(" +");<br /><br />　　 a=p.split("c aa aaaa t",0);<br /><br />　　 for(i=0;i<a.length;i++)><br /><br />　　 {<br /><br />　　 out.println(a[i]+"&lt; br&gt;");<br /><br />　　}<br /><br />　　p = Pattern.compile("\\+");<br /><br />　　 a=p.split("dsafasdfdsafsda+dsagfasdfa+sdafds");<br /><br />　　out.println(a.length+"&lt; br&gt;");<br /><br />　　for(i=0;i<a.length;i++)><br /><br />　　{<br /><br />　　out.println(a[i]+"&lt; br&gt;");<br /><br />　　}<br /><br />　　%&gt;（www.csdn.net） <br clear="all" /><a.length;i++)><br clear="all" /></a.length;i++)></a.length;i++)></a.length;i++)></a.length;i++)><img src ="http://www.blogjava.net/iKingQu/aggbug/75782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-10-18 02:20 <a href="http://www.blogjava.net/iKingQu/articles/75782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Java正则表达式详解</title><link>http://www.blogjava.net/iKingQu/articles/75781.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 17 Oct 2006 18:14:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/75781.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/75781.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/75781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/75781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/75781.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">如果你曾经用过Perl或任何其他内建正则表达式支持的语言，你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语，那么“正则表达式”（Regular Expression）就是一个字符构成的串，它定义了一个用来搜索匹配字符串的模式。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">许多语言，包括Perl、PHP、Python、JavaScript和JScript，都支持用正则表达式处理文本，一些文本编辑器用正则表达式实现高级“搜索-替换”功能。那么Java又怎样呢？本文写作时，一个包含了用正则表达式进行文本处理的Java规范需求（Specification Request）已经得到认可，你可以期待在JDK的下一版本中看到它。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">然而，如果现在就需要使用正则表达式，又该怎么办呢？你可以从Apache.org下载源代码开放的Jakarta-ORO库。本文接下来的内容先简要地介绍正则表达式的入门知识，然后以Jakarta-ORO API为例介绍如何使用正则表达式。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>
												<font size="4">一、正则表达式基础知识</font>
										</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串，搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感，单词“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是说： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_a.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>1.1 句点符号</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">假设你在玩英文拼字游戏，想要找出三个字母的单词，而且这些单词必须以“t”字母开头，以“n”字母结束。另外，假设有一本英文字典，你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式，你可以使用一个通配符——句点符号“.”。这样，完整的表达式就是“t.n”，它匹配“tan”、“ten”、“tin”和“ton”，还匹配“t#n”、“tpn”甚至“t n”，还有其他许多无意义的组合。这是因为句点符号匹配所有字符，包括空格、Tab字符甚至换行符： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_b.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>1.2 方括号符号</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">为了解决句点符号匹配范围过于广泛这一问题，你可以在方括号（“[]”）里面指定看来有意义的字符。此时，只有方括号里面指定的字符才参与匹配。也就是说，正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配，因为在方括号之内你只能匹配单个字符： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_c.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>1.3 “或”符号</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">如果除了上面匹配的所有单词之外，你还想要匹配“toon”，那么，你可以使用“|”操作符。“|”操作符的基本意义就是“或”运算。要匹配“toon”，使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号，因为方括号只允许匹配单个字符；这里必须使用圆括号“()”。圆括号还可以用来分组，具体请参见后面介绍。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_d.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>1.4 表示匹配次数的符号</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">表一显示了表示匹配次数的符号，这些符号用来确定紧靠该符号左边的符号出现的次数： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4n.jpg" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中，连字符（“-”）有着特殊的意义，它表示一个范围，比如从0到9。因此，匹配社会安全号码中的连字符号时，它的前面要加上一个转义字符“\”。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4a.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图一：匹配所有123-12-1234形式的社会安全号码</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">假设进行搜索的时候，你希望连字符号可以出现，也可以不出现——即，999-99-9999和999999999都属于正确的格式。这时，你可以在连字符号后面加上“？”数量限定符号，如图二所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4b.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图二：匹配所有123-12-1234和123121234形式的社会安全号码</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{4}”，再加上字母部分“[A-Z]{2}”。图三显示了完整的正则表达式。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4c.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图三：匹配典型的美国汽车牌照号码，如8836KV</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">1.5 “否”符号 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">“^”符号称为“否”符号。如果用在方括号内，“^”表示不想要匹配的字符。例如，图四的正则表达式匹配所有单词，但以“X”字母开头的单词除外。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4d.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图四：匹配所有单词，但“X”开头的除外</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">1.6 圆括号和空白符号 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">假设要从格式为“June 26, 1951”的生日日期中提取出月份部分，用来匹配该日期的正则表达式可以如图五所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4e.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图五：匹配所有Moth DD,YYYY格式的日期</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">新出现的“\s”符号是空白符号，匹配所有的空白字符，包括Tab字符。如果字符串正确匹配，接下来如何提取出月份部分呢？只需在月份周围加上一个圆括号创建一个组，然后用ORO API（本文后面详细讨论）提取出它的值。修改后的正则表达式如图六所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4f.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图六：匹配所有Month DD,YYYY格式的日期，定义月份值为第一个组</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>1.7 其它符号</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">为简便起见，你可以使用一些为常见正则表达式创建的快捷符号。如表二所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">表二：常用符号 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4o.jpg" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">例如，在前面社会安全号码的例子中，所有出现“[0-9]”的地方我们都可以使用“\d”。修改后的正则表达式如图七所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4g.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图七：匹配所有123-12-1234格式的社会安全号码</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>
												<font size="4">二、Jakarta-ORO库</font>
										</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">有许多源代码开放的正则表达式库可供Java程序员使用，而且它们中的许多支持Perl 5兼容的正则表达式语法。我在这里选用的是Jakarta-ORO正则表达式库，它是最全面的正则表达式API之一，而且它与Perl 5正则表达式完全兼容。另外，它也是优化得最好的API之一。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">Jakarta-ORO库以前叫做OROMatcher，Daniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下载它。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象，然后介绍如何使用Jakarta-ORO API。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>▲ PatternCompiler对象</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">首先，创建一个Perl5Compiler类的实例，并把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实现，允许你把正则表达式编译成用来匹配的Pattern对象。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_e.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>▲ Pattern对象</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">要把正则表达式编译成Pattern对象，调用compiler对象的compile()方法，并在调用参数中指定正则表达式。例如，你可以按照下面这种方式编译正则表达式“t[aeio]n”： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_f.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">默认情况下，编译器创建一个大小写敏感的模式（pattern）。因此，上面代码编译得到的模式只匹配“tin”、“tan”、 “ten”和“ton”，但不匹配“Tin”和“taN”。要创建一个大小写不敏感的模式，你应该在调用编译器的时候指定一个额外的参数： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_g.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">创建好Pattern对象之后，你就可以通过PatternMatcher类用该Pattern对象进行模式匹配。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>▲ PatternMatcher对象</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">PatternMatcher对象根据Pattern对象和字符串进行匹配检查。你要实例化一个Perl5Matcher类并把结果赋值给PatternMatcher接口。Perl5Matcher类是PatternMatcher接口的一个实现，它根据Perl 5正则表达式语法进行模式匹配： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_h.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">使用PatternMatcher对象，你可以用多个方法进行匹配操作，这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean matches(String input, Pattern pattern)：当输入字符串和正则表达式要精确匹配时使用。换句话说，正则表达式必须完整地描述输入字符串。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean matchesPrefix(String input, Pattern pattern)：当正则表达式匹配输入字符串起始部分时使用。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean contains(String input, Pattern pattern)：当正则表达式要匹配输入字符串的一部分时使用（即，它必须是一个子串）。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">另外，在上面三个方法调用中，你还可以用PatternMatcherInput对象作为参数替代String对象；这时，你可以从字符串中最后一次匹配的位置开始继续进行匹配。当字符串可能有多个子串匹配给定的正则表达式时，用PatternMatcherInput对象作为参数就很有用了。用PatternMatcherInput对象作为参数替代String时，上述三个方法的语法如下： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean matches(PatternMatcherInput input, Pattern pattern) </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern) </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean contains(PatternMatcherInput input, Pattern pattern) </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>
												<font size="4">三、应用实例</font>
										</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">下面我们来看看Jakarta-ORO库的一些应用实例。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>3.1 日志文件处理</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">任务：分析一个Web服务器日志文件，确定每一个用户花在网站上的时间。在典型的BEA WebLogic日志文件中，日志记录的格式如下： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_i.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">分析这个日志记录，可以发现，要从这个日志文件提取的内容有两项：IP地址和页面访问时间。你可以用分组符号（圆括号）从日志记录提取出IP地址和时间标记。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">首先我们来看看IP地址。IP地址有4个字节构成，每一个字节的值在0到255之间，各个字节通过一个句点分隔。因此，IP地址中的每一个字节有至少一个、最多三个数字。图八显示了为IP地址编写的正则表达式： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4h.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图八：匹配IP地址</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">IP地址中的句点字符必须进行转义处理（前面加上“\”），因为IP地址中的句点具有它本来的含义，而不是采用正则表达式语法中的特殊含义。句点在正则表达式中的特殊含义本文前面已经介绍。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容：首先搜索起始方括号字符（“[”），提取出所有不超过结束方括号字符（“]”）的内容，向前寻找直至找到结束方括号字符。图九显示了这部分的正则表达式。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4i.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图九：匹配至少一个字符，直至找到“]”</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">现在，把上述两个正则表达式加上分组符号（圆括号）后合并成单个表达式，这样就可以从日志记录提取出IP地址和时间。注意，为了匹配“- -”（但不提取它），正则表达式中间加入了“\s-\s-\s”。完整的正则表达式如图十所示。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4j.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图十：匹配IP地址和时间标记</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">现在正则表达式已经编写完毕，接下来可以编写使用正则表达式库的Java代码了。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">为使用Jakarta-ORO库，首先创建正则表达式字符串和待分析的日志记录字符串： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_j.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">这里使用的正则表达式与图十的正则表达式差不多完全相同，但有一点例外：在Java中，你必须对每一个向前的斜杠（“\”）进行转义处理。图十不是Java的表示形式，所以我们要在每个“\”前面加上一个“\”以免出现编译错误。遗憾的是，转义处理过程很容易出现错误，所以应该小心谨慎。你可以首先输入未经转义处理的正则表达式，然后从左到右依次把每一个“\”替换成“\\”。如果要复检，你可以试着把它输出到屏幕上。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">初始化字符串之后，实例化PatternCompiler对象，用PatternCompiler编译正则表达式创建一个Pattern对象： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_k.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">现在，创建PatternMatcher对象，调用PatternMatcher接口的contain()方法检查匹配情况： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_l.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">接下来，利用PatternMatcher接口返回的MatchResult对象，输出匹配的组。由于logEntry字符串包含匹配的内容，你可以看到类如下面的输出： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_m.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>3.2 HTML处理实例一</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">下面一个任务是分析HTML页面内FONT标记的所有属性。HTML页面内典型的FONT标记如下所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<font face="Arial, Serif" color="red" size="+2">
										</font>
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_n.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">程序将按照如下形式，输出每一个FONT标记的属性： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_o.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">在这种情况下，我建议你使用两个正则表达式。第一个如图十一所示，它从字体标记提取出“"face="Arial, Serif" size="+2" color="red"”。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4k.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图十一：匹配FONT标记的所有属性</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">第二个正则表达式如图十二所示，它把各个属性分割成名字-值对。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4l.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图十二：匹配单个属性，并把它分割成名字-值对</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">分割结果为： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_p.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">现在我们来看看完成这个任务的Java代码。首先创建两个正则表达式字符串，用Perl5Compiler把它们编译成Pattern对象。编译正则表达式的时候，指定Perl5Compiler.CASE_INSENSITIVE_MASK选项，使得匹配操作不区分大小写。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">接下来，创建一个执行匹配操作的Perl5Matcher对象。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_q.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">假设有一个String类型的变量html，它代表了HTML文件中的一行内容。如果html字符串包含FONT标记，匹配器将返回true。此时，你可以用匹配器对象返回的MatchResult对象获得第一个组，它包含了FONT的所有属性： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_r.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">接下来创建一个PatternMatcherInput对象。这个对象允许你从最后一次匹配的位置开始继续进行匹配操作，因此，它很适合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象，以参数形式传入待匹配的字符串。然后，用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象（而不是字符串对象）为参数，反复地调用PatternMatcher对象的contains()方法完成。PatternMatcherInput对象之中的每一次迭代将把它内部的指针向前移动，下一次检测将从前一次匹配位置的后面开始。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">本例的输出结果如下： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_s.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>3.3 HTML处理实例二</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">下面我们来看看另一个处理HTML的例子。这一次，我们假定Web服务器从widgets.acme.com移到了newserver.acme.com。现在你要修改一些页面中的链接： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_t.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">执行这个搜索的正则表达式如图十三所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4m.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图十三：匹配修改前的链接</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">如果能够匹配这个正则表达式，你可以用下面的内容替换图十三的链接： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<a href="http://newserver.acme.com/interface.html#$1">
										</a>
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_u.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">注意#字符的后面加上了$1。Perl正则表达式语法用$1、$2等表示已经匹配且提取出来的组。图十三的表达式把所有作为一个组匹配和提取出来的内容附加到链接的后面。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">现在，返回Java。就象前面我们所做的那样，你必须创建测试字符串，创建把正则表达式编译到Pattern对象所必需的对象，以及创建一个PatternMatcher对象：<br /><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_v.jpg" border="0" /></td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">接下来，用com.oroinc.text.regex包Util类的substitute()静态方法进行替换，输出结果字符串： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_w.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">Util.substitute()方法的语法如下： </td>
						</tr>
				</tbody>
		</table>
		<table height="17" width="620" align="center">
				<tbody>
						<tr>
								<td class="a14" height="13">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_x.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">这个调用的前两个参数是以前创建的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象，它决定了替换操作如何进行。本例使用的是Perl5Substitution对象，它能够进行Perl5风格的替换。第四个参数是想要进行替换操作的字符串，最后一个参数允许指定是否替换模式的所有匹配子串（Util.SUBSTITUTE_ALL），或只替换指定的次数。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>【结束语】</b>在这篇文章中，我为你介绍了正则表达式的强大功能。只要正确运用，正则表达式能够在字符串提取和文本修改中起到很大的作用。另外，我还介绍了如何在Java程序中通过Jakarta-ORO库利用正则表达式。至于最终采用老式的字符串处理方式（使用StringTokenizer，charAt，和substring），还是采用正则表达式，这就有待你自己决定了。</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/iKingQu/aggbug/75781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-10-18 02:14 <a href="http://www.blogjava.net/iKingQu/articles/75781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]J2EE 全面简介</title><link>http://www.blogjava.net/iKingQu/articles/47168.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sat, 20 May 2006 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/47168.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/47168.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/47168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/47168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/47168.html</trackback:ping><description><![CDATA[
		<blockquote>本文从五个方面对J2EE进行了比较全面的介绍。从J2EE的概念说起，到它的优势，到J2EE典型的四层模型，和它的框架结构，最后是J2EE十三种核心技术的一个简介。本文分门别类的对J2EE中的服务，组件，层次，容器，API都做了比较详细的介绍，相信看完此文，读者会对J2EE有一个更清晰的认识。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="1">
						<span class="atitle">
								<font face="Arial" size="4">J2EE的概念</font>
						</span>
				</a>
		</p>
		<p>目前，Java 2平台有3个版本，它们是适用于小型设备和智能卡的Java 2平台Micro版（Java 2 Platform Micro Edition，J2ME）、适用于桌面系统的Java 2平台标准版（Java 2 Platform Standard Edition，J2SE）、适用于创建服务器应用程序和服务的Java 2平台企业版（Java 2 Platform Enterprise Edition，J2EE）。</p>
		<p>J2EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java 2平台的标准版，J2EE不仅巩固了标准版中的许多优点，例如"编写一次、随处运行"的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等，同时还提供了对 EJB（Enterprise JavaBeans）、Java Servlets API、JSP（Java Server Pages）以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。</p>
		<p>J2EE体系结构提供中间层集成框架用来满足无需太多费用而又需要高可用性、高可靠性以及可扩展性的应用的需求。通过提供统一的开发平台，J2EE降低了开发多层应用的费用和复杂性，同时提供对现有应用程序集成强有力支持，完全支持Enterprise JavaBeans，有良好的向导支持打包和部署应用，添加目录支持，增强了安全机制，提高了性能。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/java/j2ee/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="2">
						<span class="atitle">
								<font face="Arial" size="4">J2EE的优势</font>
						</span>
				</a>
		</p>
		<p>J2EE为搭建具有可伸缩性、灵活性、易维护性的商务系统提供了良好的机制:</p>
		<ol>
				<li>保留现存的IT资产: 由于企业必须适应新的商业需求，利用已有的企业信息系统方面的投资，而不是重新制定全盘方案就变得很重要。这样，一个以渐进的（而不是激进的，全盘否定的）方式建立在已有系统之上的服务器端平台机制是公司所需求的。J2EE架构可以充分利用用户原有的投资，如一些公司使用的BEA Tuxedo、IBM CICS, IBM Encina,、Inprise VisiBroker 以及Netscape Application Server。这之所以成为可能是因为J2EE拥有广泛的业界支持和一些重要的'企业计算'领域供应商的参与。每一个供应商都对现有的客户提供了不用废弃已有投资，进入可移植的J2EE领域的升级途径。由于基于J2EE平台的产品几乎能够在任何操作系统和硬件配置上运行，现有的操作系统和硬件也能被保留使用。 
</li>
				<li>高效的开发: J2EE允许公司把一些通用的、很繁琐的服务端任务交给中间件供应商去完成。这样开发人员可以集中精力在如何创建商业逻辑上，相应地缩短了开发时间。高级中间件供应商提供以下这些复杂的中间件服务: 
<ul><li>状态管理服务 -- 让开发人员写更少的代码，不用关心如何管理状态，这样能够更快地完成程序开发。 
</li><li>持续性服务 -- 让开发人员不用对数据访问逻辑进行编码就能编写应用程序，能生成更轻巧，与数据库无关的应用程序，这种应用程序更易于开发与维护。 
</li><li>分布式共享数据对象CACHE服务 -- 让开发人员编制高性能的系统，极大提高整体部署的伸缩性。 </li></ul></li>
				<li>支持异构环境: J2EE能够开发部署在异构环境中的可移植程序。基于J2EE的应用程序不依赖任何特定操作系统、中间件、硬件。因此设计合理的基于J2EE的程序只需开发一次就可部署到各种平台。这在典型的异构企业计算环境中是十分关键的。J2EE标准也允许客户订购与J2EE兼容的第三方的现成的组件，把他们部署到异构环境中，节省了由自己制订整个方案所需的费用。 
</li>
				<li>可伸缩性: 企业必须要选择一种服务器端平台，这种平台应能提供极佳的可伸缩性去满足那些在他们系统上进行商业运作的大批新客户。基于J2EE平台的应用程序可被部署到各种操作系统上。例如可被部署到高端UNIX与大型机系统，这种系统单机可支持64至256个处理器。（这是NT服务器所望尘莫及的）J2EE领域的供应商提供了更为广泛的负载平衡策略。能消除系统中的瓶颈，允许多台服务器集成部署。这种部署可达数千个处理器，实现可高度伸缩的系统，满足未来商业应用的需要。 
</li>
				<li>稳定的可用性: 一个服务器端平台必须能全天候运转以满足公司客户、合作伙伴的需要。因为INTERNET是全球化的、无处不在的，即使在夜间按计划停机也可能造成严重损失。若是意外停机，那会有灾难性后果。J2EE部署到可靠的操作环境中，他们支持长期的可用性。一些J2EE部署在WINDOWS环境中，客户也可选择健壮性能更好的操作系统如Sun Solaris、IBM OS/390。最健壮的操作系统可达到99.999%的可用性或每年只需5分钟停机时间。这是实时性很强商业系统理想的选择。 </li>
		</ol>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/java/j2ee/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="3">
						<span class="atitle">
								<font face="Arial" size="4">J2EE 的四层模型</font>
						</span>
				</a>
		</p>
		<p>J2EE使用多层的分布式应用模型，应用逻辑按功能划分为组件，各个应用组件根据他们所在的层分布在不同的机器上。事实上，sun设计J2EE的初衷正是为了解决两层模式(client/server)的弊端，在传统模式中，客户端担当了过多的角色而显得臃肿，在这种模式中，第一次部署的时候比较容易，但难于升级或改进，可伸展性也不理想，而且经常基于某种专有的协议�D�D通常是某种数据库协议。它使得重用业务逻辑和界面逻辑非常困难。现在J2EE 的多层企业级应用模型将两层化模型中的不同层面切分成许多层。一个多层化应用能够为不同的每种服务提供一个独立的层，以下是 J2EE 典型的四层结构:</p>
		<ul>
				<li>运行在客户端机器上的客户层组件 
</li>
				<li>运行在J2EE服务器上的Web层组件 
</li>
				<li>运行在J2EE服务器上的业务逻辑层组件 
</li>
				<li>运行在EIS服务器上的企业信息系统(Enterprise information system)层软件 </li>
		</ul>
		<br />
		<img height="293" alt="" src="http://www-128.ibm.com/developerworks/cn/java/j2ee/fig1.gif" width="489" />
		<br />
		<p>
				<b>J2EE应用程序组件</b>
				<br />J2EE应用程序是由组件构成的.J2EE组件是具有独立功能的软件单元，它们通过相关的类和文件组装成J2EE应用程序，并与其他组件交互。J2EE说明书中定义了以下的J2EE组件: </p>
		<ul>
				<li>应用客户端程序和applets是客户层组件. 
</li>
				<li>Java Servlet和JavaServer Pages(JSP)是web层组件. 
</li>
				<li>Enterprise JavaBeans(EJB)是业务层组件. </li>
		</ul>
		<br />
		<p>
				<b>客户层组件</b>
				<br />J2EE应用程序可以是基于web方式的,也可以是基于传统方式的. </p>
		<p>
				<b>web 层组件</b>
				<br />J2EE web层组件可以是JSP 页面或Servlets.按照J2EE规范，静态的HTML页面和Applets不算是web层组件。 </p>
		<p>正如下图所示的客户层那样，web层可能包含某些 JavaBean 对象来处理用户输入，并把输入发送给运行在业务层上的enterprise bean 来进行处理。</p>
		<br />
		<img height="216" alt="" src="http://www-128.ibm.com/developerworks/cn/java/j2ee/fig2.gif" width="504" />
		<br />
		<p>
				<b>业务层组件</b>
				<br />业务层代码的逻辑用来满足银行，零售，金融等特殊商务领域的需要,由运行在业务层上的enterprise bean 进行处理. 下图表明了一个enterprise bean 是如何从客户端程序接收数据，进行处理(如果必要的话), 并发送到EIS 层储存的，这个过程也可以逆向进行。 </p>
		<p>有三种企业级的bean: 会话(session) beans, 实体(entity) beans, 和消息驱动(message-driven) beans. 会话bean 表示与客户端程序的临时交互. 当客户端程序执行完后, 会话bean 和相关数据就会消失. 相反, 实体bean 表示数据库的表中一行永久的记录. 当客户端程序中止或服务器关闭时, 就会有潜在的服务保证实体bean 的数据得以保存.消息驱动 bean 结合了会话bean 和 JMS的消息监听器的特性, 允许一个业务层组件异步接收JMS 消息.</p>
		<br />
