﻿<?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-思想比知识更重要 成长比成功更重要</title><link>http://www.blogjava.net/renyangok/</link><description>回归blogjava</description><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 02:14:02 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 02:14:02 GMT</pubDate><ttl>60</ttl><item><title>java中到底传值还是引用</title><link>http://www.blogjava.net/renyangok/archive/2008/09/12/228524.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Fri, 12 Sep 2008 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2008/09/12/228524.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/228524.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2008/09/12/228524.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/228524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/228524.html</trackback:ping><description><![CDATA[JAVA中的传递都是值传递吗？有没有引用传递呢？ <br />
<br />
在回答这两个问题前，让我们首先来看一段代码： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://zangweiren.javaeye.com/blog/214369#"><img alt="复制代码" src="http://zangweiren.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">class</font></strong></span><span> ParamTest { &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 初始值为0 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#7f0055">protected</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> num = </span><span class="number"><font color="#c00000">0</font></span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 为方法参数重新赋值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(</span><span class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> i) { &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = </span><span class="number"><font color="#c00000">5</font></span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 为方法参数重新赋值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(ParamTest t) { &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ParamTest tmp = </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ParamTest(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp.num = </span><span class="number"><font color="#c00000">9</font></span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = tmp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 改变方法参数的值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> add(</span><span class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> i) { &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i += </span><span class="number"><font color="#c00000">10</font></span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 改变方法参数属性的值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> add(ParamTest pt) { &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pt.num += </span><span class="number"><font color="#c00000">20</font></span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">static</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> main(String[] args) { &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ParamTest t = </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ParamTest(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"参数--基本类型"</font></span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"原有的值："</font></span><span> + t.num); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 为基本类型参数重新赋值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.change(t.num); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"赋值之后："</font></span><span> + t.num); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 为引用型参数重新赋值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.change(t); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"运算之后："</font></span><span> + t.num); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ParamTest(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"参数--引用类型"</font></span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"原有的值："</font></span><span> + t.num); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 改变基本类型参数的值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.add(t.num); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"赋引用后："</font></span><span> + t.num); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 改变引用类型参数所指向对象的属性值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.add(t); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"改属性后："</font></span><span> + t.num); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none;" name="code">public class ParamTest {
// 初始值为0
protected int num = 0;
// 为方法参数重新赋值
public void change(int i) {
i = 5;
}
// 为方法参数重新赋值
public void change(ParamTest t) {
ParamTest tmp = new ParamTest();
tmp.num = 9;
t = tmp;
}
// 改变方法参数的值
public void add(int i) {
i += 10;
}
// 改变方法参数属性的值
public void add(ParamTest pt) {
pt.num += 20;
}
public static void main(String[] args) {
ParamTest t = new ParamTest();
System.out.println("参数--基本类型");
System.out.println("原有的值：" + t.num);
// 为基本类型参数重新赋值
t.change(t.num);
System.out.println("赋值之后：" + t.num);
// 为引用型参数重新赋值
t.change(t);
System.out.println("运算之后：" + t.num);
System.out.println();
t = new ParamTest();
System.out.println("参数--引用类型");
System.out.println("原有的值：" + t.num);
// 改变基本类型参数的值
t.add(t.num);
System.out.println("赋引用后：" + t.num);
// 改变引用类型参数所指向对象的属性值
t.add(t);
System.out.println("改属性后：" + t.num);
}
}</pre>
<br />
这段代码的运行结果如下： <br />
<ol>
    <li>参数--基本类型</li>
    <li>原有的值：0</li>
    <li>赋值之后：0</li>
    <li>运算之后：0</li>
    <li> <br />
    </li>
    <li>参数--引用类型</li>
    <li>原有的值：0</li>
    <li>赋引用后：0</li>
    <li>改属性后：20</li>
</ol>
<br />
从上面这个直观的结果中我们很容易得出如下结论： <br />
<ol>
    <li>对于基本类型，在方法体内对方法参数进行重新赋值，并不会改变原有变量的值。</li>
    <li>对于引用类型，在方法体内对方法参数进行重新赋予引用，并不会改变原有变量所持有的引用。</li>
    <li>方法体内对参数进行运算，不影响原有变量的值。</li>
    <li>方法体内对参数所指向对象的属性进行运算，将改变原有变量所指向对象的属性值。</li>
</ol>
<br />
上面总结出来的不过是我们所看到的表面现象。那么，为什么会出现这样的现象呢？这就要说到值传递和引用传递的概念了。这个问题向来是颇有争议的。 <br />
<br />
大家都知道，在JAVA中变量有以下两种： <br />
<ol>
    <li>基本类型变量，包括char、byte、short、int、long、float、double、boolean。</li>
    <li>引用类型变量，包括类、接口、数组（基本类型数组和对象数组）。</li>
</ol>
<br />
当基本类型的变量被当作参数传递给方法时，JAVA虚拟机所做的工作是把这个值拷贝了一份，然后把拷贝后的值传递到了方法的内部。因此在上面的例子中，我们回头来看看这个方法： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://zangweiren.javaeye.com/blog/214369#"><img alt="复制代码" src="http://zangweiren.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="comment"><font color="#008200">// 为方法参数重新赋值 </font></span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(</span><span class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> i) { &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; i = </span><span class="number"><font color="#c00000">5</font></span><span>; &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none;" name="code">// 为方法参数重新赋值
public void change(int i) {
i = 5;
}</pre>
<br />
在这个方法被调用时，变量i和ParamTest型对象t的属性num具有相同的值，却是两个不同变量。变量i是由JAVA虚拟机创建的作用域在
change(int i)方法内的局部变量，在这个方法执行完毕后，它的生命周期就结束了。在JAVA虚拟机中，它们是以类似如下的方式存储的： <br />
<div style="text-align: center;"><img src="http://zangweiren.javaeye.com/upload/picture/pic/17754/bf858157-cd1b-3e9e-9fd1-374906bfd90f.jpg"  alt="" /></div>
<br />
很明显，在基本类型被作为参数传递给方式时，是值传递，在整个过程中根本没有牵扯到引用这个概念。这也是大家所公认的。对于布尔型变量当然也是如此，请看下面的例子： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://zangweiren.javaeye.com/blog/214369#"><img alt="复制代码" src="http://zangweiren.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">class</font></strong></span><span> BooleanTest { &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 布尔型值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span> bool = </span><span class="keyword"><strong><font color="#7f0055">true</font></strong></span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 为布尔型参数重新赋值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(</span><span class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span> b) { &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = </span><span class="keyword"><strong><font color="#7f0055">false</font></strong></span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 对布尔型参数进行运算 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> calculate(</span><span class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span> b) { &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = b &amp;&amp; </span><span class="keyword"><strong><font color="#7f0055">false</font></strong></span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 为了方便对比，将运算结果输出 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"b运算后的值："</font></span><span> + b); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">static</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> main(String[] args) { &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BooleanTest t = </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> BooleanTest(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"参数--布尔型"</font></span><span>); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"原有的值："</font></span><span> + t.bool); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 为布尔型参数重新赋值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.change(t.bool); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"赋值之后："</font></span><span> + t.bool); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// 改变布尔型参数的值 </font></span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.calculate(t.bool); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span class="string"><font color="#0000ff">"运算之后："</font></span><span> + t.bool); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none;" name="code">public class BooleanTest {
// 布尔型值
boolean bool = true;
// 为布尔型参数重新赋值
public void change(boolean b) {
b = false;
}
// 对布尔型参数进行运算
public void calculate(boolean b) {
b = b &amp;&amp; false;
// 为了方便对比，将运算结果输出
System.out.println("b运算后的值：" + b);
}
public static void main(String[] args) {
BooleanTest t = new BooleanTest();
System.out.println("参数--布尔型");
System.out.println("原有的值：" + t.bool);
// 为布尔型参数重新赋值
t.change(t.bool);
System.out.println("赋值之后：" + t.bool);
// 改变布尔型参数的值
t.calculate(t.bool);
System.out.println("运算之后：" + t.bool);
}
}</pre>
<br />
输出结果如下： <br />
<ol>
    <li>参数--布尔型</li>
    <li>原有的值：true</li>
    <li>赋值之后：true</li>
    <li>b运算后的值：false</li>
    <li>运算之后：true</li>
