﻿<?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-磨刀不误砍柴工-文章分类-Java</title><link>http://www.blogjava.net/weiwei/category/53448.html</link><description>合抱之木，生于毫末；九层之台，起于累土；千里之行，始于足下。</description><language>zh-cn</language><lastBuildDate>Sat, 12 Oct 2013 06:29:56 GMT</lastBuildDate><pubDate>Sat, 12 Oct 2013 06:29:56 GMT</pubDate><ttl>60</ttl><item><title>JAVA垃圾回收</title><link>http://www.blogjava.net/weiwei/articles/404814.html</link><dc:creator>liwei5891</dc:creator><author>liwei5891</author><pubDate>Wed, 09 Oct 2013 13:35:00 GMT</pubDate><guid>http://www.blogjava.net/weiwei/articles/404814.html</guid><wfw:comment>http://www.blogjava.net/weiwei/comments/404814.html</wfw:comment><comments>http://www.blogjava.net/weiwei/articles/404814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weiwei/comments/commentRss/404814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weiwei/services/trackbacks/404814.html</trackback:ping><description><![CDATA[<div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">哪些内存需要回收？</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">什么时候回收？</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">如何回收？</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">一：哪些内存需要回收？</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">JAVA内存中不需要考虑内存回收问题的区域：</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">程序计数器、虚拟机栈，本地方法栈</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">（随线程生灭，栈帧分配多少内存在类结构确定是就已知，因此它们的内存分配与回收具备确定性。方法结束或线程结束时，内存自然就跟着回收了）</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">需要考虑内存回收问题的区域：</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">JAVA堆和方法区</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">(创建哪些对象，创建多少对象，需要在运行期间才知道。不再用创建对象的类定义要从方法区回收)</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">二：堆中对象的回收</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">死去的对象才会被回收</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">如何判断对象已死</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">a.引用计数算法：</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">给对象添加一个引用计数器，每当有一个地方引用它时，计数器值就加1。引用失效时，计数器值就减1.任何时候计数器为0的对象就是不可能再被使用的。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">优点：引用计数算法实现简单，判定效率也高。(使用在COM,FlashPlayer,Python等语言中)</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">缺点：它很难解决对象之间相互循环引用的问题。（因此JAVA中没有选用它来管理内存）</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">b.根搜索算法</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">对于任何"GC Roots"都没有路径到达对象时，该对象就是不可用的。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">主流的程序语言都用的是根搜索算法，包括JAVA语言。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">哪些对象才是"GC　Roots"</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"><ul style="margin: 0.2857em 0px 0.714285em 2em; padding: 0px; border: 0px; line-height: 1.428571em; list-style-position: outside;"><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">虚拟机栈(栈帧中的本地变量表)中引用的对象</li><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">方法区中的类静态属性引用的对象</li><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">方法区中的常量引用的对象</li><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">本地方法栈中JNI的引用的对象</li></ul><div style="margin: 0px; border: 0px; line-height: 1.428571em;">JAVA中的引用分为：强引用（Strong Reference）、软引用（Soft Reference）、弱引用（Weak Reference）、虚引用（Phantom Reference）四种，强度依次减弱</div></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"><ul style="margin: 0.2857em 0px 0.714285em 2em; padding: 0px; border: 0px; line-height: 1.428571em; list-style-position: outside;"><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">强引用：代码中存在，类似 "Object obj = new Object()"这类。只要强引用存在，GC就永远不会回收掉被引用的对象。</li><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">软引用：描述一些还有用，但非必需的对象。在系统将要发生内存溢出异常之前，将把这些对象列进回范围之中并进行第二次回收。如果这次回收还没有足够的内存，才会抛出内存溢出异常。通过 SoftReference类来实现软引用。</li><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">弱引用：也用于描述非必需对象，但它的强度要比软引用更弱一些，被弱引用关联的对象只能生成到下一次GC发生之前。当GC工作时，无论当前内存是否足够，都会回收弱引用关联的对象。通过 WeakReference类来实现弱引用</li><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">虚引用：也称为幽灵引用或幻影引用。设置虚引用关联的唯一目录就是希望这个对象被回收时收到一个系统通知。通过PhantomReference来实现虚引用</li></ul></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">究竟什么样的对象才会死掉呢？</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">要真正宣告一个对象死亡，<strong style="line-height: 1.428571em;">至少要经历两次标记过程</strong>：如果对象在进行根搜索后发现没有与 GC Roots 相连接的引用链，那它将会被第一次标记并放到&#8220;即将被回收的集合&#8221;中。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">与此同时进行一次筛选，筛选的条件是此对象是否有必要执行 finalize() 方法。(当对象没有覆盖 finalize()方法，或者 finalize() 方法已经被虚拟机调用过，虚拟机将这两种情况都视为 "没有必要执行"。)如果这个对象被判定为有必要执行 finalize()方法，那么这个对象将会被放置到一个名为 F-Queue 的队列之中，将在稍后由一条由虚拟机自动建立的，低优先级的 Finalizer 线程去执行（触发finalize()方法而不等待）。finalize()方法是对象逃脱死亡命运的最后一次机会。对象要在finalize()方法中拯救自己，只要重新与引用链上任何一个对象建立关联即可，这样的话第二次标记时它被移除出&#8220;即将回收的集合&#8221;。如果对象这个时候还没有逃脱，那就真的离死不远了。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">三：方法区的回收</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">主要回收两部份内容：废弃常量、无用的类</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">常量回收与堆中对象回收类似。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">无用的类的判断需同时满足3条：</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"><ul style="margin: 0.2857em 0px 0.714285em 2em; padding: 0px; border: 0px; line-height: 1.428571em; list-style-position: outside;"><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">该类所有的实例都已经被回收，也就是说堆中不存在该类的任何实例</li><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">加载该类的 ClassLoader 已经被回收</li><li style="margin: 0px; padding: 0px; border: 0px; line-height: 1.428571em;">该类对应的 java.lang.Class 对象没有在任何地方被引用，无法在任何地方通过反射访问该类的方法</li></ul></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">虚拟机对满足上述3个条件的无用类进行回收。（只是可以，不会是必然回收）是否对类进行回收，HotSpot虚拟机了 -Xnoclassgc参数进行控制。还可以使用 -verbose:class 及-XX:+TraceClassLoading 和 -XX:+TraceClassUnLoading查看类的加载和卸载信息。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">四：垃圾收集算法</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">4.1 标记-清除算法</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">标记出所有需要回收的对象，标记完成后统一回收掉所有被标记的对象。（如何标记在堆对象回收部分有介绍）</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">它是最基础的收集算法，后续收集算法都是基于这种思路改进而得到。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">缺点：效率不高，产生大量不连续的内存碎片。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">（空间碎片太多，分配较大对象时就无法找到足够连续内存空间，而不得不提前触发另一次垃圾收集动作）</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">4.2 复制算法</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">（为解决效率问题）</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">将内存按容量划分为大小相等的两块，每次只使用其中的一块。当这一块内存用完了，就将还存活着的对象复制到另一块上面，然后再把已使用过的内存空间一次清理掉。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">优点：内存分配时不用考虑碎片的问题，实现简单，运行高效</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">缺点：内存缩小为原来的一半。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">当对象存活率较高时，需要较多的复制操作，效率将会变低。若不想浪费50%的空间，需要额外的空间进行分配担保</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">现在的商业虚拟机都采用这种收集算法来回收新生代(IBM研究表明，新生代对象98%是朝夕死的)。不过，并不是按1：1的比例来划分内存空间。而是将内存分为一块较大的 Eden 空间 和两块较小的Survivor空间。每次只使用 Eden 和其中的一块Survivor。当回收时，将Eden和Survivor中还存活着的对象一次性拷贝到另外一块Survivor空间上，最后清理掉刚才的Eden和Survivor。默认Eden和Survivor比例是 8:1。（98%是一般场景，另外一些场景下，当Survivor空间不够时，需依赖其它内存【老年代】进行分配担保）</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">4.3 标记-整理算法</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">复制算法的缺点，决定老年代不能使用复制算法</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">根据老年代特点，提出了&#8220;标记-整理算法&#8221;。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">标记过程仍然与&#8220;标记-清除&#8221;算法一样，但后续步骤不是直接对可回收对象进行清理，而是让所有存活的对象都向一端移动，然后直接清理掉端边界以外的内存。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">4.4 分代收集算法</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">当前虚拟机的垃圾收集都采用&#8220;分代收集&#8221;算法。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">根据对象的存活周期将内存划分为几块。一般将堆分为新生代和老年代，这样根据各个年代的特点采用最适当的收集算法。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">新生代采用复制算法</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">老年代采用&#8220;标记-清理&#8221;或&#8220;标记-整理&#8221;算法</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">五：垃圾收集器</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">算法是内存回收的方法论，垃圾收集器是内存回收的具体实现。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"><img src="https://app.yinxiang.com/shard/s4/res/ef7b3d87-efb5-4410-9d09-c6ab86c98857.png?resizeSmall&amp;width=700" alt="" name="ef7b3d87-efb5-4410-9d09-c6ab86c98857" data-mce-src="https://app.yinxiang.com/shard/s4/res/ef7b3d87-efb5-4410-9d09-c6ab86c98857.png?resizeSmall&amp;width=700" data-mce-style="cursor: default;" style="margin: 0.857412em 0px 0px; padding: 0px; border: 0px; cursor: default;" /></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">Serial收集器</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">缺点：单线程收集器，垃圾收集时必须暂停其它所有的工作线程（Stop the world）。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">优点：简单而高效，对于Client模式下的虚拟机来说是一个很好的选择。（也是Client模式下的默认新生代收集器）</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">ParNew 收集器</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">其实就是 Serial 收集器的多线程版本</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">是Server模式下的虚拟机的首选新生代收集器。（一个重要原因是，目前除了Serial收集器外，只有它能与CMS收集器配合工作）</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">Paraller Scavenge 收集器</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">并行的多线程收集器</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">它的关注点与其它收集器的不同，它关注的是吞吐量</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">吞吐量=运行用户代码时间/(运用用户代码时间+垃圾收集时间)</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">Serial Old 收集器</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">是Serial收集器的老年代版本，同样是单线程收集器。使用&#8220;标记-整理&#8221;算法</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">Parallel Old 收集器</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">是Parallel Scavenge收集器的老年代版本，使用多线和和&#8220;标记-整理算法&#8221;，JDK1.6才提供。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">注重吞吐量及CPU资源敏感的场合，可以优先考虑Parallel Scavenge加Parallel Old组合。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">CMS收集器 （Concurrent Mark Sweep）</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">是一种以获取最短回收停顿时间为目标的收集器。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">对于B/S类重视服务器响应速度，希望停顿时间最短类应用就比较适合。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">基于&#8220;标记-清除算法实现&#8221;</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">内存回收过程与用户线程起并发的执行。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">缺点：</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">对CPU资源非常敏感。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">无法处理浮动垃圾</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">收集结束时会产生大量空间碎片</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">G1收集器（Garbage First）`</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">JDK1.7正式发布时，很可能会有一个成熟的商业版本随之发布。</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">相对CMS的改进：</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">基于&#8220;标记-整理&#8221;算法实现，不会产生空间碎片</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">可以非常精确的控制停顿</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;">可以实现基本不牺牲吞吐量的前提下完成低停顿的内存回收</div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><div style="margin: 0px; border: 0px; line-height: 1.428571em; font-family: Helvetica, Arial, 'Droid Sans', sans-serif;"></div><img src ="http://www.blogjava.net/weiwei/aggbug/404814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weiwei/" target="_blank">liwei5891</a> 2013-10-09 21:35 <a href="http://www.blogjava.net/weiwei/articles/404814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Enum简单例子</title><link>http://www.blogjava.net/weiwei/articles/342916.html</link><dc:creator>liwei5891</dc:creator><author>liwei5891</author><pubDate>Thu, 13 Jan 2011 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/weiwei/articles/342916.html</guid><wfw:comment>http://www.blogjava.net/weiwei/comments/342916.html</wfw:comment><comments>http://www.blogjava.net/weiwei/articles/342916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weiwei/comments/commentRss/342916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weiwei/services/trackbacks/342916.html</trackback:ping><description><![CDATA[Enum<br /><br /><div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.study.enums;<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">enum</span><span style="color: #000000">&nbsp;SexEnum&nbsp;{<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;FEMAIL(</span><span style="color: #000000">"</span><span style="color: #000000">00</span><span style="color: #000000">"</span><span style="color: #000000">),<br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;MAIL(</span><span style="color: #000000">"</span><span style="color: #000000">01</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;value;<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;SexEnum(String&nbsp;value)&nbsp;{<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.value&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getValue(){<br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;value;<br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;SexEnum&nbsp;fromValue(String&nbsp;value){<br /></span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SexEnum[]&nbsp;enums&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SexEnum.values();<br /></span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(enums</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">){<br /></span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(SexEnum&nbsp;item:enums){<br /></span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(item.getValue().equals(value))<br /></span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;item;<br /></span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br /></span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000"></span></div><br /><div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.study.enums;<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;junit.framework.Assert;<br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.junit.Test;<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SexEnumTest&nbsp;{<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;@Test<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;testGetValue()&nbsp;{<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(SexEnum.FEMAIL.getValue());<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(SexEnum.MAIL.getValue());<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(SexEnum.fromValue(</span><span style="color: #000000">"</span><span style="color: #000000">00</span><span style="color: #000000">"</span><span style="color: #000000">).getValue());<br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(SexEnum.fromValue(</span><span style="color: #000000">"</span><span style="color: #000000">01</span><span style="color: #000000">"</span><span style="color: #000000">).getValue());<br /></span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals(SexEnum.FEMAIL,&nbsp;SexEnum.fromValue(</span><span style="color: #000000">"</span><span style="color: #000000">00</span><span style="color: #000000">"</span><span style="color: #000000">));<br /></span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.assertEquals(SexEnum.MAIL,&nbsp;SexEnum.fromValue(</span><span style="color: #000000">"</span><span style="color: #000000">01</span><span style="color: #000000">"</span><span style="color: #000000">));<br /></span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000"></span></div><br /><br />结果：<br /><br />00<br />01<br />00<br />01<br /><br /><br /><img src ="http://www.blogjava.net/weiwei/aggbug/342916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weiwei/" target="_blank">liwei5891</a> 2011-01-13 11:47 <a href="http://www.blogjava.net/weiwei/articles/342916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中只有传值</title><link>http://www.blogjava.net/weiwei/articles/319207.html</link><dc:creator>liwei5891</dc:creator><author>liwei5891</author><pubDate>Fri, 23 Apr 2010 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/weiwei/articles/319207.html</guid><wfw:comment>http://www.blogjava.net/weiwei/comments/319207.html</wfw:comment><comments>http://www.blogjava.net/weiwei/articles/319207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weiwei/comments/commentRss/319207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weiwei/services/trackbacks/319207.html</trackback:ping><description><![CDATA[java中只有传值<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">package&nbsp;sinosoft;<br /><br />import&nbsp;org.junit.Test;<br /><br />public&nbsp;class&nbsp;PassValueTest&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;运行结果是<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;Hello&nbsp;World!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hi&nbsp;World!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello&nbsp;World!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要理解这点，就要理解在Java中只有传值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于参数传递，如果是简单数据类型，那么它传递的是值拷贝，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于类的实例它传递的是类的引用的拷贝<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对类来说：引用与引用的拷贝都指向对象的同一个内存块，因此对引用操作，引响的是同一个对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但像chang方法中，对引用的拷贝重新赋给一个对象，那就与原先对象无关了。自然不会影响到原先对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;@Test<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;test(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;bf&nbsp;=&nbsp;new&nbsp;StringBuffer("Hello&nbsp;World!");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(bf.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change(bf);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(bf.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;change(StringBuffer&nbsp;bf){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bf&nbsp;=&nbsp;new&nbsp;StringBuffer("hi");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bf.append("&nbsp;World!");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(bf.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /></span></div><img src ="http://www.blogjava.net/weiwei/aggbug/319207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weiwei/" target="_blank">liwei5891</a> 2010-04-23 17:12 <a href="http://www.blogjava.net/weiwei/articles/319207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用BigDecimal精确计算</title><link>http://www.blogjava.net/weiwei/articles/310919.html</link><dc:creator>liwei5891</dc:creator><author>liwei5891</author><pubDate>Wed, 27 Jan 2010 04:06:00 GMT</pubDate><guid>http://www.blogjava.net/weiwei/articles/310919.html</guid><wfw:comment>http://www.blogjava.net/weiwei/comments/310919.html</wfw:comment><comments>http://www.blogjava.net/weiwei/articles/310919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weiwei/comments/commentRss/310919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weiwei/services/trackbacks/310919.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="2" width="743" border="0">
				<tbody>
						<tr>
								<td valign="top" width="741">
										<p>Java 浮点数精确计算 BigDecimal的用法 </p>
										<p>java.math.BigDecimal的用法？ </p>
										<p>Java 浮点数 精确计算&nbsp;&nbsp; </p>
										<p>如果我们编译运行下面这个程序会看到什么？ </p>
										<p>public class Test{ </p>
										<p>&nbsp;&nbsp;&nbsp; public static void main(String args[]){ </p>
										<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(0.05+0.01); </p>
										<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(1.0-0.42); </p>
										<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(4.015*100); </p>
										<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(123.3/100); </p>
										<p>&nbsp;&nbsp;&nbsp; } </p>
										<p>}; </p>
										<p>你没有看错！结果确实是 </p>
										<p>0.060000000000000005 </p>
										<p>0.5800000000000001 </p>
										<p>401.49999999999994 </p>
										<p>1.2329999999999999 </p>
										<p>Java中的简单浮点数类型float和double不能够进行运算。不光是Java，在其它很多编程语言中也有这样的问题。在大多数情况下，计算的结果是准确的，但是多试几次（可以做一个循环）就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。 </p>
										<p>这个问题相当严重，如果你有9.999999999999元，你的计算机是不会认为你可以购买10元的商品的。 </p>
										<p>在有的编程语言中提供了专门的货币类型来处理这种情况，但是Java没有。现在让我们看看如何解决这个问题。 </p>
										<p>四舍五入 </p>
										<p>我们的第一个反应是做四舍五入。Math类中的round方法不能设置保留几位小数，我们只能象这样（保留两位）： </p>
										<p>public double round(double value){ </p>
										<p>&nbsp;&nbsp;&nbsp; return Math.round(value*100)/100.0; </p>
										<p>} </p>
										<p>非常不幸，上面的代码并不能正常工作，给这个方法传入4.015它将返回4.01而不是4.02，如我们在上面看到的 </p>
										<p>4.015*100=401.49999999999994 </p>
										<p>因此如果我们要做到精确的四舍五入，不能利用简单类型做任何运算 </p>
										<p>java.text.DecimalFormat也不能解决这个问题： </p>
										<p>System.out.println(new java.text.DecimalFormat("0.00").format(4.025)); </p>
										<p>输出是4.02 </p>
										<p>BigDecimal </p>
										<p>在《Effective Java》这本书中也提到这个原则，float和double只能用来做科学计算或者是工程计算，在商业计算中我们要用 java.math.BigDecimal。BigDecimal一共有4个够造方法，我们不关心用BigInteger来够造的那两个，那么还有两个，它们是： </p>
										<p>BigDecimal(double val) </p>
										<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Translates a double into a BigDecimal. </p>
										<p>BigDecimal(String val) </p>
										<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Translates the String repre sentation of a BigDecimal into a BigDecimal. </p>
										<p>上面的API简要描述相当的明确，而且通常情况下，上面的那一个使用起来要方便一些。我们可能想都不想就用上了，会有什么问题呢？等到出了问题的时候，才发现上面哪个够造方法的详细说明中有这么一段： </p>
										<p>Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding. </p>
										<p>The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one. </p>
										<p>原来我们如果需要精确计算，非要用String来够造BigDecimal不可！在《Effective Java》一书中的例子是用String来够造BigDecimal的，但是书上却没有强调这一点，这也许是一个小小的失误吧。 </p>
										<p>解决方案 </p>
										<p>现在我们已经可以解决这个问题了，原则是使用BigDecimal并且一定要用String来够造。 </p>
										<p>但是想像一下吧，如果我们要做一个加法运算，需要先将两个浮点数转为String，然后够造成BigDecimal，在其中一个上调用add方法，传入另一个作为参数，然后把运算的结果（BigDecimal）再转换为浮点数。你能够忍受这么烦琐的过程吗？下面我们提供一个工具类Arith来简化操作。它提供以下静态方法，包括加减乘除和四舍五入： </p>
										<p>public static double add(double v1,double v2) </p>
										<p>public static double sub(double v1,double v2) </p>
										<p>public static double mul(double v1,double v2) </p>
										<p>public static double div(double v1,double v2) </p>
										<p>public static double div(double v1,double v2,int scale) </p>
										<p>public static double round(double v,int scale) </p>
										<p>附录 </p>
										<p>&nbsp;<span style="font-family: 'Courier New'; font-size: 13px; line-height: 21px;"></span><img id="Code_Closed_Image_210027" onclick="this.style.display='none'; Code_Closed_Text_210027.style.display='none'; Code_Open_Image_210027.style.display='inline'; Code_Open_Text_210027.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" style="font-size: 13px; line-height: 21px;"></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><img id="Code_Open_Image_210027" style="display: none" onclick="this.style.display='none'; Code_Open_Text_210027.style.display='none'; Code_Closed_Image_210027.style.display='inline'; Code_Closed_Text_210027.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span id="Code_Closed_Text_210027" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"></span><span id="Code_Open_Text_210027" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #008000; ">*&nbsp;由于Java的简单类型不能够精确的对浮点数进行运算，这个工具类提供精<br /></span><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #008000; ">*&nbsp;确的浮点数运算，包括加减乘除和四舍五入。<br /></span><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;publicclass&nbsp;Arith{<br /><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">默认除法运算精度privatestaticfinalint&nbsp;DEF_DIV_SCALE&nbsp;=&nbsp;10;<br /></span><span style="color: #008080; ">&nbsp;11</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;12</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">这个类不能实例化private&nbsp;Arith(){</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #008000; "></span><br /><span style="color: #008080; ">&nbsp;14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;15</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;17</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;18</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;提供精确的加法运算。<br /></span><span style="color: #008080; ">&nbsp;19</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;20</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v1&nbsp;被加数<br /></span><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v2&nbsp;加数<br /></span><span style="color: #008080; ">&nbsp;23</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;24</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;两个参数的和<br /></span><span style="color: #008080; ">&nbsp;25</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;26</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>publicstaticdouble&nbsp;add(<span style="color: #0000FF; ">double</span>&nbsp;v1,<span style="color: #0000FF; ">double</span>&nbsp;v2){<br /><span style="color: #008080; ">&nbsp;27</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BigDecimal(Double.toString(v1));<br /><span style="color: #008080; ">&nbsp;29</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BigDecimal(Double.toString(v2));<br /><span style="color: #008080; ">&nbsp;31</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;b1.add(b2).doubleValue();<br /><span style="color: #008080; ">&nbsp;33</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;35</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;37</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;38</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;提供精确的减法运算。<br /></span><span style="color: #008080; ">&nbsp;39</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;40</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v1&nbsp;被减数<br /></span><span style="color: #008080; ">&nbsp;41</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;42</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v2&nbsp;减数<br /></span><span style="color: #008080; ">&nbsp;43</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;44</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;两个参数的差<br /></span><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;46</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>publicstaticdouble&nbsp;sub(<span style="color: #0000FF; ">double</span>&nbsp;v1,<span style="color: #0000FF; ">double</span>&nbsp;v2){<br /><span style="color: #008080; ">&nbsp;47</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BigDecimal(Double.toString(v1));<br /><span style="color: #008080; ">&nbsp;49</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BigDecimal(Double.toString(v2));<br /><span style="color: #008080; ">&nbsp;51</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;b1.subtract(b2).doubleValue();<br /><span style="color: #008080; ">&nbsp;53</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;55</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;57</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;58</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;提供精确的乘法运算。<br /></span><span style="color: #008080; ">&nbsp;59</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;60</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v1&nbsp;被乘数<br /></span><span style="color: #008080; ">&nbsp;61</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;62</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v2&nbsp;乘数<br /></span><span style="color: #008080; ">&nbsp;63</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;64</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;两个参数的积<br /></span><span style="color: #008080; ">&nbsp;65</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;66</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>publicstaticdouble&nbsp;mul(<span style="color: #0000FF; ">double</span>&nbsp;v1,<span style="color: #0000FF; ">double</span>&nbsp;v2){<br /><span style="color: #008080; ">&nbsp;67</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BigDecimal(Double.toString(v1));<br /><span style="color: #008080; ">&nbsp;69</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BigDecimal(Double.toString(v2));<br /><span style="color: #008080; ">&nbsp;71</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;b1.multiply(b2).doubleValue();<br /><span style="color: #008080; ">&nbsp;73</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;75</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;77</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;78</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;提供（相对）精确的除法运算，当发生除不尽的情况时，精确到<br /></span><span style="color: #008080; ">&nbsp;79</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;80</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;小数点以后10位，以后的数字四舍五入。<br /></span><span style="color: #008080; ">&nbsp;81</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;82</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v1&nbsp;被除数<br /></span><span style="color: #008080; ">&nbsp;83</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;84</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v2&nbsp;除数<br /></span><span style="color: #008080; ">&nbsp;85</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;86</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;两个参数的商<br /></span><span style="color: #008080; ">&nbsp;87</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;88</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>publicstaticdouble&nbsp;div(<span style="color: #0000FF; ">double</span>&nbsp;v1,<span style="color: #0000FF; ">double</span>&nbsp;v2){<br /><span style="color: #008080; ">&nbsp;89</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;90</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;div(v1,v2,DEF_DIV_SCALE);<br /><span style="color: #008080; ">&nbsp;91</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;92</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;93</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;94</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;95</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;96</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指<br /></span><span style="color: #008080; ">&nbsp;97</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;98</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;定精度，以后的数字四舍五入。<br /></span><span style="color: #008080; ">&nbsp;99</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">100</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v1&nbsp;被除数<br /></span><span style="color: #008080; ">101</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">102</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v2&nbsp;除数<br /></span><span style="color: #008080; ">103</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">104</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;scale&nbsp;表示表示需要精确到小数点以后几位。<br /></span><span style="color: #008080; ">105</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">106</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;两个参数的商<br /></span><span style="color: #008080; ">107</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">108</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>publicstaticdouble&nbsp;div(<span style="color: #0000FF; ">double</span>&nbsp;v1,<span style="color: #0000FF; ">double</span>&nbsp;v2,<span style="color: #0000FF; ">int</span>&nbsp;scale){<br /><span style="color: #008080; ">109</span>&nbsp;<br /><span style="color: #008080; ">110</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(scale&lt;0){<br /><span style="color: #008080; ">111</span>&nbsp;<br /><span style="color: #008080; ">112</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thrownew&nbsp;IllegalArgumentException(<br /><span style="color: #008080; ">113</span>&nbsp;<br /><span style="color: #008080; ">114</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"The&nbsp;scale&nbsp;must&nbsp;be&nbsp;a&nbsp;positive&nbsp;integer&nbsp;or&nbsp;zero");<br /><span style="color: #008080; ">115</span>&nbsp;<br /><span style="color: #008080; ">116</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">117</span>&nbsp;<br /><span style="color: #008080; ">118</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BigDecimal(Double.toString(v1));<br /><span style="color: #008080; ">119</span>&nbsp;<br /><span style="color: #008080; ">120</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BigDecimal(Double.toString(v2));<br /><span style="color: #008080; ">121</span>&nbsp;<br /><span style="color: #008080; ">122</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();<br /><span style="color: #008080; ">123</span>&nbsp;<br /><span style="color: #008080; ">124</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">125</span>&nbsp;<br /><span style="color: #008080; ">126</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">127</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">128</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;提供精确的小数位四舍五入处理。<br /></span><span style="color: #008080; ">129</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">130</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;v&nbsp;需要四舍五入的数字<br /></span><span style="color: #008080; ">131</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">132</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;scale&nbsp;小数点后保留几位<br /></span><span style="color: #008080; ">133</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">134</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;四舍五入后的结果<br /></span><span style="color: #008080; ">135</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">136</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>publicstaticdouble&nbsp;round(<span style="color: #0000FF; ">double</span>&nbsp;v,<span style="color: #0000FF; ">int</span>&nbsp;scale){<br /><span style="color: #008080; ">137</span>&nbsp;<br /><span style="color: #008080; ">138</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(scale&lt;0){<br /><span style="color: #008080; ">139</span>&nbsp;<br /><span style="color: #008080; ">140</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thrownew&nbsp;IllegalArgumentException(<br /><span style="color: #008080; ">141</span>&nbsp;<br /><span style="color: #008080; ">142</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"The&nbsp;scale&nbsp;must&nbsp;be&nbsp;a&nbsp;positive&nbsp;integer&nbsp;or&nbsp;zero");<br /><span style="color: #008080; ">143</span>&nbsp;<br /><span style="color: #008080; ">144</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">145</span>&nbsp;<br /><span style="color: #008080; ">146</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BigDecimal(Double.toString(v));<br /><span style="color: #008080; ">147</span>&nbsp;<br /><span style="color: #008080; ">148</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;one&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BigDecimal("1");<br /><span style="color: #008080; ">149</span>&nbsp;<br /><span style="color: #008080; ">150</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();<br /><span style="color: #008080; ">151</span>&nbsp;<br /><span style="color: #008080; ">152</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">153</span>&nbsp;<br /><span style="color: #008080; ">154</span>&nbsp;</span></div>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<p>&nbsp;</p>
		<table cellspacing="0" cellpadding="2" width="744" border="0">
				<tbody>
						<tr>
								<td valign="top" width="742">
										<h5>
												<a href="http://langhua9527.javaeye.com/blog/430022">BigDecimal舍入模式(Rounding mode)</a>
										</h5>关键字: bigdecimal 
