﻿<?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-Mark's Java Blog-随笔分类-Java SE</title><link>http://www.blogjava.net/mark1207/category/27894.html</link><description>MyEclipse, Java EE, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript,SOA</description><language>zh-cn</language><lastBuildDate>Fri, 09 May 2008 07:04:40 GMT</lastBuildDate><pubDate>Fri, 09 May 2008 07:04:40 GMT</pubDate><ttl>60</ttl><item><title>java基本类型计算与运算符测试（一）</title><link>http://www.blogjava.net/mark1207/archive/2008/05/09/199449.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Fri, 09 May 2008 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/05/09/199449.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/199449.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/05/09/199449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/199449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/199449.html</trackback:ping><description><![CDATA[突然有人问起，自己做了些测验，把结果记录下来。<br />
<br />
java的几种数值基本类型：int,short,long,float,double<br />
<br />
测试代码：<br />
<br />
<p>&nbsp;public static void main(String[] args) {<br />
<br />
&nbsp;&nbsp;short x = 100;<br />
&nbsp;&nbsp;long b = 2;<br />
&nbsp;&nbsp;int a = 2;<br />
&nbsp;&nbsp;double y=1.1;<br />
&nbsp;&nbsp;float z=(float) 1.2;<br />
&nbsp;&nbsp;double c=1.1;<br />
&nbsp;&nbsp;float d=(float) 1.2;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;a=x+a;<br />
&nbsp;&nbsp;x+=1.1;<br />
&nbsp;&nbsp;b=b+a;<br />
&nbsp;&nbsp;y=y-1;<br />
&nbsp;&nbsp;z=z-1;<br />
&nbsp;&nbsp;c=c+1;<br />
&nbsp;&nbsp;d=d+1;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;System.out.println(a);<br />
&nbsp;&nbsp;System.out.println(x);<br />
&nbsp;&nbsp;System.out.println(b);<br />
&nbsp;&nbsp;System.out.println(z);<br />
&nbsp;&nbsp;System.out.println(y);<br />
&nbsp;&nbsp;System.out.println(c);<br />
&nbsp;&nbsp;System.out.println(d);</p>
<p>&nbsp;&nbsp;c=c+d;<br />
&nbsp;&nbsp;System.out.println(c);<br />
&nbsp;&nbsp;c=c-d;<br />
&nbsp;&nbsp;System.out.println(c);<br />
&nbsp;&nbsp;d=(float) (d-1.1);<br />
&nbsp;&nbsp;System.out.println(d);<br />
&nbsp;}<br />
<br />
运行结果：<br />
<br />
102<br />
101<br />
104<br />
0.20000005<br />
0.10000000000000009<br />
2.1<br />
2.2<br />
4.3000000476837155<br />
2.0999999999999996<br />
1.1<br />
<br />
测试说明：<br />
<br />
不同类型数据做计算时按照计算中最大范围数据类型返回，例如：a=x+a;(如果负值对象是较小范围的类型就需要强转类型，否则会报错)<br />
double类型做加时运算精度准确，做减运算时有精度偏差，且和float类型相互作加减操作都会出现精度缺失；<br />
+=符号做运算不牵扯类型转换问题，按照负值对象的类型返回。<br />
</p>
<img src ="http://www.blogjava.net/mark1207/aggbug/199449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-05-09 11:44 <a href="http://www.blogjava.net/mark1207/archive/2008/05/09/199449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java程序员的学习目标：破坏源程序？（转，精彩文章，推荐）</title><link>http://www.blogjava.net/mark1207/archive/2008/04/21/194413.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Sun, 20 Apr 2008 16:35:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/04/21/194413.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/194413.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/04/21/194413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/194413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/194413.html</trackback:ping><description><![CDATA[<a href="http://whatis.ctocio.com.cn/searchwhatis/403/5948403.shtml" target="_bank">Java</a>作为一门编程语言，最好的学习方法就是写代码。当你学习一个类以后，你就可以自己写个简单的例子程序来运行一下，看看有什么结果，然后再多调用几个类的方法，看看运行结果，这样非常直观的把类给学会了，而且记忆非常深刻。然后不应该满足把代码调通，你应该想想看如果我不这样写，换个方式，再试试行不行。记得哪个高人说过学习编程就是个破坏的过程，把书上的例子，自己学习Documentation编写的例子在运行通过以后，不断的尝试着用不同的方法实现，不断的尝试破坏代码的结构，看看它会有什么结果。通过这样的方式，你会很彻底的很精通的掌握Java。举个例子，我们都编过<a href="http://whatis.ctocio.com.cn/searchwhatis/62/5948062.shtml" target="_bank">Hello World</a>这个程序。 　　&nbsp;<br />
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3">public <a href="http://whatis.ctocio.com.cn/searchwhatis/213/5947213.shtml" target="_bank">class</a> HelloWorld {
            <p>　　public static void main(String[] args) {</p>
            <p>　　System.out.println("Hello World");</p>
            <p>　　}</p>
            <p>　　}</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args)，能不能不这样写?包括我刚学习Java的时候也有这样的疑问。想知道答案吗?很简单，你把main改个名字运行一下，看看报什么错误，然后根据出错信息进行分析;把main的public取掉，在试试看，报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个String[]数组的，把String[]改掉，改成<a href="http://whatis.ctocio.com.cn/searchwhatis/69/6025569.shtml" target="_bank">int</a>[]，或者String试试看;不知道是否必须写args参数名称的，也可以把args改成别的名字，看看运行结果如何。我当初学习Java的时候就是这样做的，把Hello World程序反复改了七八次，不断运行，分析运行结果，最后就彻底明白为什么main方法是这样定义的了。