</ol>
<br />
那么当引用型变量被当作参数传递给方法时JAVA虚拟机又是怎样处理的呢？同样，它会拷贝一份这个变量所持有的引用，然后把它传递给JAVA虚拟机为方法
创建的局部变量，从而这两个变量指向了同一个对象。在篇首所举的示例中，ParamTest类型变量t和局部变量pt在JAVA虚拟机中是以如下的方式存
储的： <br />
<div style="text-align: center;"><img src="http://zangweiren.javaeye.com/upload/picture/pic/17756/3c3c237f-bd06-3e7a-a0d9-a2317754b560.jpg"  alt="" /></div>
<br />
有一种说法是当一个对象或引用类型变量被当作参数传递时，也是值传递，这个值就是对象的引用，因此JAVA中只有值传递，没有引用传递。还有一种说法是引
用可以看作是对象的别名，当对象被当作参数传递给方法时，传递的是对象的引用，因此是引用传递。这两种观点各有支持者，但是前一种观点被绝大多数人所接
受，其中有《Core Java》一书的作者，以及JAVA的创造者James Gosling，而《Thinking in
Java》一书的作者Bruce Eckel则站在了中立的立场上。 <br />
<br />
我个人认为值传递中的值指的是基本类型的数值，即使对于布尔型，虽然它的表现形式为true和false，但是在栈中，它仍然是以数值形式保存的，即0表
示false，其它数值表示true。而引用是我们用来操作对象的工具，它包含了对象在堆中保存地址的信息。即使在被作为参数传递给方法时，实际上传递的
是它的拷贝，但那仍是引用。因此，用引用传递来区别与值传递，概念上更加清晰。 <br />
<br />
最后我们得出如下的结论： <br />
<ol>
    <li>基本类型和基本类型变量被当作参数传递给方法时，是值传递。在方法实体中，无法给原变量重新赋值，也无法改变它的值。</li>
    <li>对象和引用型变量被当作参数传递给方法时，在方法实体中，无法给原变量重新赋值，但是可以改变它所指向对象的属性。至于到底它是值传递还是引用传递，这并不重要，重要的是我们要清楚当一个引用被作为参数传递给一个方法时，在这个方法体内会发生什么。</li>