<p>ROUND_CEILING <br />Rounding mode to round towards positive infinity. <br />向正无穷方向舍入 <br />ROUND_DOWN <br />Rounding mode to round towards zero. <br />向零方向舍入 <br />ROUND_FLOOR <br />Rounding mode to round towards negative infinity. <br />向负无穷方向舍入 <br />ROUND_HALF_DOWN<br />Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. <br />向（距离）最近的一边舍入，除非两边（的距离）是相等,如果是这样，向下舍入, 例如1.55 保留一位小数结果为1.5 <br />ROUND_HALF_EVEN <br />Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. <br />向（距离）最近的一边舍入，除非两边（的距离）是相等,如果是这样，如果保留位数是奇数，使用ROUND_HALF_UP ，如果是偶数，使用ROUND_HALF_DOWN <br />ROUND_HALF_UP <br />Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. <br />向（距离）最近的一边舍入，除非两边（的距离）是相等,如果是这样，向上舍入, 1.55保留一位小数结果为1.6 <br />ROUND_UNNECESSARY <br />Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. <br />计算结果是精确的，不需要舍入模式 <br />ROUND_UP <br />Rounding mode to round away from zero. <br />向远离0的方向舍入 <br />例子 
</p><p>Java代码 
</p><ol><li>BigDecimal n3&nbsp; = new BigDecimal(1.2345678901234567890E+9);&nbsp;&nbsp; </li><li>System.out.println(n3)&nbsp; </li></ol><pre>BigDecimal n3  = new BigDecimal(1.2345678901234567890E+9);
System.out.println(n3)</pre><br />这样输出的结果是:1234567890.1234567165374755859375 <br />当到了后面17位之后就开始不准确了 <br />因Double类型本身只能精确到17位 <br />但是如果这样 
<p>Java代码 
</p><ol><li>BigDecimal n4&nbsp; = new BigDecimal("1.23456789012345678901234567890E+9");&nbsp; </li></ol><pre>BigDecimal n4  = new BigDecimal("1.23456789012345678901234567890E+9");
</pre><br />结果是1234567891.12345678901234567890 <br />这样就能绝对精确 </td>
						</tr>
				</tbody>
		</table><img src ="http://www.blogjava.net/weiwei/aggbug/310919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weiwei/" target="_blank">liwei5891</a> 2010-01-27 12:06 <a href="http://www.blogjava.net/weiwei/articles/310919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java日期处理</title><link>http://www.blogjava.net/weiwei/articles/280809.html</link><dc:creator>liwei5891</dc:creator><author>liwei5891</author><pubDate>Tue, 09 Jun 2009 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/weiwei/articles/280809.html</guid><wfw:comment>http://www.blogjava.net/weiwei/comments/280809.html</wfw:comment><comments>http://www.blogjava.net/weiwei/articles/280809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weiwei/comments/commentRss/280809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weiwei/services/trackbacks/280809.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;">
				<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
				<span style="color: #0000ff;">工具类：<br />