<p>　　此外，我对于static，public，private，Exception，try{ }catch {}finally{}等等一开始都不是很懂，都是把参考书上面的例子运行成功，然后就开始破坏它，不断的根据自己心里面的疑问来重新改写程序，看看能不能运行，运行出来是个什么样子，是否可以得到预期的结果。这样虽然比较费时间，不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行，看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。其中特别值得一提的是<a href="http://whatis.ctocio.com.cn/searchwhatis/435/5948435.shtml" target="_bank">JDK</a>有一个非常棒的调试功能-verbose。</p>
<p>　　java &#8211;verbose</p>
<p>　　javac &#8211;verbose 以及其它很多JDK工具都有这个选项</p>
<p>　　-verbose 可以显示在命令执行的过程中，<a href="http://whatis.ctocio.com.cn/searchwhatis/0/5948500.shtml" target="_bank">JVM</a>都依次加载哪里Class，通过这些宝贵的调试信息，可以帮助我们分析出J<a href="http://whatis.ctocio.com.cn/searchwhatis/24/6026524.shtml" target="_bank">VM</a>在执行的过程中都干了些什么。另外，自己在学习过程中，写的很多的这种破坏例程，应该有意识的分门别类的保存下来，在工作中积累的典型例程也应该定期整理，日积月累，自己就有了一个代码库了。遇到类似的问题，到代码库里面 Copy &amp; Paste ，Search &amp; Replace，就好了，极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层，形成一个通用的类库，封装好。那么可复用性就更强了。所以我觉得其实不是特别需要例程的，自己写的破坏例程就是最好的例子，如果你实在对自己写的代码不放心的话，我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip，解开来就可以完整的看到整个JDK基础类库，也就是rt.jar的Java源代码，你可以参考一下<a href="http://whatis.ctocio.com.cn/searchwhatis/347/7786847.shtml" target="_bank">Sun</a>是怎么写Java程序的，规范是什么样子的。我自己在学习Java的类库的时候，当有些地方理解的不是很清楚的时候，或者想更加清晰的理解运作的细节的时候，往往会打开相应的类的源代码，通过看源代码，所有的问题都会一扫而空。</p>
<img src ="http://www.blogjava.net/mark1207/aggbug/194413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-04-21 00:35 <a href="http://www.blogjava.net/mark1207/archive/2008/04/21/194413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java关键字new和newInstance的区别方法(转)</title><link>http://www.blogjava.net/mark1207/archive/2008/04/21/194411.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Sun, 20 Apr 2008 16:19:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/04/21/194411.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/194411.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/04/21/194411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/194411.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/194411.html</trackback:ping><description><![CDATA[在初始化一个类，生成一个实例的时候，newInstance()方法和new关键字除了一个是方法，一个是关键字外，最主要有什么区别?它们的区别在于创建对象的方式不一样，前者是使用类加载机制，后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
<p>　　<a href="http://whatis.ctocio.com.cn/searchwhatis/403/5948403.shtml" target="_bank">Java</a>中工厂模式经常使用newInstance()方法来创建对象，因此从为什么要使用工厂模式上可以找到具体答案。 例如：</p>
<p>　　
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3"><a href="http://whatis.ctocio.com.cn/searchwhatis/213/5947213.shtml" target="_bank">class</a> c = Class.forName(&#8220;Example&#8221;);
            <p>　　factory = (ExampleInterface)c.newInstance();</p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　其中ExampleInterface是Example的接口，可以写成如下形式：</p>
<p>　　
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3">String className = "Example";
            <p>　　class c = Class.forName(className);</p>
            <p>　　factory = (ExampleInterface)c.newInstance();</p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　进一步可以写成如下形式：</p>
<p>　　
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3">String className = readfromXMlConfig;//从xml 配置文件中获得字符串
            <p>　　class c = Class.forName(className);</p>
            <p>　　factory = (ExampleInterface)c.newInstance();</p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　上面代码已经不存在Example的类名称，它的优点是，无论Example类怎么变化，上述代码不变，甚至可以更换Example的兄弟类Example2 , Example3 , Example4&#8230;&#8230;，只要他们继承ExampleInterface就可以。</p>