</ol>
<p>什么叫引用?只因为这个变量的值和其它的不一样. <br />
<br />
<br />
首先理解:都是变量 <br />
int i; <br />
ArrayList b; <br />
i和b都是变量. <br />
但i是基本变量,也叫原始变量. <br />
其它的就叫引用变量,因为它的值是一个内存地址值.引用对象的.但记住:它们都是有一个值的!i是一个数字,而b是一个内存地址值(简单的说是一个十六进
制的值).除了基本变量之外的变量都是引用变量.Vector a;这里的a也是一个变量.它也是有值的,它的值是一个十六进制的值. <br />
<br />
变量的赋值: <br />
int i=10; <br />
int j=i; <br />
//这里把i的值10给了j,所以j的值也是10 <br />
<br />
ArrayList b=new ArrayList(); <br />
ArrayList c=b; <br />
//首先,b是一个引用变量,它的"值":是一个内存地址值!!! new
ArrayList()要分配一段内存保存它们,怎么样找到这段内存?那就是通过b里的值了.b的值就是new
ArrayList()所占内存的首地址.然后c也是一个引用变量,它的值(地址值)和b是一样的.也就是new
ArrayList()所占内存的首地址.所以当通过b或者c进行操作时,它们都是操作同一个对象的. <br />
<br />
在方法调用的时候,方法的参数实际也就是一个变量.如果是基本类型变量的时候,假设有方法method(int aa); <br />
int j=10; <br />
method(j); <br />
这里边,int aa实际也是定义了一个变量,调用的时候把j的值:10也给了aa.所以aa也是10,改变了aa的值并不会改变j的值. <br />
<br />
如果是引用变量的时候,假设有方法methodA(ArrayList aa); <br />
ArrayList b = new ArrayList(); <br />
methodA(b); <br />
//方法定义了变量aa,调用的时候把b的值(地址值!!!!!)给了aa,所以aa与b有一样的值(地址值!!!!),在方法里通过aa去操作的时候,b所引用的对象也就被改变了,因为它们引用同一个对象. <br />
<br />
纸 a = new 银行帐户();//开一个银行帐户,返回一个卡号给你,写在你的纸a里边. <br />
<br />
用一张纸(引用变量),把你的银行卡号写在上边,然后调用我的时候,我用另外一张纸(引用变量---方法的形数),把你的号码抄过来.然后我通过这个卡号,去到银行找到你的帐号,给你存点钱. <br />
<br />
然后你用你的纸(引用变量)上的卡号 &lt;没变,还是那个卡号&gt;再去查询银行帐号的时候就会发现了多了一些钱了.....</p>
<p>说说我对值传递和引用传递的看法：<br />
首先我认为，大家对Java传递参数的行为是清楚的，这个争论只是一个语义上的争论。<br />
也就是我们是否需要区分值传递和应用传递呢？或者说这样的区分有没有意义？是否合理？<br />
<br />
博主认为存在引用传递的关键点在于，传递的对象地址值，本质上它是一个引用，无论它是否被copy过。<br />
认为只有值传递的关键点在于，传递的对象地址值，它是一个值的copy，这个值代表的意义无所谓。<br />
<br />
引用是c++里的概念，由于java跟c++是有一定关系的，这里把引用迁移过来，如果合理未尝不可。<br />
c++中关于引用的解释一般喜欢说是看作&#8220;别名&#8221;，我查了几本书，大部分提到引用并不会分配内存空间，也有一本书提到，某些编译器会分配存储空间来存储被引用对象的地址。<br />
那么还是回到语义上来，c++里的这个引用，语义上是&#8220;别名&#8221;的意思，我的理解是，一组指向同一个对象的别名应该只存储一份内存地址。当然具体实现可能会
把引用当做一个不可变的指针来处理（每个别名都存储自己的对象地址）。但是请注意，我们应该关注于它的语义，即：它没有任何值的copy，即使是一个地
址，只是另外一个名字而已。<br />
<br />
但是java里面没有这样的概念，所有的地址传递其行为是值的传递方式，语义上统一成值传递更为清晰，我们只需要考虑这个值具体是什么，无非两种，要么是基本类型值，要么是个地址。<br />
所以我认为这个&#8220;引用&#8221;的概念放到java中并不合适。只有值传递的说法更合理。</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/228524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2008-09-12 10:25 <a href="http://www.blogjava.net/renyangok/archive/2008/09/12/228524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] update-alternatives </title><link>http://www.blogjava.net/renyangok/archive/2008/02/13/179749.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Wed, 13 Feb 2008 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2008/02/13/179749.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/179749.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2008/02/13/179749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/179749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/179749.html</trackback:ping><description><![CDATA[Linux 发展到今天，可用的软件已经非常多了。这样自然会有一些软件的功能大致上相同。例如，同样是编辑器，就有
nvi、vim、emacs、nano，而且我说的这些还只是一部分。大多数情况下，这样的功能相似的软件都是同时安装在系统里的，可以用它们的名称来执
行。例如，要执行 vim，只要在终端下输入 vim
并按回车就可以了。不过，有些情况下我们需要用一个相对固定的命令调用这些程序中的一个。例如，当我们写一个脚本程序时，只要写下
editor，而不希望要为&#8220;编辑器是哪个&#8221;而操心。Debian 提供了一种机制来解决这个问题，而 update-alternatives
就是用来实现这种机制的。<br />
<br />
在说明 update-alternatives 的详细内容之间，先让我们看看系统中已有的例子。打开终端，执行下面的命令：<br />
<br />
herbert@natsu:~$ ls -l /usr/bin/editor<br />
lrwxrwxrwx 1 root root 24 2004-09-26 08:48 /usr/bin/editor -&gt; /etc/alternatives/editor<br />
herbert@natsu:~$ ls -l /etc/alternatives/editor<br />
lrwxrwxrwx 1 root root 12 2004-10-27 16:24 /etc/alternatives/editor -&gt; /usr/bin/vim<br />
herbert@natsu:~$<br />
<br />
我
们看到，editor 这个可执行命令实际上是个符号链接，它指向 /etc/alternatives/editor；而
/etc/alternatives/editor 也是个符号链接，它指向 /usr/bin/vim。这样，当我输入 editor
并回车时，将执行 vim。之所以要在 /usr/bin 和 /etc/alternatives
中费心建立这样两个链接，就是要实现上面说到的特性：方便脚本<br />
程序的编写和系统的管理。<br />
<br />
下面我们就来看看 update-alternatives 的功能。当然，如果你觉得我说得不详细，可以看看这个命令的 manpage：UPDATE-ALTERNATIVES(8)。<br />
<br />
首先要介绍的参数是 --display。它使我们可以看到一个命令的所有可选命令。执行<br />
<br />
natsu:/home/herbert# update-alternatives --display editor<br />
editor - status is auto.<br />
&nbsp;link currently points to /usr/bin/vim<br />
/bin/ed - priority -100<br />
&nbsp;slave editor.1.gz: /usr/share/man/man1/ed.1.gz<br />
/usr/bin/nvi - priority 19<br />
&nbsp;slave editor.1.gz: /usr/share/man/man1/nvi.1.gz<br />
/bin/nano - priority 40<br />
&nbsp;slave editor.1.gz: /usr/share/man/man1/nano.1.gz<br />
/usr/bin/vim - priority 120<br />
&nbsp;slave editor.1.gz: /usr/share/man/man1/vim.1.gz<br />
/usr/bin/emacs21 - priority 0<br />
&nbsp;slave editor.1.gz: /usr/share/man/man1/emacs.1emacs21.gz<br />
Current `best' version is /usr/bin/vim.<br />
natsu:/home/herbert#<br />
<br />
你可以看到我的机器上的所有可以用来被 editor 链接的命令。<br />
<br />
下面说说 --config。这个选项使我们可以选择其中一个命令：<br />
<br />
natsu:/home/herbert# update-alternatives --config editor<br />
<br />
There are 5 alternatives which provide `editor'. <br />
<br />
&nbsp; Selection Alternative<br />
-----------------------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 /bin/ed<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 /usr/bin/nvi<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 /bin/nano<br />
*+&nbsp;&nbsp;&nbsp; 4 /usr/bin/vim<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 /usr/bin/emacs21<br />
<br />
Press enter to keep the default[*], or type selection number: 4<br />
Using `/usr/bin/vim' to provide `editor'.<br />
natsu:/home/herbert#<br />
<br />
我并没有修改它，因为我还是比较喜欢 vim 的。当然，你可以选择别的程序。<br />
<br />
说
到这里我们就要介绍一些概念了。首先，update-alternatives 在一般情况下是由 postinst 和 prerm
这样的安装脚本自动调用的，所以一个 alternative 的状态有两种：自动和手动。每个 alternative
的初始状态都是自动。如果系统发现管理员手动修改了一个
alternative，它的状态就从自动变成了手动，这样安装脚本就不会更新它了。如果你希望将一个 alternative 变回自动，只要执行<br />
<br />
update-alternatives --auto editor<br />
<br />
就可以了。你注意到了吗？我们说到了&#8220;名字&#8221;。该怎样写名字呢？这就是我们要介绍的第二个概念：<br />
general name -- 这是指一系列功能相似的程序的&#8220;公用&#8221;名字（包括绝对路径），比如 /usr/bin/editor。<br />
link -- 这是指一个 alternative 在 /etc/alternative 中的名字，比如 editor。<br />
alternative -- 顾名思义，这是指一个可选的程序所在的路径（包括绝对路径），比如 /usr/bin/vim。<br />
--
auto，--display 和 --config 跟的都是
link。我们要说的第三个概念是优先级。这个比较简单，当然优先级越高的程序越好啦（在大多数情况下，我不想争论）最后一个概念是主和从的
alternative。想想看，你将 /usr/bin/editor 链接到了 vim，可是当你执行 man editor 时看到的却是
emacs 的 manpage，你会做何感想呢？这就引出了主和从 alternative 的概念了：当更新主的 alternative
时，从的 alternative 也会被更新。<br />
<br />
说完这四个重要的概念后，我们介绍另外两个选项。至于其他的。。。。我相信你会去看手册页的，对吗？<br />
<br />
第一个是 --install。它的格式是：<br />
<br />
update-alternatives --install gen link alt pri [--slave sgen slink salt] ...<br />
<br />
gen，
link，alt，pri 分别是我们上面说过的。如果需要从的 alternative，你可以用 --slave
加在后面。如果你在向一个已经存在的 alternative 组中添加新的 alternatives，该命令会把这些 alternatives
加入到这个已经存在的 alternative 组的<br />
列表中，并用新的可选命令作为新的命令；否则，将会建立一个新的自动的 alternative 组。<br />
<br />
呜呼！我加入了一个错误的 alternative。我不想要这个 alternative 了。在这种情况 下，可以执行下面的命令：<br />
<br />
update-alternatives --remove name path<br />
<br />
name
是一个在 /etc/alternatives 中的名字，也就是上面的 link，而 path
是希望删除的可选程序名的绝对路径名（放心，这样只是从列表中删除了这个程序，并不会真的从硬盘上删除程序的可执行文件）。如果从一个
alternative 组中删除了一个正在被链接的程序并且这个组仍然没有变成空的，update-alternatives
会自动用一个具有其他优先级的可选程序代替原来的程序。如果这个组变成空的了，那么连这个 alternative
组都会被移除。如果删除的程序没有被链接，则只有有关这个程序的信息会被移除。<br />
<br />
说个例子吧。我下载了 Eclipse，并且安装了
gcj 和 gij。可是我发现 GNU 的 java 工具还不足以运行 Eclipse。我只好到 Sun 公司的网页上下载了它的 java
工具 jdk。因为是自己安装的，我将它们安装在 /usr/local 上，以便将来重新安装 Linux
系统时这些程序仍然可以使用。于是我要做的就是用这个 jdk 中的 java 和 javac 来代替系统原来的。执行<br />
<br />
natsu:/home/herbert# update-alternatives --display java<br />
java - status is auto.<br />
&nbsp;link currently points to /usr/local/j2sdk1.4.2_06/bin/java<br />
/usr/bin/gij-wrapper-3.3 - priority 33<br />
&nbsp;slave java.1.gz: /usr/share/man/man1/gij-wrapper-3.3.1.gz<br />
/usr/local/j2sdk1.4.2_06/bin/java - priority 100<br />
&nbsp;slave java.1.gz: /usr/local/j2sdk1.4.2_06/man/man1/java.1<br />
Current `best' version is /usr/local/j2sdk1.4.2_06/bin/java.<br />
natsu:/home/herbert# update-alternatives --display javac<br />
javac - status is auto.<br />
&nbsp;link currently points to /usr/local/j2sdk1.4.2_06/bin/javac<br />
/usr/bin/gcj-wrapper-3.3 - priority 33<br />
&nbsp;slave javah: /usr/bin/gcjh-wrapper-3.3<br />
&nbsp;slave javac.1.gz: /usr/share/man/man1/gcj-wrapper-3.3.1.gz<br />
&nbsp;slave javah.1.gz: /usr/share/man/man1/gcjh-wrapper-3.3.1.gz<br />
/usr/bin/gcj-wrapper-3.4 - priority 33<br />
&nbsp;slave javah: /usr/bin/gcjh-wrapper-3.4<br />
&nbsp;slave javac.1.gz: /usr/share/man/man1/gcj-wrapper-3.4.1.gz<br />
&nbsp;slave javah.1.gz: /usr/share/man/man1/gcjh-wrapper-3.4.1.gz<br />
/usr/local/j2sdk1.4.2_06/bin/javac - priority 100<br />
&nbsp;slave javah: /usr/local/j2sdk1.4.2_06/bin/javah<br />
&nbsp;slave javac.1.gz: /usr/local/j2sdk1.4.2_06/man/man1/javac.1<br />
&nbsp;slave javah.1.gz: /usr/local/j2sdk1.4.2_06/man/man1/javah.1<br />
Current `best' version is /usr/local/j2sdk1.4.2_06/bin/javac.<br />
natsu:/home/herbert#<br />
<br />
（你看到的是我更新以后的）就可以得到关于要更新哪些 alternatives 的信息。我是这么更新的：<br />
<br />
update-alternatives
--install /usr/bin/javac javac /usr/local/j2sdk1.4.2_06/bin/javac 100
--slave /usr/bin/javah javah /usr/local/j2sdk1.4.2_06/bin/javah --slave
/usr/share/man/man1/javac.1.gz javac.1.gz
/usr/local/j2sdk1.4.2_06/man/man1/javac.1 --slave
/usr/share/man/man1/javah.1.gz javah.1.gz
/usr/local/j2sdk1.4.2_06/man/man1/javah.1<br />
update-alternatives
--install /usr/bin/java java /usr/local/j2sdk1.4.2_06/bin/java 100
--slave /usr/share/man/man1/java.1.gz java.1.gz
/usr/local/j2sdk1.4.2_06/man/man1/java.1<br />
<img src ="http://www.blogjava.net/renyangok/aggbug/179749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2008-02-13 10:08 <a href="http://www.blogjava.net/renyangok/archive/2008/02/13/179749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu7.10系统安装（包括各种常用软件，显卡驱动，双显示器，chroot sarge环境）</title><link>http://www.blogjava.net/renyangok/archive/2007/12/19/168813.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Wed, 19 Dec 2007 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/12/19/168813.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/168813.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/12/19/168813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/168813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/168813.html</trackback:ping><description><![CDATA[1, insert Ubuntu 7.10 CD<br />
a, format disc(primary 10G ext3; extend 59G ext3; swap 1G)<br />
<br />
b, install(timezone shanghai; en_US; "prepare disc space" manual, or the system will partition autoly)<br />
<br />
c, auto restart, go on install system(remenber cut off the net line except the netwidth is large, or it will cost long time to download from far away)<br />
<br />
2, config<br />
a, sources list<br />
sudo vim /etc/apt/sources.list<br />
# add "deb http://debian.exoweb.net/debian.cn99.com/debian etch main" into it<br />
sudo apt-get update<br />
sudo apt-get upgrade<br />
<br />
b, vedio card driver<br />
在ubuntu7.10下装nvidia 7 series显卡并配置双屏显示：<br />
<br />
一，显卡驱动 ＋ 双显示器 <br />
(修改X配置命令：sudo dpkg-reconfigure xserver-xorg)<br />
<br />
1，到nvidia网站下载7系列显卡的最新驱动<br />
<br />
2，ensure that the linux-restricted-modules or linux-restricted-modules-common packages have been uninstalled. Alternatively, you can edit the /etc/default/linux-restricted-modules or /etc/default/linux-restricted-modules-common configuration file and disable the NVIDIA linux-restricted kernel modules (nvidia, nvidia_legacy) via:<br />
<br />
DISABLED_MODULES="nv nvidia_new"<br />
<br />
3, <br />
sudo apt-get remove --purge nvidia-glx nvidia-glx-new<br />
sudo rm /etc/init.d/nvidia-glx /etc/init.d/nvidia-kernel /lib/linux-restricted-modules/.nvidia_new_installed<br />
<br />
4，然后ctrl+alt+1进入tty1<br />
sudo /etc/init.d/gdm stop<br />
sudo sh NVIDIA-Linux-x86-100.14.23-pkg1.run<br />
(这时会出现错误提示，说少了&#8220;libc header file...libc development package&#8221;)<br />
sudo apt-get install sudo apt-get install build-essential xorg-dev pkg-config linux-headers-$(uname -r), libc6-dev<br />
sudo sh NVIDIA-Linux-x86-100.14.23-pkg1.run<br />
sudo /etc/init.d/gdm start<br />
<br />
用application -&gt; system tools里的nvidia工具去配置双显示器<br />
<br />
c, multi-language<br />
System -&gt; Administration -&gt; Language support: install English and Chinese<br />
check "input method"<br />
<br />
d, Wen Quan Yi font<br />
browse http://wenq.org/, and download 文泉驿点阵宋体 and 文泉驿矢量正黑, then install them<br />
System -&gt; Preference -&gt; Appearance -&gt; Fonts 前四项选择：点阵宋体（WenQuanYi Bitmap Song）， 第五项不改（Monospace）<br />
sudo fc-cache -f -v (刷新字体缓存，每次修改字体都要这样，不然Xorg会很慢)<br />
<br />
e, stardict&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
sudo apt-get install stardict<br />
(http://stardict.sourceforge.net/Dictionaries_zh_CN.php 下载朗道英汉，汉英字典)<br />
tar -xjvf *** --directory /usr/share/stardict/dic/<br />
<br />
f, pidgin internet messager<br />
sudo apt-get install gaim-guifications<br />
config: Tools -&gt; Plugins -&gt; (check) Guifications; then, config it to uncheck on "Chat message"<br />
<br />
3, install and config Software<br />
sudo apt-get install postgresql-8.1 python2.4 ipython vim-gnome sun-java5-jdk eclipse subversion build-essential ssh build-essential meld kompare<br />
<br />
a, postgresql<br />
sudo su - postgres (for user postgres has Null password, so you can't just "su - postgres", or you can sudo "sudo passwd postgres" to set password for postgres, then "su - postgres")<br />
createuser (enter username and password.)<br />
config postgresql as below:<br />
In /etc/postgresql/8.1/main/postgresql.conf, Change listen_addresses to '*' and change datestyle to 'ISO,European' and uncomment them.<br />
In /etc/postgresql/8.1/main/pg_hba.conf, 最后加入一行&#8220;host&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; all&nbsp;&nbsp;&nbsp; justin&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 127.0.0.1/16&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; trust&#8221;<br />
<br />
b, eclipse<br />
sudo eclipse, exit, eclipse<br />
<br />
c, ssh<br />
When other mathines want to ssh or scp your mathine which is new OS, it should "rm ~/.ssh/known_hosts" to reload the new Cert.<br />
<br />
d, kompare<br />
add a file svndiff in src with context<br />
"""<br />
if [ $1 ] ; then<br />
&nbsp;&nbsp;&nbsp; svn up -r $1<br />
&nbsp;&nbsp;&nbsp; svn st -q<br />
&nbsp;&nbsp;&nbsp; svn log -r $1<br />
&nbsp;&nbsp;&nbsp; PRE=`expr $1 - 1`<br />
&nbsp;&nbsp;&nbsp; svn diff --diff-cmd=diff -x "-U 10000" -r$PRE:$1 &gt; /tmp/$1.diff<br />
&nbsp;&nbsp;&nbsp; cat /tmp/$1.diff | kompare -<br />
else<br />
&nbsp;&nbsp;&nbsp; svn up<br />
&nbsp;&nbsp;&nbsp; svn st<br />
&nbsp;&nbsp;&nbsp; svn diff --diff-cmd=diff -x "-U 10000" | kompare -<br />
fi<br />
"""<br />
then, in src, ./svndiff 9827 will show diff about r9827<br />
<br />
e, firefox add-ons<br />
firebug, flashblock<br />
<br />
3, chroot<br />
a,<br />
sudo apt-get install debootstrap<br />
sudo debootstrap --arch i386 etch /home/etch http://debian.exoweb.net/debian.cn99.com/debian/<br />
(if in 64 bit system, use --arch amd64)<br />
sudo chroot /home/etch<br />
#in etch as root<br />
apt-get install locales<br />
dpkg-reconfigure locales #(choose en_us UTF8 as before)<br />
apt-get install vim vim-gnome xbase-clients less sudo postgresql-client subversion<br />
echo "etch" &gt; /etc/debian-chroot<br />
visudo (add user justin to sudo)<br />
adduser justin (删除的命令是userdel justin)<br />
<br />
在ubuntu的/usr/bin/etch加入：<br />
sudo cp /etc/passwd /home/etch/etc/<br />
sudo cp /etc/shadow /home/etch/etc/<br />
sudo cp /etc/group /home/etch/etc/<br />
sudo cp /etc/sudoers /home/etch/etc/<br />
sudo cp /etc/resolv.conf /home/etch/etc/<br />
sudo cp /etc/hosts /home/etch/etc/<br />
<br />
在/etc/fstab加入：<br />
/home&nbsp;&nbsp; /home/etch/home&nbsp;&nbsp;&nbsp; none&nbsp;&nbsp;&nbsp; bind 0 0<br />
/tmp&nbsp;&nbsp;&nbsp; /home/etch/tmp&nbsp;&nbsp;&nbsp;&nbsp; none&nbsp;&nbsp;&nbsp; bind 0 0<br />
/dev&nbsp;&nbsp;&nbsp; /home/etch/dev&nbsp;&nbsp;&nbsp;&nbsp; none&nbsp;&nbsp;&nbsp; bind 0 0<br />
/proc&nbsp;&nbsp; /home/etch/proc&nbsp;&nbsp;&nbsp; none&nbsp;&nbsp;&nbsp; bind 0 0<br />
sudo chroot /home/etch/&nbsp; su - justin<br />
<br />
现在就可一享受chroot的双系统了<br />
<br />
b, run X in etch 3 steps<br />
b1, (etch)mkdir /tmp/.X11-unix<br />
(ubuntu)sudo echo "/tmp/.X11-unix/x0 /home/justin/etch/tmp/.X11-unix/x0 none bind 0 0" &gt;&gt; /etc/fstab<br />
# another way is write it in to /etc/fstab, or sudo mount --bind /tmp/*** /home/justin/etch/tmp/***<br />
b2, (etch)vim ~/.bashrc # add "export DISPLAY=:0.0"<br />
b3, (ubuntu) cp ~/.Xauthority ~/etch/home/justin/ （其实这步不需要，因为上面已经把/home mount到了/home/etch/home了）<br />
<br />
c, install java<br />
#download jdk-1_5_0_14-linux-i586.bin to /opt/, and into etch/opt/<br />
sudo chmod +x jdk-1_5_0_14-linux-i586.bin<br />
sudo ./jdk-1_5_0_14-linux-i586.bin<br />
vim ~/.bashrc<br />
#add below in the end of .bashrc<br />
#export JAVA_HOME=/opt/jdk1.5.0_14<br />
#export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar<br />
#export PATH=$JAVA_HOME/bin:$PATH<br />
<br />
java -version<br />
#java version "1.5.0_14"<br />
#Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03)<br />
#Java HotSpot(TM) Client VM (build 1.5.0_14-b03, mixed mode, sharing)<br />
<font size="-1">配置默认<font color="#c60a00">Java</font>使用哪个 <font color="#c60a00">sudo</font> update-alternatives --config <font color="#c60a00">java</font></font><br />
<img src ="http://www.blogjava.net/renyangok/aggbug/168813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-12-19 17:29 <a href="http://www.blogjava.net/renyangok/archive/2007/12/19/168813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求两个数或多个数的最大公约数算法及其实现</title><link>http://www.blogjava.net/renyangok/archive/2007/12/15/167956.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Sat, 15 Dec 2007 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/12/15/167956.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/167956.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/12/15/167956.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/167956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/167956.html</trackback:ping><description><![CDATA[一，两个数的最大公约数：<br />
<br />
1、欧几里德算法 <br />
<p style="margin: 5px; line-height: 150%;">
<br />
欧几里德算法又称辗转相除法，用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理： <br />
<br />
定理：gcd(a,b) = gcd(b,a mod b) <br />
<br />
证明：a可以表示成a = kb + r，则r = a mod b <br />
假设d是a,b的一个公约数，则有 <br />
d|a, d|b，而r = a - kb，因此d|r <br />
因此d是(b,a mod b)的公约数 <br />
<br />
假设d 是(b,a mod b)的公约数，则 <br />
d | b , d |r ，但是a = kb +r <br />
因此d也是(a,b)的公约数 <br />
<br />
因此(a,b)和(b,a mod b)的公约数是一样的，其最大公约数也必然相等，得证 <br />
<br />
欧几里德算法就是根据这个原理来做的，其算法用C++语言描述为：</p>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><font face="新宋体"><span style="color: #0000ff;">void</span> <span style="color: #ff0000;">swap</span><span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> <span style="color: #0000cc;">&amp;</span> a<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">int</span> <span style="color: #0000cc;">&amp;</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">int</span> c <span style="color: #0000cc;">=</span> a<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a <span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b <span style="color: #0000cc;">=</span> c<span style="color: #0000cc;">;</span> <br />
<span style="color: #0000cc;">}</span> <br />
<br />
<span style="color: #0000ff;">int</span> gcd<span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> a<span style="color: #0000cc;">,</span><span style="color: #0000ff;">int</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>0 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> a <span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> b<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000cc;">}</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span> 0 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> a<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000cc;">}</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>a <span style="color: #0000cc;">&gt;</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000;">swap</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000cc;">}</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">int</span> c<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">for</span><span style="color: #0000cc;">(</span>c <span style="color: #0000cc;">=</span> a <span style="color: #0000cc;">%</span> b <span style="color: #0000cc;">;</span> c <span style="color: #0000cc;">&gt;</span> 0 <span style="color: #0000cc;">;</span> c <span style="color: #0000cc;">=</span> a <span style="color: #0000cc;">%</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a <span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b <span style="color: #0000cc;">=</span> c<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000cc;">}</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> b<span style="color: #0000cc;">;</span> <br />
<span style="color: #0000cc;">}</span></font></span></code></p>
<p style="margin: 5px; line-height: 150%;">
2、Stein算法 <br />
欧几里德算法是计算两个数最大公约数的传统算法，它无论从理论还是从效率上都是很好的。但是有一个致命的缺陷，这个缺陷只有在大素数时才会显现出来。 <br />
<br />
考虑现在的硬件平台，一般整数最多也就是64位，对于这样的整数，计算两个数之间的模是很简单的。对于字长为32位的平台，计算两个不超过32位的整数的
模，只需要一个指令周期，而计算64位以下的整数模，也不过几个周期而已。但是对于更大的素数，这样的计算过程就不得不由用户来设计，为了计算两个超过
64位的整数的模，用户也许不得不采用类似于多位数除法手算过程中的试商法，这个过程不但复杂，而且消耗了很多CPU时间。对于现代密码算法，要求计算
128位以上的素数的情况比比皆是，设计这样的程序迫切希望能够抛弃除法和取模。 <br />
<br />
Stein算法由J. Stein 1961年提出，这个方法也是计算两个数的最大公约数。和欧几里德算法 算法不同的是，Stein算法只有整数的移位和加减法，这对于程序设计者是一个福音。 <br />
<br />
为了说明Stein算法的正确性，首先必须注意到以下结论： <br />
<br />
gcd(a,a) = a，也就是一个数和它自身的公约数是其自身 <br />
gcd(ka,kb) = k gcd(a,b)，也就是最大公约数运算和倍乘运算可以交换，特殊的，当k=2时，说明两个偶数的最大公约数必然能被2整除 <br />
<br />
C++/java 实现 <br />
<code><span style="color: #000000;"><font face="新宋体"></font></span></code></p>
<p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><font face="新宋体"><span style="color: #ff9900;">// c++/java stein 算法 <br />
</span><span style="color: #0000ff;">int</span> gcd<span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> a<span style="color: #0000cc;">,</span><span style="color: #0000ff;">int</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">&lt;</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span></font><font face="新宋体"><span style="color: #ff9900;">//arrange so that a&gt;b <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">int</span> temp <span style="color: #0000cc;">=</span> a<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a <span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b<span style="color: #0000cc;">=</span>temp<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000cc;">}</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>0<span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>b<span style="color: #0000cc;">)</span></font><font face="新宋体"><span style="color: #ff9900;">//the base case <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> a<span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">%</span>2<span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>0 <span style="color: #0000cc;">&amp;</span><span style="color: #0000cc;">&amp;</span> b<span style="color: #0000cc;">%</span>2 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>0<span style="color: #0000cc;">)</span></font><font face="新宋体"><span style="color: #ff9900;">//a and b are even <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> 2<span style="color: #0000cc;">*</span>gcd<span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span> a<span style="color: #0000cc;">%</span>2 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> 0<span style="color: #0000cc;">)</span></font><font face="新宋体"><span style="color: #ff9900;">// only a is even <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> gcd<span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span> b<span style="color: #0000cc;">%</span>2<span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>0 <span style="color: #0000cc;">)</span></font><font face="新宋体"><span style="color: #ff9900;">// only b is even <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> gcd<span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">return</span> gcd<span style="color: #0000cc;">(</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">+</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">,</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">-</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span></font><font face="新宋体"><span style="color: #ff9900;">// a and b are odd <br />
</span><span style="color: #0000cc;">}</span></font></span></code></p>
二，多个数的最大公约数：(python实现：取出数组a中最小的，从2到最小的循环，找出其中最大的能被数组中所有数整除的那个数，就是最大公约数)<br />
def gcd(a):<br />
&nbsp;&nbsp;&nbsp; a.sort()<br />
&nbsp;&nbsp;&nbsp; min = a[0]<br />
&nbsp;&nbsp;&nbsp; result = 1<br />
&nbsp;&nbsp;&nbsp; for i in range(2, min+1):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag = True<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for j in a:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if j % i != 0:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag = False<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if flag == True:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = i<br />
&nbsp;&nbsp;&nbsp; return result<br />
<img src ="http://www.blogjava.net/renyangok/aggbug/167956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-12-15 15:40 <a href="http://www.blogjava.net/renyangok/archive/2007/12/15/167956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>组合数学－Catalan数</title><link>http://www.blogjava.net/renyangok/archive/2007/11/16/161089.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Fri, 16 Nov 2007 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/11/16/161089.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/161089.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/11/16/161089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/161089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/161089.html</trackback:ping><description><![CDATA[Catalan数：(for http://acm.pku.edu.cn/JudgeOnline/problem?id=2084)<br />
<br />
C_n =
&#931;C_i*C_(n-i)，其中0&#8804;i&lt;n；<br />
C_n = C(2n,n) / (n+1)； 其中C(2n, n) 表示组合数，公式为：C(n, k) = n! / (k!(n-k)!)<br />
C_n=C_(n-1)*(4n-2)/(n+1)。<br />
<br />
它的意义有很多，例如：n+1边形用对角线划分成
三角形的方法数；n个+1和n个-1满足所有部分和不小于零的排列数；具有n个节点的二叉树的数量&#8230;&#8230;<br />
<br />
（详细说明参考：http://hi.baidu.com/kikoqiu/blog/item/81d792015ab13e01738da51d.html）<br />
<img src ="http://www.blogjava.net/renyangok/aggbug/161089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-11-16 18:07 <a href="http://www.blogjava.net/renyangok/archive/2007/11/16/161089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>crontab用法</title><link>http://www.blogjava.net/renyangok/archive/2007/11/02/157783.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Fri, 02 Nov 2007 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/11/02/157783.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/157783.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/11/02/157783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/157783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/157783.html</trackback:ping><description><![CDATA[指令語法<br />
<br />
crontab [ -u user ] file<br />
crontab [ -u user ] { -l | -r | -e }<br />
<br />
指令說明<br />
<br />
crontab 提供我們在固定的間隔時間執行自訂的程式、系統指令或 shell secrip。時間間隔的單位可以是分鐘、小時、日、週、月及以上的任意組合。允許使用者離線執行，並且可以將執行結果以 email 通知使用者。因此，非常設合對週期性的管理分析或資料備份等工作。<br />
<br />
基本上，crontab 的指令格式分為六個部分，前五個為時間間隔，最後則是執行的指令。每一個部分用空格來區隔。<br />
<br />
分 -- 0-59<br />
時 -- 0-23<br />
日 -- 1-31<br />
月 -- 1-12 或使用英文名稱<br />
星期 -- 0-7 或使用英文名稱<br />
工作命令 -- 指令，shell script，程式....(建議使用絕對路徑)<br />
以上是 crontab 的基本格式。<br />
<br />
選項說明<br />
<br />
-u user<br />
以指定的使用者身份，執行 crontab 工作。此選項僅供 root 使用。<br />
<br />
<br />
-l<br />
顯示使用者現行的 crontab 檔。<br />
<br />
-r<br />
移除現行的 crontab 檔。<br />
<br />
-e<br />
進入 vi 編輯 crontab 檔(如有設定 VISUAL 或 EDITOR 環境變數，怎使用該環境變數所設定的編輯器來編輯)。在使用者退出編輯器後，會自動將所編輯 crontab 檔，置入 crontab 執行。<br />
相關檔案<br />
<br />
/etc/cron.allow<br />
/etc/cron.deny<br />
<br />
實例說明<br />
<br />
# crontab -l<br />
# DO NOT EDIT THIS FILE - edit the master and reinstall.<br />
# (/tmp/crontab.3672 installed on Thu Jan 1 15:55:18 2004)<br />
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)<br />
0 0-23/6 * * * /usr/bin/webalizer<br />
30 3 * * * /root/fbin/bak-web<br />
#<br />
<br />
先前曾提到，crontab 的格式分成六個部分，前五個是時間參數。在上例中你會發現除了數字與英文名稱，有使用到符號"*"，這個符號代表每一單位的意思，譬如 30 3 * * * 既代表 30分 3點 每日 每月 星期的每天。<br />
<br />
時間的指定，可以是單一的數字，或幾個數字用逗號來連接。看下例<br />
<br />
30 3,12 * * * /root/fbin/bak-web<br />
<br />
其中的第二項為 3,12，這代表 3 以及 12 小時的意思。再來看下例<br />
<br />
30 */6 * * * /root/fbin/bak-web<br />
<br />
我把第二項改成 */6 這代表每 6 小時，也相當於 6,12,18,24 的作用。此外還有一個區段的做法<br />
<br />
30 8-18/2 * * * /root/fbin/bak-web<br />
<br />
我把第二項改成 8-18/2 這代表在 8 小時到 18 小時之間每 2 小時，也相當於 8,10,12,14,16,18 的作用。<br />
<br />
在認知的以上介紹各項時間用法後，你可以視實際的需要自行組合。使用上的彈性是相當自由的。這篇暫時到此。<br />
<br />
<br />
<img src ="http://www.blogjava.net/renyangok/aggbug/157783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-11-02 16:56 <a href="http://www.blogjava.net/renyangok/archive/2007/11/02/157783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>diff和patch使用指南</title><link>http://www.blogjava.net/renyangok/archive/2007/10/25/155792.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Thu, 25 Oct 2007 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/10/25/155792.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/155792.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/10/25/155792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/155792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/155792.html</trackback:ping><description><![CDATA[<font size="4">(转自：</font>http://blog.chinaunix.net/u/24474/showart_217098.html<font size="4">)<br />
<br />
diff和patch是一对工具，在数学上来说，diff是对两个集合的差运算，patch是对两个集合的和运算。<br />
diff比较两个文件或文件集合的差异，并记录下来，生成一个diff文件，这也是我们常说的patch文件，即补丁文件。<br />
patch能将diff文件运用于 原来的两个集合之一，从而得到另一个集合。举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A -B = C ,那么patch的过程就是B+C = A 或A-C =B。<br />
因此我们只要能得到A, B, C三个文件中的任何两个，就能用diff和patch这对工具生成另外一个文件。<br />
<br />
这就是diff和patch的妙处。下面分别介绍一下两个工具的用法:<br />
<br />
1. diff的用法<br />
<br />
diff后面可以接两个文件名或两个目录名。 如果是一个目录名加一个文件名，那么只作用在那么个目录下的同名文件。<br />
<br />
如果是两个目录的话，作用于该目录下的所有文件，不递归。如果我们希望递归执行，需要使用-r参数。<br />
<br />
命令diff A B &gt; C ,一般A是原始文件，B是修改后的文件，C称为A的补丁文件。<br />
不加任何参数生成的diff文件格式是一种简单的格式，这种格式只标出了不一样的行数和内容。我们需要一种更详细的格式，可以标识出不同之处的上下文环境，这样更有利于提高patch命令的识别能力。这个时候可以用-c开关。<br />
<br />
<br />
2. patch的用法<br />
<br />
patch用于根据原文件和补丁文件生成目标文件。还是拿上个例子来说<br />
<br />
patch A C 就能得到B, 这一步叫做对A打上了B的名字为C的补丁。<br />
<br />
之一步之后，你的文件A就变成了文件B。如果你打完补丁之后想恢复到A怎么办呢？<br />
<br />
patch -R B C 就可以重新还原到A了。<br />
<br />
所以不用担心会失去A的问题。<br />
<br />
其实patch在具体使用的时候是不用指定原文件的，因为补丁文件中都已经记载了原文件的路径和名称。patch足够聪明可以认出来。但是有时候会有点小
问题。比如一般对两个目录diff的时候可能已经包含了原目录的名字，但是我们打补丁的时候会进入到目录中再使用patch,着个时候就需要你告诉
patch命令怎么处理补丁文件中的路径。可以利用-pn开关，告诉patch命令忽略的路径分隔符的个数。举例如下：<br />
<br />
A文件在 DIR_A下，修改后的B文件在DIR_B下，一般DIR_A和DIR_B在同一级目录。我们为了对整个目录下的所有文件一次性diff,我们一般会到DIR_A和DIR_B的父目录下执行以下命令<br />
<br />
diff -rc DIR_A DIR_B &gt; C<br />
<br />
这个时候补丁文件C中会记录了原始文件的路径为 DIR_A/A<br />
<br />
现在另一个用户得到了A文件和C文件，其中A文件所在的目录也是DIR_A。 一般，他会比较喜欢在DIR_A目录下面进行patch操作，它会执行<br />
<br />
patch &lt; C<br />
<br />
但是这个时候patch分析C文件中的记录，认为原始文件是./DIR_A/A，但实际上是./A，此时patch会找不到原始文件。为了避免这种情况我们可以使用-p1参数如下<br />
<br />
patch -p1 &lt; C<br />
<br />
此时，patch会忽略掉第1个&#8221;/&#8221;之前的内容，认为原始文件是 ./A，这样就正确了。<br />
使用patch<br />
<br />
patch附带有一个很好的帮助，其中罗列了很多选项，但是99%的时间只要两个选项就能满足我们的需要：<br />
<br />
patch -p1 &lt; [patchfile]<br />
<br />
patch -R &lt; [patchfile] (used to undo a patch)<br />
<br />
-p1选项代表patchfile中&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件名左边目录的层数，顶层目录在不同的机器上有所不同。要使用这个选项，就要把你的patch放在要被打补丁的目录下，然后在这个目录中运行path -p1 &lt; [patchfile]。</font>
<img src ="http://www.blogjava.net/renyangok/aggbug/155792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-10-25 10:22 <a href="http://www.blogjava.net/renyangok/archive/2007/10/25/155792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK1.4引入的新特性之一--断言（assert）</title><link>http://www.blogjava.net/renyangok/archive/2007/10/12/152316.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Fri, 12 Oct 2007 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/10/12/152316.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/152316.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/10/12/152316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/152316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/152316.html</trackback:ping><description><![CDATA[<div><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;"><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">断言概述</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">编写代码时，我们总是会做出一些假设，断言就是用于在代码中捕捉这些假设<span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
可以将断言看作是异常处理的一种高级形式</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言表示为一些布尔表达式，程序员相信在程序中的某个特定点该表达式值为真</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以在任何时候启用和禁用断言验证，因此可以在测试时启用断言而在部署时禁用断言。同样，程序投入运行后，最终用户在遇到问题时可以重新起用断言。</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言可以创建更稳定，品质更好且易于除错的代码</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">当需要在一个值为</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">FALSE</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">时中断当前操作的话，可以使用断言</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">单元测试必须使用断言（</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Junit/JunitX</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">）</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">除了类型检查和单元测试外，断言还提供了一种确定个种特性是否在程序中得到维护的极好的方法</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言使我们向按契约式设计更近了一步</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
<br />
</span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">常见的断言特性</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">前置条件断言：代码执行之前必须具备的特性</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">后置条件断言：代码执行之后必须具备的特性</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">前后不变断言：代码执行前后不能变化的特性</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
<br />
</span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">断言使用方式</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言可以有两种形式</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">1.assert Expression1 <br />
2.assert Expression1:Expression2 <br />
</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">其中</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Expression1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">应该总是一个布尔值，</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Expression2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是断言失败时输出的失败消息的字符串。如果</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Expression1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">为假，则抛出一个</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">，这是一个错误，而不是一个异常，也就是说是一个不可控制异常（</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">unchecked Exception),AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">由于是错误，所以可以不捕获，但不推荐这样做，因为那样会使你的系统进入不稳定状态。</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
<br />
</span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">起用断言</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
</span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言在默认情况下是关闭的，要在编译时启用断言，需要使用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">source1.4</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">标记</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">既</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">javac source1.4 Test.java ,</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">在运行时启用断言需要使用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -ea</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">参数</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">。要在系统类中启用和禁用断言可以使用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -esa </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">和</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -dsa</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">参数。</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">例如：</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">public &gt;&nbsp; public AssertExampleOne(){} <br />
&nbsp; public static void main(String args[]){ <br />
&nbsp;&nbsp;&nbsp; int x=10; <br />
&nbsp;&nbsp;&nbsp; System.out.println("Testing Assertion that x==100"); <br />
&nbsp;&nbsp;&nbsp; assert x=100;"Out assertion failed!"; <br />
&nbsp;&nbsp;&nbsp; System.out.println("Test passed!"); <br />
&nbsp; } <br />
} <br />
<br />
</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">如果编译时未加</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -source1.4,</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">则编译通不过</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">在执行时未加</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -ea </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">时输出为</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">Testing Assertion that x==100 <br />
Test passed <br />
jre</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">忽略了断言的就代码，而使用了该参数就会输出为</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">Testing Assertion that x==100 <br />
Exception in thread "main" java.lang.AssertionError: Out assertion failed! <br />
at AssertExampleOne.main(AssertExampleOne.java:6) <br />
<br />
<br />
</span></span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">断言的副作用</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
</span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">由于程序员的问题，断言的使用可能会带来副作用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">，例如：</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">boolean isEnable=false; <br />
//... <br />
assert isEnable=true; <br />
</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">这个断言的副作用是因为它修改了程序中变量的值并且未抛出错误，这样的错误如果不细心的检查是很难发现的。但是同时我们可以根据以上的副作用得到一个有用的特性，根据它来测试断言是否打开。</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
<span style="color: #9370db;">public &gt;<br />
&nbsp; public static void main(String args[]){ <br />
&nbsp;&nbsp;&nbsp; boolean isEnable=false; <br />
&nbsp;&nbsp;&nbsp; //... <br />
&nbsp;&nbsp;&nbsp; assert isEnable=true; <br />
&nbsp;&nbsp;&nbsp; if(isEnable==false){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException("Assertion shoule be enable!"); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp; } <br />
} <br />
<br />
<br />
</span></span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">何时需要使用断言</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
<span style="color: #9370db;">1.</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以在预计正常情况下程序不会到达的地方放置断言</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">：</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert false <br />
2.</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言可以用于检查传递给私有方法的参数。（对于公有方法，因为是提供给外部的接口，所以必须在方法中有相应的参数检验才能保证代码的健壮性）</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">3.</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言测试方法执行的前置条件和后置条件</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">4.</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言检查类的不变状态，确保任何情况下，某个变量的状态必须满足。（如</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">age</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">属性应大于</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">0</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">小于某个合适值）</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
<br />
</span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">什么地方不要使用断言</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言语句不是永远会执行，可以屏蔽也可以启用</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">因此：</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">1.</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">不要使用断言作为公共方法的参数检查，公共方法的参数永远都要执行</span></span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">2.</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言语句不可以有任何边界效应，不要使用断言语句去修改变量和改变方法的返回值</span><br />
<br />
下边是介绍断言的用法</span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;"><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">:</span></span><br />
<br />
assert<span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是在</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">J2SE1.4</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">中引入的新特性，</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assertion</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">就是在代码中包括的布尔型状态，程序员认为这个状态是</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">true</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">。一般来说</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">在开发的时候是检查程序的安全性的，在发布的时候通常都不使用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">。在</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">1.4</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">中添加了</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">关键字和</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">java.lang.AssertError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">类的支持。</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">首先，我们有必要从一个例子说起</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert <br />
<br />
public &gt;&nbsp; public static void main(String[] args) { <br />
&nbsp;&nbsp;&nbsp; AssertTest at = new AssertTest(); <br />
&nbsp;&nbsp;&nbsp; at.assertMe(true); <br />
&nbsp;&nbsp;&nbsp; at.assertMe(false); <br />
&nbsp; }&nbsp;<br />
&nbsp; private void assertMe(boolean boo) { <br />
&nbsp;&nbsp;&nbsp; assert boo?true:false; <br />
&nbsp;&nbsp;&nbsp; System.out.println("true condition"); <br />
&nbsp; } <br />
} <br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">程序中包含了</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的话，你要用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">javac -source 1.4 xxx.java</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来编译，否则编译器会报错的。要想让</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得部分运行的话，要使用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">java -ea xxx</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来运行，否则包含</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得行会被忽略。下面我们运行</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">javac -source 1.4 AssertTest.java <br />
java -ea AssertTest <br />
</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">看看结果的输出是：</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
<span style="color: #9370db;">true condition <br />
Exception in thread "main" java.lang.AssertionError <br />
at AssertTest.assertMe(AssertTest.java:13) <br />
at AssertTest.main(AssertTest.java:7) <br />
<br />
</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">当我们运行</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">at.assertMe(true)</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得时候，由于</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert boo?true:false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">相当于</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> assert true;</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">因此没有任何问题，程序往下执行打印出</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">true condition</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">，但是执行</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">at.assertMe(false)</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的时候相当于</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">，这个时候解释器就会抛出</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">了，程序就终止了。大家必须清楚</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是继承自</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Error</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得，因此你可以不再程序中</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">catch</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">它的，当然你也可以在程序中</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">catch</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">它然后程序可以继续执行。例如：</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">public &gt;&nbsp; public static void main(String[] args) { <br />
&nbsp;&nbsp;&nbsp; AssertTest at = new AssertTest(); <br />
&nbsp;&nbsp;&nbsp; try { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at.assertMe(true); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at.assertMe(false); <br />
&nbsp;&nbsp;&nbsp; } catch(AssertionError ae) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("AsseriontError catched"); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; System.out.println("go on"); <br />
&nbsp; } <br />
&nbsp; private void assertMe(boolean boo) { <br />
&nbsp;&nbsp;&nbsp; assert boo?true:false; <br />
&nbsp;&nbsp;&nbsp; System.out.println("true condition"); <br />
&nbsp; } <br />
} <br />
<br />
assert</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">还有另外一种表达的方式，就是</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert exp1:exp2;</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">其中</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是个</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">boolean</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">返回值得表达式，而</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以是原始的数据类型或者对象都可以例如：</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">boolean boo = true; <br />
String str = null; <br />
assert boo = false</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">：</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">str="error"; <br />
<br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">我们刚开始讲得</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得形式，当</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得时候，</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得默认构造器会被调用，但是</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert exp1:exp2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">这样的形式，当</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">为</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">true</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的时候后面</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">被或略，如果</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的话，后面的表达式的结果会被计算出来并作为</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得构造器参数。看下面的例子：</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">public &gt;&nbsp; public static void main(String[] args) { <br />
&nbsp;&nbsp;&nbsp; AssertTest at = new AssertTest(); <br />
&nbsp;&nbsp;&nbsp; at.assertMe(true); <br />
&nbsp;&nbsp;&nbsp; at.assertMe(false); <br />
&nbsp; } <br />
&nbsp; private void assertMe(boolean boo) { <br />
&nbsp;&nbsp;&nbsp; String s = null; <br />
&nbsp;&nbsp;&nbsp; assert boo?true:false:s = "hello world"; <br />
&nbsp;&nbsp;&nbsp; System.out.println("true condition"); <br />
&nbsp; } <br />
}</span><br />
<br />
运行的时候会得到这样的结果:</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<span style="color: #9370db;">true condition <br />
Exception in thread "main" java.lang.AssertionError: hello world <br />
at AssertTest.assertMe(AssertTest.java:14) <br />
at AssertTest.main(AssertTest.java:7) <br />
<br />
Assert</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">最好不要滥用，原因是</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">并不一定都是</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">enable</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的，下面两种情况就不应该用</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert <br />
<br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">不要在</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">public</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的方法里面检查参数是不是为</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">null</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">之类的操作，</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">例如<br />
<br />
public int get(String s) { <br />
&nbsp; assert s != null; <br />
} <br />
</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">如果需要检查也最好通过</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">if s = null </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">抛出</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">NullPointerException</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来检查</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br />
<br />
不要用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来检查方法操作的返回值来判断方法操作的结果，</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">例如<br />
<br />
assert list.removeAll();<br />
<br />
这样看起来好像没有问题</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">但是想想如果</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">被</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">disable</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">呢，那样他就不会被执行了</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">所以</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">removeAll()</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">操作就没有被执行</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以这样代替</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> <br />
boolean boo = list.removeAl(); <br />
assert boo;</span></div>
<span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">
<span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">
</span></span></span></span>
<img src ="http://www.blogjava.net/renyangok/aggbug/152316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-10-12 13:16 <a href="http://www.blogjava.net/renyangok/archive/2007/10/12/152316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python学习笔记</title><link>http://www.blogjava.net/renyangok/archive/2007/09/02/142080.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Sun, 02 Sep 2007 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/09/02/142080.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/142080.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/09/02/142080.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/142080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/142080.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Python基础篇整理：Jims of 肥肥世家&lt;jims.yang@gmail.com&gt;Copyright &#169; 2004，2005，2006 本文遵从GNU 的自由文档许可证(Free Document License)的条款，欢迎转载、修改、散布。发布时间：2004年07月10日更新时间：20...&nbsp;&nbsp;<a href='http://www.blogjava.net/renyangok/archive/2007/09/02/142080.html'>阅读全文</a><img src ="http://www.blogjava.net/renyangok/aggbug/142080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-09-02 16:18 <a href="http://www.blogjava.net/renyangok/archive/2007/09/02/142080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.bash_profile和.bashrc的区别</title><link>http://www.blogjava.net/renyangok/archive/2007/07/16/130504.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Mon, 16 Jul 2007 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/07/16/130504.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/130504.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/07/16/130504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/130504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/130504.html</trackback:ping><description><![CDATA[<font size="2">/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.<br>
<br>
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.<br>
<br>
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.<br>
<br>
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.<br>
<br>
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件. <br>
<br>
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.<br>
<br>
~/.bash_profile 是交互式、login 方式进入 bash 运行的<br>
<br>
~/.bashrc 是交互式 non-login 方式进入 bash 运行的<br>
<br>
通常二者设置大致相同，所以通常前者会调用后者。</font><img src ="http://www.blogjava.net/renyangok/aggbug/130504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-07-16 10:52 <a href="http://www.blogjava.net/renyangok/archive/2007/07/16/130504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>