package</span>
				<span style="color: #000000;">&nbsp;com.power.date;<br /><br /></span>
				<span style="color: #0000ff;">import</span>
				<span style="color: #000000;">&nbsp;java.text.ParseException;<br /></span>
				<span style="color: #0000ff;">import</span>
				<span style="color: #000000;">&nbsp;java.text.SimpleDateFormat;<br /></span>
				<span style="color: #0000ff;">import</span>
				<span style="color: #000000;">&nbsp;java.util.Calendar;<br /></span>
				<span style="color: #0000ff;">import</span>
				<span style="color: #000000;">&nbsp;java.util.Date;<br /><br /></span>
				<span style="color: #0000ff;">public</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">class</span>
				<span style="color: #000000;">&nbsp;DateUtils&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #008000;">/**</span>
				<span style="color: #008000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;格式化日期<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;date<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;pattern<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@return</span>
				<span style="color: #008000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #008000;">*/</span>
				<span style="color: #000000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">public</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">static</span>
				<span style="color: #000000;">&nbsp;String&nbsp;format(Date&nbsp;date,String&nbsp;pattern){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;format&nbsp;</span>
				<span style="color: #000000;">=</span>
				<span style="color: #000000;">&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">new</span>
				<span style="color: #000000;">&nbsp;SimpleDateFormat(pattern);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">return</span>
				<span style="color: #000000;">&nbsp;format.format(date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #008000;">/**</span>
				<span style="color: #008000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;根据字符串生成日期<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;dateStr<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;pattern<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@return</span>
				<span style="color: #008000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@throws</span>
				<span style="color: #008000;">&nbsp;ParseException<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #008000;">*/</span>
				<span style="color: #000000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">public</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">static</span>
				<span style="color: #000000;">&nbsp;Date&nbsp;parse(String&nbsp;dateStr,String&nbsp;pattern)&nbsp;</span>
				<span style="color: #0000ff;">throws</span>
				<span style="color: #000000;">&nbsp;ParseException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;format&nbsp;</span>
				<span style="color: #000000;">=</span>
				<span style="color: #000000;">&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">new</span>
				<span style="color: #000000;">&nbsp;SimpleDateFormat(pattern);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">return</span>
				<span style="color: #000000;">&nbsp;format.parse(dateStr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #008000;">/**</span>
				<span style="color: #008000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;比较日期前后<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;date&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;when&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@return</span>
				<span style="color: #008000;">&nbsp;date在when之前，返回false,否则返回true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #008000;">*/</span>
				<span style="color: #000000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">public</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">static</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">boolean</span>
				<span style="color: #000000;">&nbsp;after(Date&nbsp;date,Date&nbsp;when){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">return</span>
				<span style="color: #000000;">&nbsp;date.after(when);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #008000;">/**</span>
				<span style="color: #008000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;添加(或减小)时间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;date<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;field&nbsp;要添加(或减小)的字段(年或月或日或<img src="http://www.blogjava.net/images/dot.gif" alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;amount&nbsp;要添加(或减小)的数量，amount为正数时，是添加，为负数时是减小<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@return</span>
				<span style="color: #008000;">&nbsp;日期<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #008000;">*/</span>
				<span style="color: #000000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">public</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">static</span>
				<span style="color: #000000;">&nbsp;Date&nbsp;add(Date&nbsp;date,</span>
				<span style="color: #0000ff;">int</span>
				<span style="color: #000000;">&nbsp;field,</span>
				<span style="color: #0000ff;">int</span>
				<span style="color: #000000;">&nbsp;amount){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;ca&nbsp;</span>
				<span style="color: #000000;">=</span>
				<span style="color: #000000;">&nbsp;Calendar.getInstance();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ca.setTime(date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ca.add(field,&nbsp;amount);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">return</span>
				<span style="color: #000000;">&nbsp;ca.getTime();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #008000;">/**</span>
				<span style="color: #008000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;添加(或减小)时间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;date<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;field&nbsp;要添加(或减小)的字段(年或月或日或<img src="http://www.blogjava.net/images/dot.gif" alt="" />)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;amount&nbsp;要添加(或减小)的数量，amount为正数时，是添加，为负数时是减小<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@param</span>
				<span style="color: #008000;">&nbsp;pattern&nbsp;格式化模式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
				<span style="color: #808080;">@return</span>
				<span style="color: #008000;">&nbsp;格式化后的日期字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #008000;">*/</span>
				<span style="color: #000000;">
						<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">public</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">static</span>
				<span style="color: #000000;">&nbsp;String&nbsp;add(Date&nbsp;date,</span>
				<span style="color: #0000ff;">int</span>
				<span style="color: #000000;">&nbsp;field,</span>
				<span style="color: #0000ff;">int</span>
				<span style="color: #000000;">&nbsp;amount,String&nbsp;pattern){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;ca&nbsp;</span>
				<span style="color: #000000;">=</span>
				<span style="color: #000000;">&nbsp;Calendar.getInstance();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ca.setTime(date);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ca.add(field,&nbsp;amount);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">return</span>
				<span style="color: #000000;">&nbsp;format(ca.getTime(),pattern);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">public</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">class</span>
				<span style="color: #000000;">&nbsp;DatePattern{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">public</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">static</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">final</span>
				<span style="color: #000000;">&nbsp;String&nbsp;Y_M_D</span>
				<span style="color: #000000;">=</span>
				<span style="color: #000000;">"</span>
				<span style="color: #000000;">yyyy-MM-dd</span>
				<span style="color: #000000;">"</span>
				<span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
				<span style="color: #0000ff;">public</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">static</span>
				<span style="color: #000000;">&nbsp;</span>
				<span style="color: #0000ff;">final</span>
				<span style="color: #000000;">&nbsp;String&nbsp;Y_M_D_H_M_S</span>
				<span style="color: #000000;">=</span>
				<span style="color: #000000;">"</span>
				<span style="color: #000000;">yyyy-MM-dd&nbsp;HH:mm:ss</span>
				<span style="color: #000000;">"</span>
				<span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br /><br />
测试类：<br /><br /><br /></span>
				<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;">
						<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
						<span style="color: #008000;">/**</span>
						<span style="color: #008000;">
								<br />
&nbsp;*&nbsp;<br />
&nbsp;</span>
						<span style="color: #008000;">*/</span>
						<span style="color: #000000;">
								<br />
						</span>
						<span style="color: #0000ff;">package</span>
						<span style="color: #000000;">&nbsp;com.power.date;<br /><br /></span>
						<span style="color: #0000ff;">import</span>
						<span style="color: #000000;">&nbsp;java.text.ParseException;<br /></span>
						<span style="color: #0000ff;">import</span>
						<span style="color: #000000;">&nbsp;java.util.Calendar;<br /></span>
						<span style="color: #0000ff;">import</span>
						<span style="color: #000000;">&nbsp;java.util.Date;<br /><br /></span>
						<span style="color: #0000ff;">import</span>
						<span style="color: #000000;">&nbsp;org.junit.Test;<br /></span>
						<span style="color: #0000ff;">import</span>
						<span style="color: #000000;">&nbsp;</span>
						<span style="color: #0000ff;">static</span>
						<span style="color: #000000;">&nbsp;junit.framework.Assert.</span>
						<span style="color: #000000;">*</span>
						<span style="color: #000000;">;<br /><br /></span>
						<span style="color: #008000;">/**</span>
						<span style="color: #008000;">
								<br />
&nbsp;*&nbsp;</span>
						<span style="color: #808080;">@author</span>
						<span style="color: #008000;">&nbsp;liwei<br />
&nbsp;*<br />
&nbsp;</span>
						<span style="color: #008000;">*/</span>
						<span style="color: #000000;">
								<br />
						</span>
						<span style="color: #0000ff;">public</span>
						<span style="color: #000000;">&nbsp;</span>
						<span style="color: #0000ff;">class</span>
						<span style="color: #000000;">&nbsp;TestDateUtils&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Test<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
						<span style="color: #0000ff;">public</span>
						<span style="color: #000000;">&nbsp;</span>
						<span style="color: #0000ff;">void</span>
						<span style="color: #000000;">&nbsp;testFormat(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;now&nbsp;</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">&nbsp;</span>
						<span style="color: #0000ff;">new</span>
						<span style="color: #000000;">&nbsp;Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(DateUtils.format(now,&nbsp;DateUtils.DatePattern.Y_M_D));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(DateUtils.format(now,&nbsp;DateUtils.DatePattern.Y_M_D_H_M_S));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Test<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
						<span style="color: #0000ff;">public</span>
						<span style="color: #000000;">&nbsp;</span>
						<span style="color: #0000ff;">void</span>
						<span style="color: #000000;">&nbsp;testParse()&nbsp;</span>
						<span style="color: #0000ff;">throws</span>
						<span style="color: #000000;">&nbsp;ParseException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;dateStr</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">2009-06-09</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">&nbsp;DateUtils.parse(dateStr,&nbsp;DateUtils.DatePattern.Y_M_D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(DateUtils.format(date,&nbsp;DateUtils.DatePattern.Y_M_D));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dateStr</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">2009-06-09&nbsp;10:14:57</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date2&nbsp;</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">&nbsp;DateUtils.parse(dateStr,&nbsp;DateUtils.DatePattern.Y_M_D_H_M_S);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(DateUtils.format(date2,&nbsp;DateUtils.DatePattern.Y_M_D_H_M_S));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Test&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
						<span style="color: #0000ff;">public</span>
						<span style="color: #000000;">&nbsp;</span>
						<span style="color: #0000ff;">void</span>
						<span style="color: #000000;">&nbsp;testAfter()&nbsp;</span>
						<span style="color: #0000ff;">throws</span>
						<span style="color: #000000;">&nbsp;ParseException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;dateStr</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">2009-06-09</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">&nbsp;DateUtils.parse(dateStr,&nbsp;DateUtils.DatePattern.Y_M_D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;now&nbsp;</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">&nbsp;</span>
						<span style="color: #0000ff;">new</span>
						<span style="color: #000000;">&nbsp;Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertTrue(DateUtils.after(now,&nbsp;date));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Test&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span>
						<span style="color: #0000ff;">public</span>
						<span style="color: #000000;">&nbsp;</span>
						<span style="color: #0000ff;">void</span>
						<span style="color: #000000;">&nbsp;testAdd()&nbsp;</span>
						<span style="color: #0000ff;">throws</span>
						<span style="color: #000000;">&nbsp;ParseException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;dateStr</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">2009-06-09</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">&nbsp;DateUtils.parse(dateStr,&nbsp;DateUtils.DatePattern.Y_M_D);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date2</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">&nbsp;DateUtils.add(date,&nbsp;Calendar.MONDAY,&nbsp;</span>
						<span style="color: #000000;">6</span>
						<span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">2009-12-09</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">,&nbsp;DateUtils.format(date2,&nbsp;DateUtils.DatePattern.Y_M_D));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">2009-12-09</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">,&nbsp;DateUtils.add(date,Calendar.MONDAY,</span>
						<span style="color: #000000;">6</span>
						<span style="color: #000000;">,DateUtils.DatePattern.Y_M_D));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date2&nbsp;</span>
						<span style="color: #000000;">=</span>
						<span style="color: #000000;">&nbsp;DateUtils.add(date,&nbsp;Calendar.MONTH,&nbsp;</span>
						<span style="color: #000000;">-</span>
						<span style="color: #000000;">2</span>
						<span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">2009-04-09</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">,&nbsp;DateUtils.format(date2,&nbsp;DateUtils.DatePattern.Y_M_D));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">2009-04-09</span>
						<span style="color: #000000;">"</span>
						<span style="color: #000000;">,&nbsp;DateUtils.add(date,Calendar.MONDAY,</span>
						<span style="color: #000000;">-</span>
						<span style="color: #000000;">2</span>
						<span style="color: #000000;">,DateUtils.DatePattern.Y_M_D));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br /></span>
				</div>
				<br />
		</div><img src ="http://www.blogjava.net/weiwei/aggbug/280809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weiwei/" target="_blank">liwei5891</a> 2009-06-09 11:13 <a href="http://www.blogjava.net/weiwei/articles/280809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>