<p>　　从<a href="http://whatis.ctocio.com.cn/searchwhatis/0/5948500.shtml" target="_bank">JVM</a>的角度看，我们使用关键字new创建一个类的时候，这个类可以没有被加载。但是使用newInstance()方法的时候，就必须保证：1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的，这个静态方法调用了启动类加载器，即加载java API的那个加载器。</p>
<p>　　现在可以看出，newInstance()实际上是把new这个方式分解为两步，即首先调用Class加载方法加载某个类，然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性，提供给了一种降耦的手段。</p>
<p>　　最后用最简单的描述来区分new关键字和newInstance()方法的区别：</p>
<p>　　newInstance: 弱类型。低效率。只能调用无参构造。</p>
<p>　　new: 强类型。相对高效。能调用任何public构造。</p>
<img src ="http://www.blogjava.net/mark1207/aggbug/194411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-04-21 00:19 <a href="http://www.blogjava.net/mark1207/archive/2008/04/21/194411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java语言中的参数传递(转)</title><link>http://www.blogjava.net/mark1207/archive/2008/04/18/194071.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Fri, 18 Apr 2008 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/04/18/194071.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/194071.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/04/18/194071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/194071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/194071.html</trackback:ping><description><![CDATA[在实际的开发过程中，方法调用是一种很常见的操作，在方法调用中，关于参数的处理可能很多进行实际开发的程序员都不一定理解的很清楚，下面系统的介绍一下Java语言中参数传递的规则，以及和参数传递相关的一些问题。
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>和其它程序设计语言类似，Java语言的参数传递也分为两种：</div>
<div style="margin-left: 39pt; text-indent: -18pt"><span>1、&nbsp;</span>按值传递(by value)</div>
<div style="margin-left: 39pt">适用范围：8种基本数据类型、String对象</div>
<div style="margin-left: 39pt">特点：在内存中复制一份数据，把复制后的数据传递到方法内部</div>
<div style="margin-left: 39pt">作用：在方法内部改变参数的值，外部数据不会跟着发生改变</div>
<div style="margin-left: 39pt; text-indent: -18pt"><span>2、&nbsp;</span>按址传递(by address)</div>
<div style="margin-left: 39pt">适用范围：数组、除String以外的其他所有类型的对象</div>
<div style="margin-left: 39pt">特点：将对象的地址传递到方法内部</div>
<div style="margin-left: 39pt">作用：在方法内部修改对象的内容，外部数据也会跟着发生改变</div>
<div style="margin-left: 17.95pt">基础示例代码：</div>
<div style="margin-left: 21pt"><span>&nbsp;&nbsp;&nbsp; public class Test1{</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp; public static void t1(int n){</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = 10;</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp; public static void t2(String s){</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;s = "123";</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp; public static void t3(int[] array){</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array[0] = 2;</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp; public static void main(String[] args){</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int m = 5;</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t1(m);</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(m);</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s1 = "abc";</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t2(s1);</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s1);</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] arr = {1,2,3,4};</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t3(arr);</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(arr[0]);</span></div>
<div style="margin-left: 52.5pt"><span>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; </span></div>
<div style="margin-left: 21pt"><span>&nbsp;&nbsp; }</span></div>
<div style="margin-left: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>按照上面的参数传递规则，该代码的输出结果应该是：5&nbsp;abc&nbsp;2。因为int类型是按值传递，所以把参数m传递到方法t1时，相当于又复制了一份m的值，在方法t 1内部修改的是复制后的值，所以m的值不变，s1的输出和m类似。而arr是数组，属于按址传递，也就是把arr的地址传递到了方法t3内部，在方法t3内部修改数组中的值时，原来的内容也发生改变。</div>
<div style="margin-left: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>以上特性是Java语言中的规定，在语法上无法指定参数传递是按值传递还是按址传递，但是可以通过下面的变换实现：</div>
<div style="margin-left: 60pt; text-indent: -18pt"><span>1、&nbsp;</span>对于按值传递的参数，如果需要在方法调用以后修改参数的值，可以利用返回值来实现。</div>
<div style="margin-left: 60pt; text-indent: -18pt"><span>2、&nbsp;</span>对于按值传递的参数，如果需要在方法内部修改时原来的参数不改变，则可以在方法内部重新创建该对象实现。</div>
<div style="margin-left: 38.95pt">示例代码如下：</div>
<div style="margin-left: 63pt">public class Test2{</div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; public static int t1(int n){</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = 10;</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return n;</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; public static String t2(String s){</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = "123";</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; s;</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; public static void t3(int[] array){</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>创建新的数组并赋值</div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] newArray = new int[array.length];</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>数据拷贝</div>
<div style="margin-left: 63pt">&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(array,0,newArray,0,array.length);</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newArray[0] = 2;</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; public static void main(String[] args){</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int m = 5;</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>重新赋值</div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = t1(m);</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(m);</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s1 = "abc";</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>重新赋值</div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s1 = t2(s1);</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s1);</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] arr = {1,2,3,4};</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t3(arr);</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(arr[0]);</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; </span></div>
<div style="margin-left: 63pt">}</div>
<div style="margin-left: 42pt">这样，程序的输出结果就将是：10&nbsp;123<span>&nbsp;&nbsp; 1</span>。</div>
<div style="margin-left: 42pt">在实际的程序开发中，可以根据需要使用类似的结构来进行实现。</div>
<div style="margin-left: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>下面再介绍一个参数传递的常见应用，利用参数传递实现返回值，这样的功能在IO类设计的read方法中大量使用。示例代码如下：</div>
<div style="margin-left: 63pt">public class Test3{</div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; public static void initArray(int[] array){</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0;i &lt; array.length;i++){</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array[i] = i;</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; public static void main(String[] args){</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] a = new int[10];</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initArray(a);</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0;i &lt; a.length;i++){</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(a[i]);</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 63pt"><span>&nbsp;&nbsp;&nbsp; }</span></div>
<div style="margin-left: 63pt">}</div>
<div style="margin-left: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在该示例代码中，在initArray方法内部修改了数组的值以后，外部数组a的值也会发生改变，间接实现了返回值的效果。当然，在该示例代码中，因为只返回一个参数，所以作用体现的不明显，如果需要返回多个参数时，使用按址传递是一种不错的主意。</div>
<div style="margin-left: 21pt"><span>&nbsp;&nbsp;&nbsp; </span>因时间仓促，疏漏之处难免，请大家积极补充和指正。</div>
<img src ="http://www.blogjava.net/mark1207/aggbug/194071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-04-18 17:01 <a href="http://www.blogjava.net/mark1207/archive/2008/04/18/194071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ObjectOutputStream和ObjectInputStream</title><link>http://www.blogjava.net/mark1207/archive/2008/04/14/192751.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Mon, 14 Apr 2008 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/04/14/192751.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/192751.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/04/14/192751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/192751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/192751.html</trackback:ping><description><![CDATA[<p>ObjectOutputStream和ObjectInputStream</p>
<p>--ObjectOutputStream</p>
<p>ObjectInputStream 类恢复以前使用 ObjectOutputStream 类序列化后的基本类型数据和对象。 </p>
<p>ObjectOutputStream 和 ObjectInputStream 分别利用 FileOutputStream 和 FileInputStream 能支持应用程序实现对象图象的稳定存储。</p>
<p>ObjectInputStream 可用于恢复以前序列化过的对象。另外其它一些情况也使用此类，诸如使用一个 Socket 在主机间传递对象时，</p>
<p>或在远程通讯系统中为实现参数和参变量的通讯而进行对象传递时。 </p>
<p>ObjectInputStream 保证从流中创建的图象中的所有对象的类型与 Java 虚拟机中出现的类匹配。使用标准机制按需装载相应类。 </p>
<p>只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流中读取。使用 readObject 方法从该流中</p>
<p>读取一个对象。 Java 的安全造型应该用于获取期望类型。在 Java 中, 串和数组都是对象且可当作是序列化过程中的对象。</p>
<p>读取时，它们需要转换为所需类型。 </p>
<p>另外基类型也可使用 DataInput 中的正确方法从该流中读取。 </p>
<p>对象的缺省逆序列化机制将每个域的内容恢复为它被写入时的值和类型。逆序列化过程中忽略申明为暂时的或静态的域。</p>
<p>对其它对象的引用促使那些对象必须从流中读取。使用引用共享机制正确地恢复对象的图象。逆序列化时总是分配新对象，</p>
<p>防止重写已存在的对象。 </p>
<p>读取一个对象同运行一个新对象的构造子类似。为该对象分配的内存初始化为空(NULL)。为非序列化类调用无参构造子，</p>
<p>然后将序列化类的域从该流中恢复，恢复从最接近 java.lang.object 的序列化对象开始，到指定对象结束。 </p>
<p>例如读取在示例中写入 ObjectOutputStream 中的流：</p>
<p><br />
&nbsp;FileInputStream istream = new FileInputStream("t.tmp");<br />
&nbsp;ObjectInputStream p = new ObjectInputStream(istream);<br />
&nbsp;int i = p.readInt();<br />
&nbsp;String today = (String)p.readObject();<br />
&nbsp;Date date = (Date)p.readObject();<br />
&nbsp;istream.close();<br />
&nbsp;<br />
类通过实现 java.io.Serializable 或 java.io.Externalizable 接口来控制它们的序列化。</p>
<p>实现序列化接口可以使对象能保存和恢复它的完整状态，可以使类在写入流和从流中读取的期间内进行改进。</p>
<p>它自动地遍历对象间的引用，保存和恢复完整图象。在序列化和逆序列化处理过程中需要特定句柄的可序列化类，</p>
<p>必须实现如下这两个方法： </p>
<p><br />
&nbsp;private void writeObject(java.io.ObjectOutputStream stream)<br />
&nbsp;&nbsp;&nbsp;&nbsp; throws IOException;<br />
&nbsp;private void readObject(java.io.ObjectInputStream stream)<br />
&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, ClassNotFoundException; <br />
&nbsp;<br />
利用 writeObjectmethod 方法将一个特殊类的对象的状态写入某流后，相应的 readObject 方法将负责读取和恢复这些数据。</p>
<p>此方法不必关心状态是属于它的父类还是子类。 从 ObjectInputStream 读取数据恢复单个域的状态，并将之赋给该对象的恰当域。</p>
<p>使用 DataInput 方法读取基本数据类型。</p>
<p>序列化操作对没有实现 java.io.Serializable 接口的对象，不读取或分配它的域值。非序列化对象的子类可以是序列化的。</p>
<p>在这种情况下，非序列化类必须有一个无参构造子，使它的域能使用此构造子完成初始化。 在此情况下，</p>
<p>子类负责保存和恢复非序列化类的状态。通常情况父类的域是可存储的(公有的、包或保护的)，</p>
<p>或存在用于恢复它的状态的可使用的获取或设置方法。 </p>
<p>ObjectInputStream 能获取逆序列化一个对象期间出现的任一异常，一旦出现异常，则放弃读过程。 </p>
<p>实现外部接口可以使对象完全控制此对象序列化形式的内容和格式。</p>
<p>调用外部接口的方法：writeExternal 和 readExternal 保存和恢复对象状态。当一个类实现了这些方法时，</p>
<p>它们就能使用 ObjectOutput 和 ObjectInput 方法的所有方法写入或读取它们自己的状态。对象负责管理它出现的相应版本。 </p>
<p><br />
ObjectOutputStream</p>
<p>public class ObjectOutputStream <br />
extends OutputStream <br />
implements ObjectOutput, ObjectStreamConstants <br />
类 ObjectOutputStream 将 Java 对象中的基本数据类型和图元写入到一个 OutputStream 对象中。可使用 ObjectInputStream 读取这些对象。</p>
<p>另外使用此流对应的文件能存储这些对象。如果该流是一个网络通讯流，则在另一台主机或另一个处理机上可重建这些对象。 </p>
<p>只有支持 java.io.Serializable 接口的对象才能被写入该流。对每个可序列化的对象进行编码，包括相应类的名称和标记，</p>
<p>对象的属性和数组值，以及初始化对象时引用的任何其它对象等。 </p>
<p>使用 writeObject 将一个对象写入该流。任一对象，包括串和数组，均采用 writeObject 方法被写入。</p>
<p>也能将多个对象或基类型对象写入此流。反过来，必须以这些对象被写入的相同类型和相同顺序，</p>
<p>从相应的 ObjectInputstream 流中读回这些对象。 </p>
<p>基类型也可使用 DataOutput 中的正确方法写入此流。串对象也可使用 writeUTF 方法写入。</p>
<p>一个对象的缺省序列化机制将写入对象的类，类标记和所有的非暂时的和非静态的属性值。</p>
<p>其它对象(除暂时的或静态的属性)的引用也将促使以上这些对象被写入。 使用共享机制，对单一对象的多次引用进行编码，</p>
<p>以至对象的图元能被存储为与它原来写入时有相同的形状。 </p>
<p>例如写入一个对象，此对象能从 ObjectInputStream 中读出：</p>
<p><br />
&nbsp;FileOutputStream ostream = new FileOutputStream("t.tmp");<br />
&nbsp;ObjectOutputStream p = new ObjectOutputStream(ostream);<br />
&nbsp;p.writeInt(12345);<br />
&nbsp;p.writeObject("Today");<br />
&nbsp;p.writeObject(new Date());<br />
&nbsp;p.flush();<br />
&nbsp;ostream.close();<br />
&nbsp;<br />
在序列化处理过程中需要特定句柄的类，必须使用如下这些恰当的标记实现特定的方法： </p>
<p>&nbsp;private void readObject(java.io.ObjectInputStream stream)<br />
&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, ClassNotFoundException; <br />
&nbsp;private void writeObject(java.io.ObjectOutputStream stream)<br />
&nbsp;&nbsp;&nbsp;&nbsp; throws IOException<br />
&nbsp;<br />
writeObject 方法负责写特定类的对象的状态，以使相应的 readObject 方法能存储它。</p>
<p>此方法不必关心写入对象的父类或子类的状态。使用 writeObject 方法或基本类型支持的 DataOutput </p>
<p>方法将每个域的状态保存到 ObjectOutputStream 中。 </p>
<p>序列化操作不能输出没有实现 java.io.Serializable 接口的任一对象的域。非序列化对象的子类可以是序列化的。 </p>
<p>在这种情况下，非序列化类必须有一个无参构造子，使它的域能被初始化。 在此情况下，子类负责保存和恢复非序列化类的状态。 </p>
<p>通常情况父类的域是可存储的(公有的、包或保护的)，或存在用于恢复它的状态的可使用的获取或设置方法。 </p>
<p>实现抛出 NotSerializableException 异常的 writeObject 和 readObject 方法能阻止一个对象的序列化。 </p>
<p>ObjectOutputStream 将获取这个异常，并放弃这个序列化过程。实现外部接口可以使对象完全控制此对象序列化形式的内容和格式。 </p>
<p>调用外部接口的方法：writeExternal 和 readExternal 保存和恢复对象状态。当一个类实现了这些方法时，</p>
<p>它们就能使用 ObjectOutput 和 ObjectInput 方法的所有方法写入或读取它们自己的状态。对象负责管理它出现的相应版本。 </p>
<p><br />
import java.io.*;<br />
import java.util.*;</p>
<p>public class Logon implements Serializable {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Date date = new Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String username;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private transient String password;</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logon(String name, String pwd) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password = pwd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String pwd = (password == null) ? "(n/a)" : password;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "logon info: \n " + "username: " + username + "\n date: " + date + "\n password: " + pwd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException, ClassNotFoundException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logon a = new Logon("Morgan", "morgan83");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( "logon a = " + a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.writeObject(a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int seconds = 5;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long t = System.currentTimeMillis() + seconds * 1000;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(System.currentTimeMillis() &lt; t) ;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( "Recovering object at " + new Date());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = (Logon)in.readObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("logon a = " + a); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;</p>
<p>类Logon是一个记录登录信息的类，包括用户名和密码。首先它实现了接口Serializable，这就标志着它可以被序列化。</p>
<p>之后再main方法里ObjectOutputStream o = new ObjectOutputStream( new FileOutputStream("Logon.out"));</p>
<p>新建一个对象输出流包装一个文件流，表示对象序列化的目的地是文件Logon.out。然后用方法writeObject开始写入。</p>
<p>想要还原的时候也很简单ObjectInputStream in = new ObjectInputStream( new FileInputStream("Logon.out"));</p>
<p>新建一个对象输入流以文件流Logon.out为参数，之后调用readObject方法就可以了。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/mark1207/aggbug/192751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-04-14 13:53 <a href="http://www.blogjava.net/mark1207/archive/2008/04/14/192751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA正则表达式4种常用功能</title><link>http://www.blogjava.net/mark1207/archive/2008/04/01/190068.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Tue, 01 Apr 2008 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/04/01/190068.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/190068.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/04/01/190068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/190068.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/190068.html</trackback:ping><description><![CDATA[正则表达式在字符串处理上有着强大的功能，sun在jdk1.4加入了对它的支持 <br />
<br />
下面简单的说下它的4种常用功能：<br />
<br />
查询：<br />
<br />
String str="abc efg ABC";<br />
正则表达式在字符串处理上有着强大的功能，sun在jdk1.4加入了对它的支持 <br />
<br />
下面简单的说下它的4种常用功能：<br />
<br />
查询：<br />
<br />
String str="abc efg ABC";<br />
<br />
String regEx="a|f";&nbsp;&nbsp; //表示a或f <br />
<br />
Pattern&nbsp;p=Pattern.compile(regEx);<br />
<br />
Matcher&nbsp;m=p.matcher(str);<br />
<br />
boolean&nbsp;rs=m.find();<br />
<br />
如果str中有regEx，那么rs为true，否则为flase。如果想在查找时忽略大小写，则可以写成Pattern&nbsp;p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);<br />
<br />
<strong>提取：</strong><br />
String&nbsp;regEx=".+\\\\(.+)$";<br />
<br />
String&nbsp;str="c:\\dir1\\dir2\\name.txt";<br />
<br />
Pattern&nbsp;p=Pattern.compile(regEx);<br />
<br />
Matcher&nbsp;m=p.matcher(str);<br />
<br />
boolean&nbsp;rs=m.find();<br />
<br />
for(int&nbsp;i=1;i&lt;=m.groupCount();i++){<br />
<br />
System.out.println(m.group(i));<br />
<br />
}<br />
<br />
以上的执行结果为name.txt，提取的字符串储存在m.group(i)中，其中i最大值为m.groupCount();<br />
<br />
<strong>分割：</strong><br />
<br />
String&nbsp;regEx="::";<br />
<br />
Pattern&nbsp;p=Pattern.compile(regEx);<br />
<br />
String[]&nbsp;r=p.split("xd::abc::cde");<br />
<br />
执行后，r就是{"xd","abc","cde"}，其实分割时还有跟简单的方法：<br />
<br />
String&nbsp;str="xd::abc::cde";<br />
<br />
String[]&nbsp;r=str.split("::");<br />
<br />
<strong>替换（删除）：</strong><br />
<br />
String&nbsp;regEx="a+";&nbsp;//表示一个或多个a<br />
<br />
Pattern&nbsp;p=Pattern.compile(regEx);<br />
<br />
Matcher&nbsp;m=p.matcher("aaabbced&nbsp;a&nbsp;ccdeaa");<br />
<br />
String&nbsp;s=m.replaceAll("A");<br />
<br />
结果为"Abbced&nbsp;A&nbsp;ccdeA"<br />
<br />
如果写成空串，既可达到删除的功能，比如：<br />
<br />
String&nbsp;s=m.replaceAll("");<br />
<br />
结果为"bbced&nbsp;&nbsp;ccde"<br />
<br />
<strong>附：</strong><br />
<br />
\d&nbsp;等於&nbsp;[0-9]&nbsp;数字&nbsp;<br />
\D&nbsp;等於&nbsp;[^0-9]&nbsp;非数字&nbsp;<br />
\s&nbsp;等於&nbsp;[&nbsp;\t\n\x0B\f\r]&nbsp;空白字元&nbsp;<br />
\S&nbsp;等於&nbsp;[^&nbsp;\t\n\x0B\f\r]&nbsp;非空白字元&nbsp;<br />
\w&nbsp;等於&nbsp;[a-zA-Z_0-9]&nbsp;数字或是英文字&nbsp;<br />
\W&nbsp;等於&nbsp;[^a-zA-Z_0-9]&nbsp;非数字与英文字&nbsp;<br />
<br />
^&nbsp;表示每行的开头<br />
$&nbsp;表示每行的结尾<br />
<br />
String regEx="a|f";&nbsp;&nbsp; //表示a或f <br />
<br />
Pattern&nbsp;p=Pattern.compile(regEx);<br />
<br />
Matcher&nbsp;m=p.matcher(str);<br />
<br />
boolean&nbsp;rs=m.find();<br />
<br />
如果str中有regEx，那么rs为true，否则为flase。如果想在查找时忽略大小写，则可以写成Pattern&nbsp;p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);<br />
<br />
<strong>提取：</strong><br />
String&nbsp;regEx=".+\\\\(.+)$";<br />
<br />
String&nbsp;str="c:\\dir1\\dir2\\name.txt";<br />
<br />
Pattern&nbsp;p=Pattern.compile(regEx);<br />
<br />
Matcher&nbsp;m=p.matcher(str);<br />
<br />
boolean&nbsp;rs=m.find();<br />
<br />
for(int&nbsp;i=1;i&lt;=m.groupCount();i++){<br />
<br />
System.out.println(m.group(i));<br />
<br />
}<br />
<br />
以上的执行结果为name.txt，提取的字符串储存在m.group(i)中，其中i最大值为m.groupCount();<br />
<br />
<strong>分割：</strong><br />
<br />
String&nbsp;regEx="::";<br />
<br />
Pattern&nbsp;p=Pattern.compile(regEx);<br />
<br />
String[]&nbsp;r=p.split("xd::abc::cde");<br />
<br />
执行后，r就是{"xd","abc","cde"}，其实分割时还有跟简单的方法：<br />
<br />
String&nbsp;str="xd::abc::cde";<br />
<br />
String[]&nbsp;r=str.split("::");<br />
<br />
<strong>替换（删除）：</strong><br />
<br />
String&nbsp;regEx="a+";&nbsp;//表示一个或多个a<br />
<br />
Pattern&nbsp;p=Pattern.compile(regEx);<br />
<br />
Matcher&nbsp;m=p.matcher("aaabbced&nbsp;a&nbsp;ccdeaa");<br />
<br />
String&nbsp;s=m.replaceAll("A");<br />
<br />
结果为"Abbced&nbsp;A&nbsp;ccdeA"<br />
<br />
如果写成空串，既可达到删除的功能，比如：<br />
<br />
String&nbsp;s=m.replaceAll("");<br />
<br />
结果为"bbced&nbsp;&nbsp;ccde"<br />
<br />
<strong>附：</strong><br />
<br />
\d&nbsp;等於&nbsp;[0-9]&nbsp;数字&nbsp;<br />
\D&nbsp;等於&nbsp;[^0-9]&nbsp;非数字&nbsp;<br />
\s&nbsp;等於&nbsp;[&nbsp;\t\n\x0B\f\r]&nbsp;空白字元&nbsp;<br />
\S&nbsp;等於&nbsp;[^&nbsp;\t\n\x0B\f\r]&nbsp;非空白字元&nbsp;<br />
\w&nbsp;等於&nbsp;[a-zA-Z_0-9]&nbsp;数字或是英文字&nbsp;<br />
\W&nbsp;等於&nbsp;[^a-zA-Z_0-9]&nbsp;非数字与英文字&nbsp;<br />
<br />
^&nbsp;表示每行的开头<br />
$&nbsp;表示每行的结尾<br />
<img src ="http://www.blogjava.net/mark1207/aggbug/190068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-04-01 14:02 <a href="http://www.blogjava.net/mark1207/archive/2008/04/01/190068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>技术辞典：Java术语－封装</title><link>http://www.blogjava.net/mark1207/archive/2008/03/17/186723.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Mon, 17 Mar 2008 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/03/17/186723.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/186723.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/03/17/186723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/186723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/186723.html</trackback:ping><description><![CDATA[<strong>术语解释：</strong></descript>封装有数据和实现方法，因此用户就可以将其视为一个提供服务的黑匣子，可向其中添加实例变量和方法，也可删除或改变其中的实例变量和方法。但只要提供的服务保持不变，使用该程序代码的就还可以继续使用它而不必被重写。另见实例变量、实例方法。 <br />
<img src ="http://www.blogjava.net/mark1207/aggbug/186723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-03-17 11:46 <a href="http://www.blogjava.net/mark1207/archive/2008/03/17/186723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何正确的封装Java类</title><link>http://www.blogjava.net/mark1207/archive/2008/03/17/186722.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Mon, 17 Mar 2008 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2008/03/17/186722.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/186722.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2008/03/17/186722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/186722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/186722.html</trackback:ping><description><![CDATA[封装类要保证封装内容的高度统一性，这些方法都大大简化了类封装的可维护性和重调用性。<br />
　　可维护性<br />
　　既然大家都知道重载是面向对象程序设计的很重要组成部分，那么你可以看出软件的可维护性的重要性。如果能正确地封装类，你就可以减少很多函数的更改。<br />
　　<br />
　　在同一封装里严密地联结各个类<br />
　　严密地联结封装中的各个类可以得到高凝聚的封装。如果两个类展示出很好的联结性，那么这两个类很有可能被经常地调用以提供联系方便的服务。所以当在设计你的封装时，你可以最大限度地减小封装之间的依靠性，以避免各个封装的冲突。<br />
　　<br />
　　在同一封装里类要统一改变<br />
　　显然的，当其他类改变时，各个严密结合的类也同样受到影响。任一个类的更改都会导致与这一类相关的类的相应更改，至少，类中的函数必须更改。你可以通过在同一封装里严密联结类来避免这些风险。<br />
　　<br />
　　然而，一些联结不严密的类也被工程的其他改变而改变。在这样的情况下，你应该把这些类放在同一封装。因为独立的类改变时，它们会产生其他的负影响。<br />
　　<br />
　　在不同封装里类不要一起调用<br />
　　封装启发的可行性取决于是否封装能提供真正的联结。即使类能经常地一起被调用，它们却不能一起被改变。所认你必须把这些类进行独立封装。当然，这就意味着引入多个封装来调用独立的类。这一方法的优点是显而易见的。<br />
　　<br />
　　在一个封装里对一个类的依赖也会产生对其他类的依赖，这是必然的。当封装中一个类改变时，整个封装都会发生变化。<br />
　　<br />
　　在不同封装里类不要一起重载<br />
　　不幸的是，即使在初始化时，一个类对象不能允许它自己去调用不同的类，就给软件升级带来不利，这样软件的可维护性就变得非常很重要。所以在不同的封装里，独立的类重载是一个最有效的方法。<br />
　　<br />
　　关键的注意事项<br />
　　在Java程序设计时，你必须注意以下几点：<br />
　　<br />
　　Containing Change &#8211;&#8211;&#8211;&#8211;封装各个类到一个单一的封装里能减少很多更改，把所有改变都集中到一个封装里有助于软件的可维护性。<br />
　　<br />
　　Class coupling &#8211;&#8211;&#8211;&#8211;&#8211;当在同一封装里联结类时，你应该注意到其他类也有可能和这一个类有关。忽视这些联系会产生很多不必要的关联。<br />
　　<br />
　　Contention &#8211;&#8211;&#8211;&#8211;&#8211; 前两个启发产生比较大的封装，目的是调用；后两个启发产生比较小的封装，目的是可维护。这前后的封装会发生冲突。在开发过程中，你必须在程序结构上作出相应的改变。在程序设计开发初期，你应该选择利于软件可维护性的比较小的封装；当在开发后期，你应该选择利于软件调用的比较大的封装。<br />
　　<br />
　　调用<br />
　　当设计程序框架时，你应该集中于封装的调用，因为Java封装的调用和可维护非常的重要。当设计合理，程序就很容易的支持封装的调用功能。<br />
<img src ="http://www.blogjava.net/mark1207/aggbug/186722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2008-03-17 11:44 <a href="http://www.blogjava.net/mark1207/archive/2008/03/17/186722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java生成随机数</title><link>http://www.blogjava.net/mark1207/archive/2007/12/05/165650.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Wed, 05 Dec 2007 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/mark1207/archive/2007/12/05/165650.html</guid><wfw:comment>http://www.blogjava.net/mark1207/comments/165650.html</wfw:comment><comments>http://www.blogjava.net/mark1207/archive/2007/12/05/165650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mark1207/comments/commentRss/165650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mark1207/services/trackbacks/165650.html</trackback:ping><description><![CDATA[<p><font size="2">一.在j2se里我们可以使用Math.random()方法来产生一个随机数，这个产生的随机数是0-1之间的一个double，我们可以把他乘以一定的数，比如说乘以100，他就是个100以内的随机，这个在j2me中没有。</font></p>
<p><font size="2">二.在java.util这个包里面提供了一个Random的类，我们可以新建一个Random的对象来产生随机数，他可以产生随机整数、随机float、随机double，随机long，这个也是我们在j2me的程序里经常用的一个取随机数的方法。</font></p>
<p><font size="2">三.在我们的System类中有一个currentTimeMillis()方法，这个方法返回一个从1970年1月1号0点0分0秒到目前的一个毫秒数，返回类型是long，我们可以拿他作为一个随机数，我们可以拿他对一些数取模，就可以把他限制在一个范围之内啦</font></p>
<p><font size="2">其实在Random的默认构造方法里也是使用上面第三种方法进行随机数的产生的</font></p>
<p><font size="2">对于方法二中的Random类有以下说明： </font></p>
<p><font size="2">java.util.Random类有两种方式构建方式：带种子和不带种子</font></p>
<p><font size="2">不带种子：</font></p>
<p><font size="2">此种方式将会返回随机的数字，每次运行结果不一样</font></p>
<p><font size="2">public class RandomTest {</font></p>
<p><font size="2">public static void main(String[] args) {</font></p>
<p><font size="2">java.util.Random r=new java.util.Random(); </font></p>
<p><font size="2">for(int i=0;i&lt;10;i++){ </font></p>
<p><font size="2">System.out.println(r.nextInt());</font></p>
<p><font size="2">}</font></p>
<p><font size="2">}</font></p>
<p><font size="2">带种子：</font></p>
<p><font size="2">此种方式，无论程序运行多少次，返回结果都是一样的</font></p>
<p><font size="2">public static void main(String[] args) {</font></p>
<p><font size="2">java.util.Random r=new java.util.Random(10);</font></p>
<p><font size="2">for(int i=0;i&lt;10;i++){</font></p>
<p><font size="2">System.out.println(r.nextInt());</font></p>
<p><font size="2">}</font></p>
<p><font size="2">}</font></p>
<p><font size="2">两种方式的差别在于</font></p>
<p><font size="2">(1) 首先请打开Java Doc，我们会看到Random类的说明：</font></p>
<p><font size="2">此类的实例用于生成伪随机数流，此类使用 48 位的种子，该种子可以使用线性同余公式对其进行修改（请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》，第 3.2.1 节）。</font></p>
<p><font size="2">如果用相同的种子创建两个 Random 实例，则对每个实例进行相同的方法调用序列，它们将生成并返回相同的数字序列。为了保证实现这种特性，我们为类Random指定了特定的算法。为了 Java 代码的完全可移植性，Java 实现必须让类 Random 使用此处所示的所有算法。但是允许 Random 类的子类使用其他算法，只要其符合所有方法的常规协定即可。</font></p>
<p><font size="2">Java Doc对Random类已经解释得非常明白，我们的测试也验证了这一点。</font></p>
<p><font size="2">(2) 如果没有提供种子数，Random实例的种子数将是当前时间的毫秒数，可以通过System.currentTimeMillis()来获得当前时间的毫秒数。打开JDK的源代码，我们可以非常明确地看到这一点。</font></p>
<p><font size="2">/** <br />
* Creates a new random number generator. Its seed is initialized to <br />
* a value based on the current time: <br />
* Random() { this(System.currentTimeMillis()); }java.lang.System#currentTimeMillis()<br />
*/ <br />
public Random() { this(System.currentTimeMillis()); } </font></p>
<p><font size="2">另外： </font></p>
<p><font size="2">random对象的nextInt(),nextInt(int n)方法的说明：</font></p>
<p><font size="2">int </font><font size="2">nextInt() <br />
返回下一个伪随机数，它是此随机数生成器的序列中均匀分布的 int 值。</font></p>
<p><font size="2">int </font><font size="2">nextInt(int n) <br />
返回一个伪随机数，它是从此随机数生成器的序列中取出的、在 0（包括）和指定值（不包括）之间均匀分布的 int值。<br />
<br />
源引自：http://okone96.itpub.net/post/9033/231699</font></p>
<img src ="http://www.blogjava.net/mark1207/aggbug/165650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mark1207/" target="_blank">Mark</a> 2007-12-05 21:29 <a href="http://www.blogjava.net/mark1207/archive/2007/12/05/165650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>