﻿<?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/leekiang/category/21757.html</link><description>MDA/MDD/TDD/DDD/DDDDDDD</description><language>zh-cn</language><lastBuildDate>Thu, 28 Sep 2017 20:29:58 GMT</lastBuildDate><pubDate>Thu, 28 Sep 2017 20:29:58 GMT</pubDate><ttl>60</ttl><item><title>java8国际化直接支持的语言列表</title><link>http://www.blogjava.net/leekiang/archive/2017/09/27/432836.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 27 Sep 2017 12:17:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2017/09/27/432836.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/432836.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2017/09/27/432836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/432836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/432836.html</trackback:ping><description><![CDATA[<div><pre style="font-family: Menlo; font-size: 9pt; background-color: #ffffff;">System.<span style="color:#660e7a;font-weight:bold;font-style:italic;">out</span>.println(<span style="color:#008000;font-weight:bold;">"availableLocales :"</span>+  Locale.<span style="font-style:italic;">getAvailableLocales</span>().<span style="color:#660e7a;font-weight:bold;">length</span>);<br /><br />Locale[] arr=Locale.<span style="font-style:italic;">getAvailableLocales</span>();<br /> Arrays.<span style="font-style:italic;">sort</span>(arr, <span style="color:#000080;font-weight:bold;">new </span><span style="background-color:#7ea9ff;">Comparator</span>&lt;Locale&gt;() {<br />    <span style="color:#808000;">@Override<br /></span> <span style="color:#000080;font-weight:bold;">public int </span>compare(Locale o1, Locale o2) {<br />        <span style="color:#000080;font-weight:bold;">return </span>o1.getLanguage().compareTo(o2.getLanguage());<br />    }<br />});<br /><br /><span style="color:#000080;font-weight:bold;">for</span>(Locale l:arr){<br />    System.<span style="color:#660e7a;font-weight:bold;font-style:italic;">out</span>.println(<span style="color:#008000;font-weight:bold;">"语言:"</span>+  l.getLanguage()+<span style="color:#008000;font-weight:bold;">" 名称:"</span>+l.getDisplayLanguage()<br />            +(StringUtils.<span style="font-style:italic;">isEmpty</span>(l.getDisplayCountry())?<span style="color:#008000;font-weight:bold;">""</span>:(<span style="color:#008000;font-weight:bold;">" 国家:"</span>+ l.getDisplayCountry())) + <span style="color:#008000;font-weight:bold;">" "</span>+l.toString());<br />}</pre>输出如下<br />availableLocales :160</div><div>语言: 名称:</div><div>语言:ar 名称:阿拉伯文 国家:阿拉伯联合酋长国 ar_AE</div><div>语言:ar 名称:阿拉伯文 国家:约旦 ar_JO</div><div>语言:ar 名称:阿拉伯文 国家:叙利亚 ar_SY</div><div>语言:ar 名称:阿拉伯文 国家:巴林 ar_BH</div><div>语言:ar 名称:阿拉伯文 国家:沙特阿拉伯 ar_SA</div><div>语言:ar 名称:阿拉伯文 国家:也门 ar_YE</div><div>语言:ar 名称:阿拉伯文 国家:埃及 ar_EG</div><div>语言:ar 名称:阿拉伯文 国家:苏丹 ar_SD</div><div>语言:ar 名称:阿拉伯文 国家:突尼斯 ar_TN</div><div>语言:ar 名称:阿拉伯文 国家:伊拉克 ar_IQ</div><div>语言:ar 名称:阿拉伯文 国家:摩洛哥 ar_MA</div><div>语言:ar 名称:阿拉伯文 国家:卡塔尔 ar_QA</div><div>语言:ar 名称:阿拉伯文 国家:阿曼 ar_OM</div><div>语言:ar 名称:阿拉伯文 ar</div><div>语言:ar 名称:阿拉伯文 国家:科威特 ar_KW</div><div>语言:ar 名称:阿拉伯文 国家:利比亚 ar_LY</div><div>语言:ar 名称:阿拉伯文 国家:阿尔及利亚 ar_DZ</div><div>语言:ar 名称:阿拉伯文 国家:黎巴嫩 ar_LB</div><div>语言:be 名称:白俄罗斯文 be</div><div>语言:be 名称:白俄罗斯文 国家:白俄罗斯 be_BY</div><div>语言:bg 名称:保加利亚文 bg</div><div>语言:bg 名称:保加利亚文 国家:保加利亚 bg_BG</div><div>语言:ca 名称:加泰罗尼亚文 国家:西班牙 ca_ES</div><div>语言:ca 名称:加泰罗尼亚文 ca</div><div>语言:cs 名称:捷克文 cs</div><div>语言:cs 名称:捷克文 国家:捷克共和国 cs_CZ</div><div>语言:da 名称:丹麦文 国家:丹麦 da_DK</div><div>语言:da 名称:丹麦文 da</div><div>语言:de 名称:德文 de</div><div>语言:de 名称:德文 国家:瑞士 de_CH</div><div>语言:de 名称:德文 国家:奥地利 de_AT</div><div>语言:de 名称:德文 国家:卢森堡 de_LU</div><div>语言:de 名称:德文 国家:德国 de_DE</div><div>语言:de 名称:德文 国家:希腊 de_GR</div><div>语言:el 名称:希腊文 el</div><div>语言:el 名称:希腊文 国家:塞浦路斯 el_CY</div><div>语言:el 名称:希腊文 国家:希腊 el_GR</div><div>语言:en 名称:英文 国家:美国 en_US</div><div>语言:en 名称:英文 国家:新加坡 en_SG</div><div>语言:en 名称:英文 国家:马耳他 en_MT</div><div>语言:en 名称:英文 en</div><div>语言:en 名称:英文 国家:菲律宾 en_PH</div><div>语言:en 名称:英文 国家:新西兰 en_NZ</div><div>语言:en 名称:英文 国家:南非 en_ZA</div><div>语言:en 名称:英文 国家:澳大利亚 en_AU</div><div>语言:en 名称:英文 国家:爱尔兰 en_IE</div><div>语言:en 名称:英文 国家:加拿大 en_CA</div><div>语言:en 名称:英文 国家:印度 en_IN</div><div>语言:en 名称:英文 国家:英国 en_GB</div><div>语言:es 名称:西班牙文 国家:巴拿马 es_PA</div><div>语言:es 名称:西班牙文 国家:委内瑞拉 es_VE</div><div>语言:es 名称:西班牙文 国家:波多黎哥 es_PR</div><div>语言:es 名称:西班牙文 国家:玻利维亚 es_BO</div><div>语言:es 名称:西班牙文 国家:阿根廷 es_AR</div><div>语言:es 名称:西班牙文 国家:萨尔瓦多 es_SV</div><div>语言:es 名称:西班牙文 es</div><div>语言:es 名称:西班牙文 国家:西班牙 es_ES</div><div>语言:es 名称:西班牙文 国家:哥伦比亚 es_CO</div><div>语言:es 名称:西班牙文 国家:巴拉圭 es_PY</div><div>语言:es 名称:西班牙文 国家:厄瓜多尔 es_EC</div><div>语言:es 名称:西班牙文 国家:美国 es_US</div><div>语言:es 名称:西班牙文 国家:危地马拉 es_GT</div><div>语言:es 名称:西班牙文 国家:墨西哥 es_MX</div><div>语言:es 名称:西班牙文 国家:洪都拉斯 es_HN</div><div>语言:es 名称:西班牙文 国家:智利 es_CL</div><div>语言:es 名称:西班牙文 国家:多米尼加共和国 es_DO</div><div>语言:es 名称:西班牙文 国家:古巴 es_CU</div><div>语言:es 名称:西班牙文 国家:乌拉圭 es_UY</div><div>语言:es 名称:西班牙文 国家:哥斯达黎加 es_CR</div><div>语言:es 名称:西班牙文 国家:尼加拉瓜 es_NI</div><div>语言:es 名称:西班牙文 国家:秘鲁 es_PE</div><div>语言:et 名称:爱沙尼亚文 et</div><div>语言:et 名称:爱沙尼亚文 国家:爱沙尼亚 et_EE</div><div>语言:fi 名称:芬兰文 国家:芬兰 fi_FI</div><div>语言:fi 名称:芬兰文 fi</div><div>语言:fr 名称:法文 国家:比利时 fr_BE</div><div>语言:fr 名称:法文 国家:瑞士 fr_CH</div><div>语言:fr 名称:法文 fr</div><div>语言:fr 名称:法文 国家:卢森堡 fr_LU</div><div>语言:fr 名称:法文 国家:法国 fr_FR</div><div>语言:fr 名称:法文 国家:加拿大 fr_CA</div><div>语言:ga 名称:爱尔兰文 ga</div><div>语言:ga 名称:爱尔兰文 国家:爱尔兰 ga_IE</div><div>语言:hi 名称:印地文 国家:印度 hi_IN</div><div>语言:hi 名称:印地文 hi</div><div>语言:hr 名称:克罗地亚文 国家:克罗地亚 hr_HR</div><div>语言:hr 名称:克罗地亚文 hr</div><div>语言:hu 名称:匈牙利文 hu</div><div>语言:hu 名称:匈牙利文 国家:匈牙利 hu_HU</div><div>语言:in 名称:印度尼西亚文 in</div><div>语言:in 名称:印度尼西亚文 国家:印度尼西亚 in_ID</div><div>语言:is 名称:冰岛文 国家:冰岛 is_IS</div><div>语言:is 名称:冰岛文 is</div><div>语言:it 名称:意大利文 it</div><div>语言:it 名称:意大利文 国家:瑞士 it_CH</div><div>语言:it 名称:意大利文 国家:意大利 it_IT</div><div>语言:iw 名称:希伯来文 国家:以色列 iw_IL</div><div>语言:iw 名称:希伯来文 iw</div><div>语言:ja 名称:日文 国家:日本 ja_JP_JP_#u-ca-japanese</div><div>语言:ja 名称:日文 ja</div><div>语言:ja 名称:日文 国家:日本 ja_JP</div><div>语言:ko 名称:朝鲜文 ko</div><div>语言:ko 名称:朝鲜文 国家:韩国 ko_KR</div><div>语言:lt 名称:立陶宛文 lt</div><div>语言:lt 名称:立陶宛文 国家:立陶宛 lt_LT</div><div>语言:lv 名称:拉托维亚文(列托) lv</div><div>语言:lv 名称:拉托维亚文(列托) 国家:拉脱维亚 lv_LV</div><div>语言:mk 名称:马其顿文 mk</div><div>语言:mk 名称:马其顿文 国家:马其顿王国 mk_MK</div><div>语言:ms 名称:马来文 国家:马来西亚 ms_MY</div><div>语言:ms 名称:马来文 ms</div><div>语言:mt 名称:马耳他文 国家:马耳他 mt_MT</div><div>语言:mt 名称:马耳他文 mt</div><div>语言:nl 名称:荷兰文 nl</div><div>语言:nl 名称:荷兰文 国家:荷兰 nl_NL</div><div>语言:nl 名称:荷兰文 国家:比利时 nl_BE</div><div>语言:no 名称:挪威文 国家:挪威 no_NO_NY</div><div>语言:no 名称:挪威文 国家:挪威 no_NO</div><div>语言:no 名称:挪威文 no</div><div>语言:pl 名称:波兰文 国家:波兰 pl_PL</div><div>语言:pl 名称:波兰文 pl</div><div>语言:pt 名称:葡萄牙文 pt</div><div>语言:pt 名称:葡萄牙文 国家:巴西 pt_BR</div><div>语言:pt 名称:葡萄牙文 国家:葡萄牙 pt_PT</div><div>语言:ro 名称:罗马尼亚文 国家:罗马尼亚 ro_RO</div><div>语言:ro 名称:罗马尼亚文 ro</div><div>语言:ru 名称:俄文 国家:俄罗斯 ru_RU</div><div>语言:ru 名称:俄文 ru</div><div>语言:sk 名称:斯洛伐克文 sk</div><div>语言:sk 名称:斯洛伐克文 国家:斯洛伐克 sk_SK</div><div>语言:sl 名称:斯洛文尼亚文 sl</div><div>语言:sl 名称:斯洛文尼亚文 国家:斯洛文尼亚 sl_SI</div><div>语言:sq 名称:阿尔巴尼亚文 sq</div><div>语言:sq 名称:阿尔巴尼亚文 国家:阿尔巴尼亚 sq_AL</div><div>语言:sr 名称:塞尔维亚文 国家:黑山 sr_ME</div><div>语言:sr 名称:塞尔维亚文 国家:波斯尼亚和黑山共和国 sr_BA_#Latn</div><div>语言:sr 名称:塞尔维亚文 国家:塞尔维亚及黑山 sr_CS</div><div>语言:sr 名称:塞尔维亚文 国家:波斯尼亚和黑山共和国 sr_BA</div><div>语言:sr 名称:塞尔维亚文 国家:黑山 sr_ME_#Latn</div><div>语言:sr 名称:塞尔维亚文 sr__#Latn</div><div>语言:sr 名称:塞尔维亚文 国家:塞尔维亚 sr_RS</div><div>语言:sr 名称:塞尔维亚文 sr</div><div>语言:sr 名称:塞尔维亚文 国家:塞尔维亚 sr_RS_#Latn</div><div>语言:sv 名称:瑞典文 国家:瑞典 sv_SE</div><div>语言:sv 名称:瑞典文 sv</div><div>语言:th 名称:泰文 国家:泰国 th_TH</div><div>语言:th 名称:泰文 th</div><div>语言:th 名称:泰文 国家:泰国 th_TH_TH_#u-nu-thai</div><div>语言:tr 名称:土耳其文 tr</div><div>语言:tr 名称:土耳其文 国家:土耳其 tr_TR</div><div>语言:uk 名称:乌克兰文 uk</div><div>语言:uk 名称:乌克兰文 国家:乌克兰 uk_UA</div><div>语言:vi 名称:越南文 国家:越南 vi_VN</div><div>语言:vi 名称:越南文 vi</div><div>语言:zh 名称:中文 国家:台湾地区 zh_TW</div><div>语言:zh 名称:中文 国家:香港 zh_HK</div><div>语言:zh 名称:中文 国家:新加坡 zh_SG</div><div>语言:zh 名称:中文 国家:中国 zh_CN</div><div>语言:zh 名称:中文 zh</div><img src ="http://www.blogjava.net/leekiang/aggbug/432836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2017-09-27 20:17 <a href="http://www.blogjava.net/leekiang/archive/2017/09/27/432836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何用 Java 获取系统 IP？</title><link>http://www.blogjava.net/leekiang/archive/2015/03/02/423120.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 01 Mar 2015 22:29:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2015/03/02/423120.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/423120.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2015/03/02/423120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/423120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/423120.html</trackback:ping><description><![CDATA[参考dubbo里的NetUtils类<br /><br />import java.net.InetAddress;<br />import java.net.NetworkInterface;<br />import java.util.Enumeration;<br />import java.util.regex.Pattern;<br /><br />public class GetIP {<br />public static void main(String[] args) {<br />System.out.println(GetIP.getLocalAddress0().getHostAddress());<br />}<br />public static InetAddress getLocalAddress0() {<br />        InetAddress localAddress = null;<br />        try {<br />            localAddress = InetAddress.getLocalHost();<br />            if (isValidAddress(localAddress)) {<br />                return localAddress;<br />            }<br />        } catch (Throwable e) {<br />            System.out.println("Failed to retriving ip address, " + e.getMessage());<br />        }<br />        try {<br />            Enumeration&lt;NetworkInterface&gt; interfaces = NetworkInterface.getNetworkInterfaces();<br />            if (interfaces != null) {<br />                while (interfaces.hasMoreElements()) {<br />                    try {<br />                        NetworkInterface network = interfaces.nextElement();<br />                        Enumeration&lt;InetAddress&gt; addresses = network.getInetAddresses();<br />                        if (addresses != null) {<br />                            while (addresses.hasMoreElements()) {<br />                                try {<br />                                    InetAddress address = addresses.nextElement();<br />                                    if (isValidAddress(address)) {<br />                                        return address;<br />                                    }<br />                                } catch (Throwable e) {<br />                                    System.out.println("Failed to retriving ip address, " + e.getMessage());<br />                                }<br />                            }<br />                        }<br />                    } catch (Throwable e) {<br />                        System.out.println("Failed to retriving ip address, " + e.getMessage());<br />                    }<br />                }<br />            }<br />        } catch (Throwable e) {<br />            System.out.println("Failed to retriving ip address, " + e.getMessage());<br />        }<br />        System.out.println("Could not get local host ip address, will use 127.0.0.1 instead.");<br />        return localAddress;<br />    }<br />    private static boolean isValidAddress(InetAddress address) {<br />        if (address == null || address.isLoopbackAddress())<br />            return false;<br />        String name = address.getHostAddress();<br />        return (name != null <br />                &amp;&amp; ! ANYHOST.equals(name)<br />                &amp;&amp; ! LOCALHOST.equals(name) <br />                &amp;&amp; IP_PATTERN.matcher(name).matches());<br />    }<br />    <br />    public static final String LOCALHOST = "127.0.0.1";<br /><br />    public static final String ANYHOST = "0.0.0.0";<br />    <br />    private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");<br />}<br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/423120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2015-03-02 06:29 <a href="http://www.blogjava.net/leekiang/archive/2015/03/02/423120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CountDownLatch和CyclicBarrier的区别</title><link>http://www.blogjava.net/leekiang/archive/2015/03/02/423119.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 01 Mar 2015 22:28:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2015/03/02/423119.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/423119.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2015/03/02/423119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/423119.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/423119.html</trackback:ping><description><![CDATA[CountDownLatch : 一个线程(或者多个)， 等待另外N个线程完成某个事情之后才能执行。   <br />CyclicBarrier  : N个线程相互等待，任何一个线程完成之前，所有的线程都必须等待。<br />这样应该就清楚一点了，对于CountDownLatch来说，重点是那个“一个线程”, 是它在等待， 而另外那N的线程在把“某个事情”做完之后可以继续等待，可以终止。而对于CyclicBarrier来说，重点是那N个线程，他们之间任何一个没有完成，所有的线程都必须等待。<br /><br />CyclicBarrier 在释放等待线程后可以重用，所以称它为循环的 barrier。它 还支持一个可选的 Runnable 命令，在一组线程中的最后一个线程到达之后（但在释放所有线程之前），该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态，此屏障操作很有用。<br /><br /><br /><br />public class Test {<br />    public static void main(String[] args) {<br />        new Test().test1();<br />    }<br />    <br />    public void test1() {<br />        CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {<br />            @Override<br />            public void run() {<br />                System.out.println("所有玩家进入第二关！");<br />            }<br />        });<br /><br />        for (int i = 0; i &lt; 4; i++) {<br />            new Thread(new Player(i, cyclicBarrier)).start();<br />        }<br />    }<br /><br />    class Player implements Runnable {<br />        private CyclicBarrier cyclicBarrier;<br />        private int id;<br /><br />        public Player(int id, CyclicBarrier cyclicBarrier) {<br />            this.cyclicBarrier = cyclicBarrier;<br />            this.id = id;<br />        }<br /><br />        @Override<br />        public void run() {<br />            try {<br />                System.out.println("玩家" + id + "正在玩第一关...");<br />                cyclicBarrier.await();<br />                System.out.println("玩家" + id + "进入第二关...");<br />            } catch (InterruptedException e) {<br />                e.printStackTrace();<br />            } catch (BrokenBarrierException e) {<br />                e.printStackTrace();<br />            }<br />        }<br />    }<br />}<img src ="http://www.blogjava.net/leekiang/aggbug/423119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2015-03-02 06:28 <a href="http://www.blogjava.net/leekiang/archive/2015/03/02/423119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java调用shell</title><link>http://www.blogjava.net/leekiang/archive/2015/03/01/423104.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sat, 28 Feb 2015 16:29:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2015/03/01/423104.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/423104.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2015/03/01/423104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/423104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/423104.html</trackback:ping><description><![CDATA[Runtime run = Runtime.getRuntime();<br />String str[] = { "/bin/sh", "-c", "echo '1' &gt;&gt; test.log" };<br />try {<br />    run.exec(str);<br />} catch (IOException e) {<br />}<br /><br /><br />使用Jsch执行Shell脚本 [http://blog.csdn.net/basecn/article/details/6080741]<br />纯Java通过SSH执行Linux命令的方法及代码 [http://ilexes.blog.51cto.com/705330/531352]<br />Java调用 Shell的ftp命令 [http://blog.sina.com.cn/s/blog_59ca2c2a0100e9vn.html]<img src ="http://www.blogjava.net/leekiang/aggbug/423104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2015-03-01 00:29 <a href="http://www.blogjava.net/leekiang/archive/2015/03/01/423104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jvm内存分析笔记</title><link>http://www.blogjava.net/leekiang/archive/2015/02/17/422968.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Mon, 16 Feb 2015 22:51:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2015/02/17/422968.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/422968.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2015/02/17/422968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/422968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/422968.html</trackback:ping><description><![CDATA[
		<br />1. java.lang.OutOfMemoryError: GC overhead limit exceeded原因<br />   &lt;http://blog.csdn.net/taijianyu/article/details/6606792&gt;<br />   &lt;http://www.sunnybtoc.com/page/M0/S746/746195.html&gt;<br />   <br />2. 用jhat分析·jmap -dump:format=b,file=mem.dat PID·命令导出来的文件时报错<br />   java.io.IOException: Unrecognized magic number<br />   &lt;https://forums.oracle.com/forums/thread.jspa?threadID=1542284&gt; 没找到原因<br />   <br />3. 命令<br />   1. jmap<br /> jmap -dump:live,format=b,file=heap.dmp PID 把本机的java内存映像导出到heap.dmp中<br /> jmap pid #打印内存使用的摘要信息<br />      jmap –heap pid #java heap信息<br />      jmap -histo:live pid #统计对象count ，live表示在使用<br />      jmap -histo pid &gt;mem.txt #打印比较简单的各个有多少个对象占了多少内存的信息，一般重定向的文件<br />      jmap -dump:format=b,file=mem.dat PID #将内存使用的详细情况输出到mem.dat 文件<br />   2. jhat 用来分析jmap导出的文件<br />      用jhat命令可以参看 jhat -port 7000 mem.dat<br />      然后使用：http://127.0.0.1:7000/ 查看类相关信息 <br />   3. jstat<br />      jstat -gcutil  PID<br />      例子：<br /><br />    S0      S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT<br />    11.63   0.00   56.46  66.92  98.49 162    0.248    6      0.331    0.579<br /><br />    S0  — Heap上的 Survivor space 0 区已使用空间的百分比<br />    S1  — Heap上的 Survivor space 1 区已使用空间的百分比<br />    E   — Heap上的 Eden space 区已使用空间的百分比<br />    O   — Heap上的 Old space 区已使用空间的百分比<br />    P   — Perm space 区已使用空间的百分比<br />    YGC — 从应用程序启动到采样时发生 Young GC 的次数<br />    YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)<br />    FGC — 从应用程序启动到采样时发生 Full GC 的次数<br />    FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)<br />    GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)<br /><br /><br />###参考<br />1. [JMAP、jstat命令详解](http://bbs.chinaunix.net/thread-3644198-1-1.html)<br />2. [J2SE6中使用jhat来分析内存堆](http://hi.baidu.com/tister/item/9444a3125796cf433a176eb9)<br /><br /><br />###jvm的内存回收过程是这样的<br />对象在Eden Space创建，当Eden Space满了的时候，gc就把所有在Eden Space中的对象扫描一次，<br />把所有有效的对象复制到第一个Survivor Space，同时把无效的对象所占用的空间释放。<br />当Eden Space再次变满了的时候，就启动移动程序把Eden Space中有效的对象复制到第二个Survivor Space，<br />同时，也将第一个Survivor Space中的有效对象复制到第二个Survivor Space。如果填充到第二个Survivor Space<br />中的有效对象被第一个Survivor Space或Eden Space中的对象引用，那么这些对象就是长期存在的，<br />此时这些对象将被复制到Permanent Generation。<br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/422968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2015-02-17 06:51 <a href="http://www.blogjava.net/leekiang/archive/2015/02/17/422968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 应用监控</title><link>http://www.blogjava.net/leekiang/archive/2015/02/17/422967.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Mon, 16 Feb 2015 22:35:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2015/02/17/422967.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/422967.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2015/02/17/422967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/422967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/422967.html</trackback:ping><description><![CDATA[JavaMelody 能够在QA和实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示：Java内存和Java CPU使用情况，用户Session数量，JDBC连接数，和http请求、sql请求、jsp页面与业务接口方法（EJB3、Spring、Guice）的执行数量，平均执行时间，错误百分比等。图表可以按天，周，月，年或自定义时间段查看。 <br /><br />jwebap 监控org.apache.commons.dbcp.BasicDataSource时不知效果如何<br />JAMon<br /><br />hyperic hq <br />probe   http://www.lambdaprobe.org/downloads/1.7/probe.1.7b.zip <br /><br />项目自动化之道—如何建构、部署、监控JAVA应用.pdf<br /><br /><br />http://chain.blog.163.com/blog/static/140848523201171623521235/  java使用java.lang.management监视和管理Java虚拟机 <br /><br />String processName = java.lang.management.ManagementFactory<br />.getRuntimeMXBean().getName();<br />System.out.println(processName.split("@")[0]);//进程ID<br /><br />http://chain.blog.163.com/blog/static/1408485232011716111013282/ java通过调用命令获取linux CPU、内存、磁盘信息<img src ="http://www.blogjava.net/leekiang/aggbug/422967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2015-02-17 06:35 <a href="http://www.blogjava.net/leekiang/archive/2015/02/17/422967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Error: no `server' JVM at `C:\Program Files\Java\jre6\bin\server\jvm.dll</title><link>http://www.blogjava.net/leekiang/archive/2013/02/17/395354.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 17 Feb 2013 10:19:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2013/02/17/395354.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/395354.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2013/02/17/395354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/395354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/395354.html</trackback:ping><description><![CDATA[如果报Error: no `server' JVM at `C:\Program Files\Java\jre6\bin\server\jvm.dll的错误，可把jdk下的jre\bin\server下的server文件夹复制到C:\Program Files\Java\jre6\bin目录即可解决。
   根本原因可看[JVM的版本问题](http://www.cnblogs.com/newskysoft/archive/2010/04/23/1718720.html)<img src ="http://www.blogjava.net/leekiang/aggbug/395354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2013-02-17 18:19 <a href="http://www.blogjava.net/leekiang/archive/2013/02/17/395354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK5笔记</title><link>http://www.blogjava.net/leekiang/archive/2011/10/07/360108.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 07 Oct 2011 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/10/07/360108.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/360108.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/10/07/360108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/360108.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/360108.html</trackback:ping><description><![CDATA[1，SuppressWarnings的作用是抑制编译器产生警告信息。<br />@SuppressWarnings("unused")<br />@SuppressWarnings("unchecked")<br /><br />eclipse支持的<code>SuppressWarning</code>的值如下，其他开发工具略有差异。<br /><ul><li><font color="green">all</font> to suppress all warnings</li><li><font color="green">boxing</font> to suppress warnings relative to boxing/unboxing operations</li><li><font color="green">cast</font> to suppress warnings relative to cast operations</li><li><font color="green">dep-ann</font> to suppress warnings relative to deprecated annotation</li><li><font color="green">deprecation</font> to suppress warnings relative to deprecation</li><li><font color="green">fallthrough</font> to suppress warnings relative to missing breaks in switch statements</li><li><font color="green">finally</font> to suppress warnings relative to finally block that don't return</li><li><font color="green">hiding</font> to suppress warnings relative to locals that hide variable</li><li><font color="green">incomplete-switch</font> to suppress warnings relative to missing entries in a switch statement (enum case)</li><li><font color="green">nls</font> to suppress warnings relative to non-nls string literals</li><li><font color="green">null</font> to suppress warnings relative to null analysis</li><li><font color="green">restriction</font> to suppress warnings relative to usage of discouraged or forbidden references</li><li><font color="green">serial</font> to suppress warnings relative to missing serialVersionUID field for a serializable class</li><li><font color="green">static-access</font> to suppress warnings relative to incorrect static access</li><li><font color="green">synthetic-access</font> to suppress warnings relative to unoptimized access from inner classes</li><li><font color="green">unchecked</font> to suppress warnings relative to unchecked operations</li><li><font color="green">unqualified-field-access</font> to suppress warnings relative to field access unqualified</li><li><font color="green">unused</font> to suppress warnings relative to unused code</li></ul>2，注解<br />注解是加入到java源代码中的一些描述性的数据，本身不能执行。可利用反射(当RetentionPolicy=<span style="color: rgb(0, 0, 0);">RUNTIME</span>)或文本解析取得注解信息。<br />@Target,@Retention为元注解。<br />SuppressWarnings的源码如下：<br /><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 0, 0);">@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})<br />@Retention(RetentionPolicy.SOURCE)<br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> @</span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> SuppressWarnings {<br />    String[] value();<br />}</span></div><br /><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> java.lang.annotation;<br /><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">enum</span><span style="color: rgb(0, 0, 0);"> RetentionPolicy {<br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Annotations are to be discarded by the compiler.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    SOURCE,<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Annotations are to be recorded in the class file by the compiler<br />     * but need not be retained by the VM at run time.  This is the default<br />     * behavior.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    CLASS,<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Annotations are to be recorded in the class file by the compiler and<br />     * retained by the VM at run time, so they may be read reflectively.<br />     *<br />     * </span><span style="color: rgb(128, 128, 128);">@see</span><span style="color: rgb(0, 128, 0);"> java.lang.reflect.AnnotatedElement<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    RUNTIME<br />}<br /></span></div><br /><br /><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> java.lang.annotation;<br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">enum</span><span style="color: rgb(0, 0, 0);"> ElementType {<br />    TYPE,<br />    FIELD,<br />    METHOD,<br />    PARAMETER,<br />    CONSTRUCTOR,<br />    LOCAL_VARIABLE,<br />    ANNOTATION_TYPE,<br />    PACKAGE<br />}<br /></span></div><br />3，泛型<br /><br /><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">T</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> T testT(List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">T</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">  list){<br />        T t </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">(T) list;<br />        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> t;<br />    }</span></div><br />4，自动装箱<span class="st"><wbr>（AutoBoxing</wbr></span>）<br /><br />关于row type<br />http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it/<br />http://www.blogjava.net/sevenguin/archive/2011/04/20/348628.html<br /><br /><a href="http://www.cnblogs.com/liubiqu/archive/2008/06/01/1211503.html">转：J2SE5中的最新注释功能SuppressWarnings</a><br />http://wenku.baidu.com/view/9d20440f844769eae009edf2.html<br /><a href="http://www.iteye.com/topic/36659">实战篇：设计自己的Annotation</a><br /><a href="http://www.thebuzzmedia.com/supported-values-for-suppresswarnings/">Supported Values for @SuppressWarnings</a><img src ="http://www.blogjava.net/leekiang/aggbug/360108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-10-07 15:05 <a href="http://www.blogjava.net/leekiang/archive/2011/10/07/360108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j</title><link>http://www.blogjava.net/leekiang/archive/2011/09/27/359602.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Tue, 27 Sep 2011 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/09/27/359602.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/359602.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/09/27/359602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/359602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/359602.html</trackback:ping><description><![CDATA[
		<pre>报错：<br />log4j:ERROR Document root element "log4j:configuration",  must match DOCTYPE root "null".<br />解决：<br />Try adding this to the second line (the line below &lt;?xml ...?&gt;)...<br />&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;<br /><br /><br /><br />Log4J的数据库写入方式就是一个鸡肋，没有使用连接池，也不支持addBatch。<br />只是把用户输出的log现在一个ArrayList中保存，当其数量达到了BufferSize，才启动写日志。参看其源代码（JDBCAppender.java）<br /><br />可以考虑把<span><span>org.apache.log4j.jdbc.JDBCAppender</span></span>换掉。<a target="_blank" href="http://www.iteye.com/topic/1112588">参考</a><br /><br /></pre>
		<a href="http://raymondhekk.iteye.com/blog/229937">log4j日志异步化大幅提升系统性能</a>
		<br />http://wiki.springside.org.cn/display/SpringSide3/Log<br /><a href="/wphmoon/archive/2011/02/13/344206.html">springside3.*中log4j和java.util.concurrent的结合使用</a><br /><a href="http://neptune.iteye.com/blog/327301">把重要的业务日志异步批量写入数据库 LOG4J</a><br /><a href="http://www.iteye.com/topic/172125">用log4j把日志异步写入数据库中</a><br /><a href="http://www.iteye.com/topic/1112590">log4j中再次看ThreadLocal用法</a><img src ="http://www.blogjava.net/leekiang/aggbug/359602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-09-27 13:54 <a href="http://www.blogjava.net/leekiang/archive/2011/09/27/359602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java基础(续)</title><link>http://www.blogjava.net/leekiang/archive/2011/09/03/357864.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 02 Sep 2011 17:14:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/09/03/357864.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/357864.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/09/03/357864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/357864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/357864.html</trackback:ping><description><![CDATA[StackOverflowError    当应用程序递归太深而发生堆栈溢出时抛出<br /> Jamon（Java Application Monitor）是一款免费的、高性能的、线程安全的Java程序，它使得开发人员能够容易地完成对生产环境应用程序的监控。<br /><br /><!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]--><p class="MsoNormal" style="margin-top: 7.5pt; text-align: left; line-height: 18.75pt;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">Java</span><span style="font-family: 宋体; color: black;">保证读和写<span lang="EN-US">32</span>位数或者更小的值是原子操作，也就是说可以在一步完成，因而不可能被打断，因此这样的读和写不需要同步。以下的代码是线程安全<span lang="EN-US">(thread safe)</span>的：<span lang="EN-US"></span></span></p><p class="MsoNormal" style="margin-top: 7.5pt; text-align: left; line-height: 18.75pt;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">public class Example{<br /></span><span style="font-family: 宋体; color: black;">　<span lang="EN-US"> private int
value; // More code here...<br /></span>　<span lang="EN-US"> public void set (int x){<br /></span>　　<span lang="EN-US"> // NOTE: No synchronized keyword<br /></span>　　<span lang="EN-US"> this.value = x;<br /></span>　<span lang="EN-US"> }<br />
}</span><br /></span></p><p class="MsoNormal" style="margin-top: 7.5pt; text-align: left; line-height: 18.75pt;" align="left"><span style="font-family: 宋体; color: black;">不过，这个保证仅限于读和写，下面的代码不是线程安全的：<span lang="EN-US"></span></span></p><p class="MsoNormal" style="margin-top: 7.5pt; text-align: left; line-height: 18.75pt;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">public void increment (){<br /></span><span style="font-family: 宋体; color: black;">　<span lang="EN-US"> // This is
effectively two or three instructions:<br /></span>　<span lang="EN-US"> // 1) Read current setting of ’value’.<br /></span>　<span lang="EN-US"> // 2) Increment that setting.<br /></span>　<span lang="EN-US"> // 3) Write the new setting back.<br /></span>　<span lang="EN-US"> ++this.value;<br />
}</span></span></p><br /><br />算法：统计最近一分钟的请求数量http://www.iteye.com/problems/46542<br /><img src ="http://www.blogjava.net/leekiang/aggbug/357864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-09-03 01:14 <a href="http://www.blogjava.net/leekiang/archive/2011/09/03/357864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java知识点</title><link>http://www.blogjava.net/leekiang/archive/2011/03/13/346174.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 13 Mar 2011 15:38:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/03/13/346174.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/346174.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/03/13/346174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/346174.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/346174.html</trackback:ping><description><![CDATA[1,<span><span class="keyword">double</span><span> d = </span><span class="number">1</span><span> / </span><span class="number">4</span><span>;System.out.println(d);</span></span>//输出为0<br /><br />2,    public static void main(String[] args) {<br />        StringBuffer a = new StringBuffer("a");<br />        StringBuffer b = new StringBuffer("b");<br />        append(a, b);<br />        System.out.println(a.toString() + "," + b.toString());//输出为"ab,a"<br />    }<br /><br />    public static void append(StringBuffer a, StringBuffer b) {<br />        a.append(b);<br />        b = a;<br />    }<br />   解释:由于java方法传值是值传递，所以方法里面的a,b虽然和方法外的a,b指向的对象一样，但是这两个引用在栈中的位置不一样。
<br />
过程大概是首先在栈中复制引用a为a'，b为b'，并令a'指向a所指的在堆中的StringBuffer对象，b'指向b所指的在堆中的StringBuffer对象。
<br />因此方法中的b=a只是起到了b'=a'的作用，并没有影响方法外b的指向。
      <br />        其实public static void append(StringBuffer a, StringBuffer 
b)中的变量a,b只是main方法中的变量a,b的引用地址副本，也就是说相当于append中的a与main中的a是指向同一个地址，append中
的b与main中的b是指向同一个地址，所以a.append(b)操作影响到了main方法中的a,但是append方法中的b=a;操作只是改变了
append方法的中b的指向，并没有改变main方法中b的指向。<br />        java是按值传递，对象类型的话，分为栈上的引用和堆上的对象，栈上的引用被复制一份，如果操作堆上的对象则对象改变，但是如果操作引用则不改变
      <br />        java方法的参数传递有两种规则：(1)按值传递(by value) ,八种基本数据类型和String 
(2)按址传递(by address)
,除String以外的所有复合数据类型，包括数组、类和接口
<br /><br />3,如果使用switch，那么每一个case和default里都要加break<br /><br /><a href="http://www.javaeye.com/topic/943647">Java容易搞错的知识点</a><br /><img src ="http://www.blogjava.net/leekiang/aggbug/346174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-03-13 23:38 <a href="http://www.blogjava.net/leekiang/archive/2011/03/13/346174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java字符串</title><link>http://www.blogjava.net/leekiang/archive/2011/03/13/346148.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sun, 13 Mar 2011 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/03/13/346148.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/346148.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/03/13/346148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/346148.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/346148.html</trackback:ping><description><![CDATA[String s1="ab";<br />String s2="a"+"b";<br />System.out.println(s1==s2);//true<br /><br />String s1 = "abc";<br />String s2 = "ab";<br />String s3 = s2 + "c";<br />System.out.println((s1 == s3));//false<br /><br />String s1 = "abc";<br />
final String s2 = "ab";<br />
String s3 = s2 + "c";<br />
System.out.println((s1 == s3));//true<br /><br /><br />参考：<br /><a target="_blank" href="http://home.open-open.com/space-4097-do-blog-id-1336.html">理解Java常量池</a><br /><a target="_blank" href="http://sarin.javaeye.com/blog/603684">Java String对象的经典问题(new String())</a><br /><a href="http://www.javaeye.com/topic/634530">Java堆.栈和常量池 笔记</a><br /><a href="http://www.javaeye.com/topic/48351">java编译器对string常量表达式的处理和优化</a><br /><a href="http://www.javaeye.com/topic/528230">Java 程序内存分析</a><br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/346148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-03-13 17:16 <a href="http://www.blogjava.net/leekiang/archive/2011/03/13/346148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于OSGI</title><link>http://www.blogjava.net/leekiang/archive/2011/03/05/345755.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Fri, 04 Mar 2011 16:12:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/03/05/345755.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/345755.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/03/05/345755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/345755.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/345755.html</trackback:ping><description><![CDATA[参考：<br />1，OSGi,Java模块化框架的另类进化 http://developer.51cto.com/art/201003/190584.htm<br />2，独家专访林昊：一步一步了解Java模块化 http://developer.51cto.com/art/201001/181503.htm<br /><img src ="http://www.blogjava.net/leekiang/aggbug/345755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-03-05 00:12 <a href="http://www.blogjava.net/leekiang/archive/2011/03/05/345755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java类的加载</title><link>http://www.blogjava.net/leekiang/archive/2011/02/24/345090.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 24 Feb 2011 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/02/24/345090.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/345090.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/02/24/345090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/345090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/345090.html</trackback:ping><description><![CDATA[打印Thread.currentThread().getContextClassLoader()，显示如下：<br /><font color="#0000ff">sun.misc.Launcher$AppClassLoader@19821f</font><br />这个加载器是系统类加载器。ClassLoader.getSystemResourceAsStream("com/config.xml")使用的就是系统类加载器定位资源的。<br /><br /><br /><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 0, 0);">    //JDK1.6，java.lang.ClassLoader的</span><span style="color: rgb(0, 0, 0);">loadClass(String name, </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> resolve)方法的源码</span><br /><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">synchronized</span><span style="color: rgb(0, 0, 0);"> Class</span><span style="color: rgb(0, 0, 0);">&lt;?&gt;</span><span style="color: rgb(0, 0, 0);"> loadClass(String name, </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> resolve)<br />    </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> ClassNotFoundException<br />    {<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> First, check if the class has already been loaded</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    Class c </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> findLoadedClass(name);<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (c </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) {<br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (parent </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) {<br />           //</span><span><span class="comment">如果parent不为null，则调用parent的loadClass进行加载</span><span>  </span></span><br /><span style="color: rgb(0, 0, 0);">            c </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> parent.loadClass(name, </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">);<br />        } </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> {<br />           //</span><span><span class="comment">parent为null，则调用BootstrapClassLoader进行加载</span><span></span></span><br /><span style="color: rgb(0, 0, 0);">            c </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> findBootstrapClassOrNull(name);<br />        }<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (ClassNotFoundException e) {<br />                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> ClassNotFoundException thrown if class not found<br />                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> from the non-null parent class loader</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">         }<br />        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (c </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">) {<br />            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> If still not found, then invoke findClass in order </span><span style="color: rgb(0, 128, 0);">to find the class.</span><span style="color: rgb(0, 128, 0);"><br />            //</span><span><span class="comment">如果仍然无法加载成功，则调用自身的findClass进行加载</span></span><br /><span style="color: rgb(0, 0, 0);">            c </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> findClass(name);<br />        }<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (resolve) {<br />        resolveClass(c);<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> c;<br />    }</span></div><br />java中共有三种类型的类加载器:
<br />    1、引导(bootstrap)类加载器（用来加载java API类），例如加载java.lang.String类<br />    2、扩展类加载器（就是sun.misc.Launcher$ExtClassLoader，用来加载jre\lib\ext目录下的jar包）
<br />    3、系统类加载器（就是sun.misc.Launcher$AppClassLoader，主要用来加载CLASSPATH设置目录中的Class）
<br /><br />创建一个URLClassLoader，发现其父加载器(parent,注意不是父类)的类型为sun.misc.Launcher$AppClassLoader，而sun.misc.Launcher$AppClassLoader和sun.misc.Launcher$ExtClassLoader的父类都是URLClassLoader。AppClassLoader的父加载器是ExtClassLoader，ExtClassLoader的父加载器为null，即bootstrap类加载器。<br /><br />类加载有个双亲委托模式,<br />AppClassLoader的父加载器是ExtClassLoader ,ExtClassLoader 的父加载器是bootstrap classloader,bootstrap 是C++写的类加载器,会负责加载java核心类库,就是jre/lib/rt.jar<br />ExtClassLoader会加载扩展类库,就是jre/lib/ext下的库。<br /><br />双亲委托模式就是子加载器会先委托父加载器加载，父加载器加载不了子加载器才加载，<br />这样做避免了重复加载，也加强了java的安全了，防止了恶意加载器去加载核心库。<br /><br /><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 0, 0);">String name </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">com.domain.Account</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />            <br />            URL url1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> URL(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">file:/D:/workspace/test/bin/</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            ClassLoader cl </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> URLClassLoader(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> URL[] { url1 });<br />            Class c1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> cl.loadClass(name);<br />            <br />            URL url2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> URL(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">file:/D:/workspace/test/bin</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            ClassLoader cl2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> URLClassLoader(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> URL[] { url2 });<br />            Class c2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> cl2.loadClass(name);<br />            <br />            System.out.println(c1</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">c2);</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">返回true，原因是都是用系统类加载器</span>AppClassLoader<span style="color: rgb(0, 128, 0);">加载的</span></div><br />注意：<br />1，在类A中使用Class.forName加载类B,那么加载类A的类加载器将会用于加载类B,这样两个类的类加载器是同一个。
<br />2，Class.forName("")和classLoader.load("")的区别主要是前者会做初始化，后者不会。见jdk注释：<font id="zoom" class="f14">A call to forName("X") causes the class named X to be initialized.  </font>自己分别用两种方式装载一个带静态代码的类就知道了。jdbc需要通过Class.forName("")的方式来装载JDBC驱动程序（例如
Class.forName("com.mysql.jdbc.Driver")，之所以用Class.forName而没有用
ClassLoader.load()，就是因为需要JVM完成Driver的初始化工作，而不仅仅是装载），然后通过一个统一的工厂类
Java.sql.DriverManager来取得数据库连接，并执行各种操作。<font id="zoom" class="f14">Class.forName("")不仅load class而且还保证resolve这个class,包括常量池解析，类初始化。。。这样JDBC驱动使用这个方法，才能保证类里的静态方法执行，一般驱动类的静态方法会向DriverManager注册自己，如果用classloader.load("")就不一定会resolve这个class,也就不能保证注册驱动类！</font><br />看了com.mysql.jdbc.Driver类的源码，静态代码就一句：java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver())<br />3，<br /><br />参考<br />1)java系统类加载器AppClassLoader之浅谈 http://blog.sina.com.cn/s/blog_4db6a3f101000do1.html<br />2)java类加载原理分析 http://gongmingwind.javaeye.com/blog/338366<br />3)解读ClassLoader http://www.javaeye.com/topic/83978<br />4)http://xyiyy.javaeye.com/blog/362107<br /><br /> Retrotranslator是一个Java字节码转换工具。它能够把用JDK5.0编译的Java Class转换成可运行在JVM1.4<img src ="http://www.blogjava.net/leekiang/aggbug/345090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-02-24 17:58 <a href="http://www.blogjava.net/leekiang/archive/2011/02/24/345090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入java虚拟机笔记</title><link>http://www.blogjava.net/leekiang/archive/2011/01/29/343749.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sat, 29 Jan 2011 13:36:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/01/29/343749.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/343749.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/01/29/343749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/343749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/343749.html</trackback:ping><description><![CDATA[1，java体系结构包括四个独立但相关的技术：java语言、class文件格式、java的api、java虚拟机<br />2，java虚拟机是一台抽象的计算机，主要任务是装载class文件并且执行其中的字节码。不同的java虚拟机，其执行引擎的实现可能不一样。分为软件实现和硬件实现(内嵌在芯片)，软件实现有以下几种：(1)每次都会解释字节码(2)即时编译,即编译成本低机器代码，缓存起来可以重用(3)自适应优化器<br />3，每一个类被装载的时候，java虚拟机都监视这个类，看它到底是被启动(bootstrap)类装载器还是被用户定义类装载器装载。当被装载的类引用了另外一个类时，虚拟机就会使用装载第一个类的类装载器装载被引用的类。由于java虚拟机采用这种方式进行类的加载，所以被装载的类默认情况下只能看到被同一个类装载器装载的类。通过这种方法，java的体系结构允许在一个java应用程序中建立多个命名空间。运行时的java程序中的每一个类装载器都有它自己的命名空间。<br />例子：浏览器上的java虚拟机为不同的网络地址创建不同的用户定义类装载器，用来装载不同来源的class文件，这种不同网址的applet就不会相互影响。<br />问题：1)自己写的类如果调用了java的api，那么类装载器是一个什么样的情况。同一个类可能被不同的类装载器装载？<br />      2)看一下tomcat的类装载器的实现<br />      3)java的虚拟机与ruby和python的有何区别？<br />      4)有没有一种打包工具，把java代码打包成不需要java虚拟机的本地可执行代码<br />      5)java的动态连接和动态扩展指的是什么？<br />4，java语言的特殊之处是程序既被编译又被解释。首先，编译器将程序编译为一种称之为java字节码(bytecode)的与平台无关的中间语言。解释器分析并运行每条java字节码指令。编译只发生一次；而解释在每次执行程序时都会执行(通常是如此，具体实现可能不一样)。<br /><br /><br /><br />12，声明一个对象时不会运行类的静态区块，在以下情况下会运行静态区块：<br />    1)new一个对象时；<br />    2)调用静态方法时；<br />    3)Class.forName("类名")<br /><br /><br />参考<br />1，http://xyiyy.javaeye.com/blog/362092<br />2，http://xyiyy.javaeye.com/blog/362107<br /><img src ="http://www.blogjava.net/leekiang/aggbug/343749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-01-29 21:36 <a href="http://www.blogjava.net/leekiang/archive/2011/01/29/343749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>值和引用</title><link>http://www.blogjava.net/leekiang/archive/2011/01/02/342144.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Sat, 01 Jan 2011 17:32:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2011/01/02/342144.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/342144.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2011/01/02/342144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/342144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/342144.html</trackback:ping><description><![CDATA[JDK1.6  <div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 0, 0);">        Integer v1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">;<br />        Integer v2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">;<br />        System.out.println(v1 </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> v2); </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 输出：true</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        <br />        Integer w1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">;<br />        Integer w2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">;<br />        System.out.println(w1 </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> w2); </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 输出：false</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />        Integer s1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Integer(</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">);<br />        Integer s2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Integer(</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">);<br />        System.out.println(s1 </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> s2); </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 输出：false</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        <br />        String str1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">test</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        String str2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">test</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />        System.out.println(str1</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">str2);</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 输出：true</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        <br />        String nstr1</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> String(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">aa</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        String nstr2</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> String(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">aa</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        System.out.println(nstr1</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">nstr2); </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 输出：false</span></div><br />原因:<span style="font-family: 宋体; font-size: 12pt;">当给</span><span style="font-size: 12pt;">Integer</span><span style="font-family: 宋体; font-size: 12pt;">变量直接赋整数值时，如果这个数值位于</span><span style="font-size: 12pt;">[-128,127]</span><span style="font-family: 宋体; font-size: 12pt;">内，</span><span style="font-size: 12pt;">JVM</span><span style="font-family: 宋体; font-size: 12pt;">（</span><span style="font-size: 12pt;">Java Virtual Machine</span><span style="font-family: 宋体; font-size: 12pt;">）就直接使用</span><span style="font-size: 12pt;">cache</span><span style="font-family: 宋体; font-size: 12pt;">中缓存的</span><span style="font-size: 12pt;">Integer</span><span style="font-family: 宋体; font-size: 12pt;">对象，否则，</span><span style="font-size: 12pt;">JVM</span><span style="font-family: 宋体; font-size: 12pt;">会重新创建一个</span><span style="font-size: 12pt;">Integer</span><span style="font-family: 宋体; font-size: 12pt;">对象。<br /><br />参考:<br />http://www.cnblogs.com/bitfan/archive/2010/10/24/1859687.html<br /></span><img src ="http://www.blogjava.net/leekiang/aggbug/342144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2011-01-02 01:32 <a href="http://www.blogjava.net/leekiang/archive/2011/01/02/342144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java的static</title><link>http://www.blogjava.net/leekiang/archive/2010/12/30/341941.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 29 Dec 2010 17:20:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/12/30/341941.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/341941.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/12/30/341941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/341941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/341941.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue;" lang="EN-US">Static </span>
				<span style="color: blue; font-family: 宋体;">的意义与实作方式</span>
				<span style="color: blue;" lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="color: blue;" lang="EN-US">
						 
				</span>
		</p>
		<span lang="EN-US">Class(static) field</span>
		<span style="font-family: 宋体;">：共用一块记忆体</span>
		<span lang="EN-US">
				<br />class(static) method</span>
		<span style="font-family: 宋体;">：共用一块记忆体</span>
		<span lang="EN-US">
				<br />instance(</span>
		<span style="font-family: 宋体;">非</span>
		<span lang="EN-US">static) field</span>
		<span style="font-family: 宋体;">：随着每个</span>
		<span lang="EN-US">instance</span>
		<span style="font-family: 宋体;">各有一块记忆体</span>
		<span lang="EN-US">
				<br />instance (</span>
		<span style="font-family: 宋体;">非</span>
		<span lang="EN-US">static) method</span>
		<span style="font-family: 宋体;">：共用一块记忆体</span>
		<span lang="EN-US">
				<br />
				<span style="">    </span>instance method</span>
		<span style="font-family: 宋体;">为什么不是随着每个</span>
		<span lang="EN-US">instance</span>
		<span style="font-family: 宋体;">占有一块记忆体，反倒是共用一块记忆体？其实，让每个</span>
		<span lang="EN-US">instance method</span>
		<span style="font-family: 宋体;">如同</span>
		<span lang="EN-US">instance field</span>
		<span style="font-family: 宋体;">一样，随着每个</span>
		<span lang="EN-US">instance</span>
		<span style="font-family: 宋体;">占有一块记忆体，这么做当然是可以的，只是</span>
		<span lang="EN-US">Java</span>
		<span style="font-family: 宋体;">编译器和</span>
		<span lang="EN-US">JVM</span>
		<span style="font-family: 宋体;">都不这么做，因为太浪费记忆体空间了。一个</span>
		<span lang="EN-US">field</span>
		<span style="font-family: 宋体;">少则占用一个</span>
		<span lang="EN-US">byte</span>
		<span style="font-family: 宋体;">，多则占用数百</span>
		<span lang="EN-US">Byte</span>
		<span style="font-family: 宋体;">，但是</span>
		<span lang="EN-US">method</span>
		<span style="font-family: 宋体;">少则数个</span>
		<span lang="EN-US">byte</span>
		<span style="font-family: 宋体;">，多则数百</span>
		<span lang="EN-US">Kilo Byte</span>
		<span style="font-family: 宋体;">。</span>
		<span lang="EN-US">Mehtod</span>
		<span style="font-family: 宋体;">耗费的记忆体是</span>
		<span lang="EN-US">field</span>
		<span style="font-family: 宋体;">的数百倍，甚至数千倍，当然是能共用就尽量共用，比较不会消耗记忆体。既然</span>
		<span lang="EN-US">JVM</span>
		<span style="font-family: 宋体;">让一个</span>
		<span lang="EN-US">class</span>
		<span style="font-family: 宋体;">的所有</span>
		<span lang="EN-US">instance</span>
		<span style="font-family: 宋体;">共用相同的</span>
		<span lang="EN-US">instance method</span>
		<span style="font-family: 宋体;">，下面两行程式码在</span>
		<span lang="EN-US">instanceMethod()</span>
		<span style="font-family: 宋体;">内部时，如何区分是</span>
		<span lang="EN-US">instance1</span>
		<span style="font-family: 宋体;">或</span>
		<span lang="EN-US">instance2</span>
		<span style="font-family: 宋体;">？</span>
		<span lang="EN-US">
				<br />instance1.instanceMethod(); <br />instance2.instanceMethod(); <br /></span>
		<span style="font-family: 宋体;">因为编译器会帮我们在把</span>
		<span lang="EN-US">instance1</span>
		<span style="font-family: 宋体;">和</span>
		<span lang="EN-US">instance2</span>
		<span style="font-family: 宋体;">个别传入</span>
		<span lang="EN-US">instanceMethod()</span>
		<span style="font-family: 宋体;">中当作第一个参数。也就是说，任何</span>
		<span lang="EN-US">instance method</span>
		<span style="font-family: 宋体;">参数的实际个数都会比表面上多一个，这个多出来的参数是由</span>
		<span lang="EN-US">Java</span>
		<span style="font-family: 宋体;">编译器帮我们加上去的，用来代表对应的</span>
		<span lang="EN-US">instance</span>
		<span style="font-family: 宋体;">。此参数的变数名称为</span>
		<span lang="EN-US">this</span>
		<span style="font-family: 宋体;">，也是</span>
		<span lang="EN-US">Java</span>
		<span style="font-family: 宋体;">的一个关键字（</span>
		<span lang="EN-US">keyword</span>
		<span style="font-family: 宋体;">）。</span>
		<span lang="EN-US">
				<br />
				<span style="">    </span>
		</span>
		<span style="font-family: 宋体;">当调用某个</span>
		<span lang="EN-US">instance method</span>
		<span style="font-family: 宋体;">或使用某个</span>
		<span lang="EN-US">instance field</span>
		<span style="font-family: 宋体;">时，你必须在前面加上该</span>
		<span lang="EN-US">instance</span>
		<span style="font-family: 宋体;">的名称，如果该</span>
		<span lang="EN-US">instance method/field</span>
		<span style="font-family: 宋体;">相关的</span>
		<span lang="EN-US">instance</span>
		<span style="font-family: 宋体;">和当时程式码所在的</span>
		<span lang="EN-US">instance method</span>
		<span style="font-family: 宋体;">的</span>
		<span lang="EN-US">instance</span>
		<span style="font-family: 宋体;">指的是同一个</span>
		<span lang="EN-US">instance</span>
		<span style="font-family: 宋体;">时，该</span>
		<span lang="EN-US">instance</span>
		<span style="font-family: 宋体;">的名称就是</span>
		<span lang="EN-US">this</span>
		<span style="font-family: 宋体;">，这种情况下，你也可以选择不在前面加上「</span>
		<span lang="EN-US">this.</span>
		<span style="font-family: 宋体;">」。</span>
		<span lang="EN-US">
				<br />
				<span style="">    </span>
		</span>
		<span style="font-family: 宋体;">然而，在某些状况下，非得在前面加上「</span>
		<span lang="EN-US">this.</span>
		<span style="font-family: 宋体;">」不可。例如，当</span>
		<span lang="EN-US">method</span>
		<span style="font-family: 宋体;">中的参数或区域变数和</span>
		<span lang="EN-US">instance field</span>
		<span style="font-family: 宋体;">名称完全相同时，如果不在前面冠上「</span>
		<span lang="EN-US">this.</span>
		<span style="font-family: 宋体;">」，那么指的是参数或区域变数；如果在前面冠上「</span>
		<span lang="EN-US">this.</span>
		<span style="font-family: 宋体;">」，那么指的才是</span>
		<span lang="EN-US">instance field</span>
		<span style="font-family: 宋体;">。<br /><br />转自http://www.blogjava.net/guoyongfei/archive/2009/02/06/253571.html<br /></span>
<img src ="http://www.blogjava.net/leekiang/aggbug/341941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-12-30 01:20 <a href="http://www.blogjava.net/leekiang/archive/2010/12/30/341941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程安全类</title><link>http://www.blogjava.net/leekiang/archive/2010/11/15/338086.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Mon, 15 Nov 2010 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/11/15/338086.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/338086.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/11/15/338086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/338086.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/338086.html</trackback:ping><description><![CDATA[
		<div>当一个类已经很好的同步以保护它的数据时，这个类就称为“线程安全的”。</div>
		即使是线程安全类，也应该特别小心，因为操作的线程是间仍然不一定安全。<br /><br /><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.Collections;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.LinkedList;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.List;<br /><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> TestThread {<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> main(String[] args) {<br />        </span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);"> NameList nl </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> NameList();<br />        nl.add(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">aaa</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> NameDropper </span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);"> Thread {<br />            </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> run() {<br />                String name </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> nl.removeFirst();<br />                System.out.println(name);<br />            }<br />        }<br />        Thread t1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> NameDropper();<br />        Thread t2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> NameDropper();<br />        t1.start();<br />        t2.start();<br />    }<br />}<br /><br /></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> NameList {<br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> List nameList </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Collections.synchronizedList(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> LinkedList());<br /><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> add(String name) {<br />        nameList.add(name);<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> String removeFirst() {//</span><span style="color: rgb(0, 0, 0);">removeFirst方法必须同步</span><br /><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (nameList.size() </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">) {<br />            </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />                Thread.sleep(</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">);<br />            } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (InterruptedException e) {<br />                e.printStackTrace();<br />            }<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> (String) nameList.remove(</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />        } </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> {<br />            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />        }<br />    }<br />}<br /></span></div><br /><div><br /><br />http://lavasoft.blog.51cto.com/62575/99155<br /></div><img src ="http://www.blogjava.net/leekiang/aggbug/338086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-11-15 13:53 <a href="http://www.blogjava.net/leekiang/archive/2010/11/15/338086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java处理浮点数</title><link>http://www.blogjava.net/leekiang/archive/2010/07/27/327244.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Tue, 27 Jul 2010 10:22:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/07/27/327244.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/327244.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/07/27/327244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/327244.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/327244.html</trackback:ping><description><![CDATA[    public void testBigDecimalEquals() {<br />        assertEquals(new BigDecimal("3.50"),new BigDecimal("3.5"));//不相等<br />    }<br /><br /> System.out.println(0.030*100);//输出3.0<br /> System.out.println(0.031*100);//输出3.1<br /> System.out.println(0.032*100);//输出3.2<br /> System.out.println(0.033*100);//输出3.3000000000000003<br /> System.out.println(0.034*100);//输出3.4000000000000004<br /> System.out.println(0.035*100);//输出3.5000000000000004<br /> System.out.println(0.036*100);//输出3.5999999999999996<br /> System.out.println(0.037*100);//输出3.6999999999999997<br /> System.out.println(0.038*100);//输出3.8<br /> System.out.println(0.039*100);//输出3.9<br /> <br /> BigDecimal b2 = new BigDecimal(0.236);<br /> System.out.println(b2);//输出0.2359999999999999875655021241982467472553253173828125<br /> <br /> 描述：<br /> 当我们使用一些"特殊的数字"进行运算时，或者调用BigDecimal中new BigDecimal(double val)进行构造的时候，将得到意想不到的结果。<br /> 原因：<br /> Java中，浮点类型是依据IEEE754标准的。IEEE754定义了32位和64位双精度两种浮点二进制小数标准。采用二进制表示double,float等浮点数是不准确的。<br />同时BigDecimal的API声明，建议使用new BigDecimal(String val)进行构造，使用new BigDecimal(double val)进行构造的时候，将得到意想不到的结果（The results of this constructor can be somewhat unpredictable）。<br /><br />解决办法:<br />1,通过String结合BigDecimal来转换。<br />String val = "0.236";<br />//使用new BigDecimal(String val)进行构造<br />BigDecimal a = new BigDecimal(""+val);<br />BigDecimal b = new BigDecimal(""+100);<br />//小数的位数与构造参数的位数一致<br />System.out.println(a.multiply(b));//输出23.600<br /><br />2,使用DecimalFormat来确定小数点后位数<br />double val = 0.236*100;<br />//保留小数点后两位，若保留三位为"#.000"<br />DecimalFormat df = new DecimalFormat("#.00");<br />String str = df.format(val);<br />System.out.println(Double.valueOf(str));//输出23.6<br /><br />感谢<br />http://www.blogjava.net/kalman03/archive/2010/10/25/336121.html<br /><img src ="http://www.blogjava.net/leekiang/aggbug/327244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-07-27 18:22 <a href="http://www.blogjava.net/leekiang/archive/2010/07/27/327244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分页</title><link>http://www.blogjava.net/leekiang/archive/2010/06/29/324817.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Tue, 29 Jun 2010 11:19:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/06/29/324817.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/324817.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/06/29/324817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/324817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/324817.html</trackback:ping><description><![CDATA[http://www.javaeye.com/topic/470144<br />http://www.javaeye.com/topic/121756<br />http://www.javaeye.com/topic/57909<br />http://www.javaeye.com/topic/400225<br />http://www.blogjava.net/weijy/archive/2008/09/27/231449.html<br />http://blog.sina.com.cn/s/blog_537a7ce301008o4y.html<br />http://lengyue-dick.javaeye.com/blog/247347<br />http://qdjinxin.javaeye.com/blog/674082<img src ="http://www.blogjava.net/leekiang/aggbug/324817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-06-29 19:19 <a href="http://www.blogjava.net/leekiang/archive/2010/06/29/324817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log笔记</title><link>http://www.blogjava.net/leekiang/archive/2010/05/27/322025.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 27 May 2010 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/05/27/322025.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/322025.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/05/27/322025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/322025.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/322025.html</trackback:ping><description><![CDATA[1,为什么要写 if (log.isDebugEnabled())<br />在使用log4j,common-log这样的log框架时，发现很多代码中这样写 <br /> if   (log.isDebugEnabled())
   { <br />                log.debug( "xxxx "); <br /> } <br /><br /> 
我很奇怪，为什么要与log.isDebugEnabled()？既然log.debug()在没有指定输出级别为DEBUG时不会有输出，为什么还要在
前面加一个isDebugEnabled()的判断？ <br />答:<br />为了效率，如果上述那个代码那么简单是没有必要的 <br />  但是如果这样 <br /> if   
(log.isDebugEnabled())   { <br />                
log.debug(buildFullString()); <br /> } <br />  如果这个buildFullString效率不太高，那么如果直接写log.debug(buildFullString());的话 <br />  虽然它不会打印语句，但是buildFullString还是被执行了，这样就白费了功夫 <br />  所以加上isDebugEnabled就可以避免执行buildFullString了 <br />  这个方法一般用在认为buildFullString这个函数效率不太高的情况下<br /><br />http://topic.csdn.net/u/20070119/16/e9cf879c-697b-482a-9d55-21bfb7a16216.html<br /><img src ="http://www.blogjava.net/leekiang/aggbug/322025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-05-27 14:14 <a href="http://www.blogjava.net/leekiang/archive/2010/05/27/322025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM笔记</title><link>http://www.blogjava.net/leekiang/archive/2010/05/26/321947.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 26 May 2010 10:51:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/05/26/321947.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/321947.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/05/26/321947.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/321947.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/321947.html</trackback:ping><description><![CDATA[1,http://www.javaeye.com/topic/143987<br />在新版本的java里面，同步比gc慢
<br />所以以前很多framework里面都有pool的设定，现在都取消了
<br />现在只有一些数据库连接等IO资源做pool以外，基本的数据class已经都不作pool了<br />pool 一般用在创建很大消费的对象时才用的。 比如 connection， tapestry的page。 像new HashMap这样的 
是没有必要的。 
<br /><img src ="http://www.blogjava.net/leekiang/aggbug/321947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-05-26 18:51 <a href="http://www.blogjava.net/leekiang/archive/2010/05/26/321947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式笔记</title><link>http://www.blogjava.net/leekiang/archive/2010/04/21/318955.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 21 Apr 2010 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/04/21/318955.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/318955.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/04/21/318955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/318955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/318955.html</trackback:ping><description><![CDATA[String regex = "&lt;a.*?/a&gt;";//取链接<br />        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);<br />        Matcher mt = pattern.matcher(str);<br />        while (mt.find()) {<br />        String s=mt.group();<br />        }<br />        String regex2 = "&gt;.*?&lt;/a&gt;";// 标题部分<br />        String regex3 = "imgs/[([0-9])]+.(jpg|gif|png|bmp)";//取图片<br /><br />输入例子可产生正则表达式<br />http://sourceforge.net/projects/quickrex/<br /><br />在线测试<br />http://www.fileformat.info/tool/regex.htm<br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/318955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-04-21 12:30 <a href="http://www.blogjava.net/leekiang/archive/2010/04/21/318955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adding Socket Timeout to java.net.URLConnection (JDK 1.2)</title><link>http://www.blogjava.net/leekiang/archive/2010/04/14/318278.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 14 Apr 2010 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/04/14/318278.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/318278.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/04/14/318278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/318278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/318278.html</trackback:ping><description><![CDATA[
		<h1 style="">Adding Socket Timeout to java.net.URLConnection (JDK 1.2)</h1>
		<h2>found a bug , see "connected = true;" in  public void connect() 
throws IOException {</h2>
		<hr />
		<h1>Note: 05/11/01 Sam Found a patch for borland</h1>
		<p>As I got the email:</p>
		<p>Just writing to inform you theis patch for 1.3 works with the 1.3 
shipped with borland JBuilder 4 
(not sure which excat version it is)</p>
		<p>the only problems I had where that the code was a bit messed up,  
following are the changes made to it to make it work. </p>
		<pre>
				<br />  public void SetTimeout(int i) <br />    throws SocketException <br />  { <br />    this.timeout = i; // Should be i not -1   &lt;------------ERROR <br />    serverSocket.setSoTimeout(i) ; <br />  } <br /><br />  public boolean parseHTTP(MessageHeader header, ProgressEntry entry) <br />    throws java.io.IOException <br />  { <br />    if( this.timeout != -1 ) { <br />      try { <br />        serverSocket.setSoTimeout(timeout) ; // should be timeout not i &lt;---------------ERROR <br />      } catch( SocketException e ) { <br />        throw new java.io.IOException("unable to set socket timeout!") ; <br />      } <br />    } <br /><br />    return super.parseHTTP(header, entry) ; <br />  } <br />Sam <br /></pre>
		<p>Under JDK 1.3, which is HTTP 1.1 compatible, the 
InterruptedIOException gets caught by 
the socket I/O routines and ignored.  input is read in "chunks". I 
debugged the existing code under 1.3, the Timeout is getting set 
properly etc.,
but the exception gets caught in the underlying I/O routines, which have
 a single
retry if any IOExceptions are thrown.  Thanks a lot Sun....</p>
		<h1>3/22/01: Patch for JDK 1.3 unverified</h1>
		<p>Patch code for JDK 1.3 from Matt Ho (unverified)</p>
		<pre>
				<br />----[ snip ]----<br /><br />import sun.net.www.MessageHeader ;<br />import sun.net.ProgressEntry ;<br /><br />.<br />.<br />.<br /><br />  private int timeout = -1 ;<br /><br />  public void SetTimeout(int i)<br />    throws SocketException<br />  {<br />    this.timeout = -1 ;<br />    serverSocket.setSoTimeout(i) ;<br />  }<br /><br />  public boolean parseHTTP(MessageHeader header, ProgressEntry entry)<br />    throws java.io.IOException<br />  {<br />    if( this.timeout != -1 ) {<br />      try {<br />        serverSocket.setSoTimeout(i) ;<br />      } catch( SocketException e ) {<br />        throw new java.io.IOException("unable to set socket timeout!") ;<br />      }<br />    }<br /><br />    return super.parseHTTP(header, entry) ;<br />  }<br /><br />----[ snip ]----<br /><br /></pre>
		<h1>On with the rest of the stuff</h1>
		<p>The BSD socket API supports a timeout option (the option is 
SO_TIMEOUT), which is also supported in java.net.socket.  
Unfortunately, java.net.URLConnection does not expose the underlying 
socket.  So if you have a URL connection that attempts to 
connect to a dead URL (i.e., the URL is well formed and exists but the 
site is down), the socket will eventually timeout using the
operating system's default timeout (420 seconds on Win NT).  The timeout
 is a very long time, e.g., for spiders or URL checking.</p>
		<p>The following files illustrate a technique to introduce a socket 
timeout to URL connection, based upon the actual java 
source code itself (see the open source community licensing at <a href="http://www.javasoft.com/">JavaSoft</a>).</p>
		<h2>The Base classes, or URLConnection internals</h2>
		<p>Java's implementation of networking is protocol independent, as well 
as object oriented.  Therefore the implementation is not as 
straightfoward
as one might imagine.</p>
		<p>URLConnection relies upon several internal classes using a 
client/server model as well as a "factory" design pattern. The client's 
base class 
is  <i>sun.net.www.http.HttpClient</i>.  This class is extended for the 
purpose of exposing the socket.</p>
		<p>The default factory is <i>URLStreamHandlerFactory</i>, which 
indirectly "handles" the creation of an HTTP client by instantiating 
a class that is specific to the HTTP protocol: <i>sun.net.www.protocol.http.Handler</i>.
  The handler actually creates the client.</p>
		<p>In practice, the factory is only necessary to mimic java's 
implementation, but only the Handler is really needed.</p>
		<h2>Derived Classes</h2>
		<p>We derive 4 classes so as to preserve the symmetry with the java 
source code:</p>
HttpURLConnectionTimeout extends 
sun.net.www.protocol.http.HttpURLConnection<br /> 
HttpTimeoutHandler extends sun.net.www.protocol.http.Handler<br />
HttpTimeoutFactory implements java.net.URLStreamHandlerFactory<br />
HttpClientTimeout extends sun.net.www.http.HttpClient<br /><p>On with the source code.</p><br /><h2>HttpURLConnectionTimeout</h2><pre>// whatever package you want<br />import sun.net.www.http.HttpClient;<br />import java.net.*;<br />import java.io.*;<br />public class HttpClientTimeout extends HttpClient<br />{<br />    public HttpClientTimeout(URL url, String proxy, int proxyPort) throws IOException<br />	{<br />		super(url, proxy, proxyPort);<br />	}<br /><br />    public HttpClientTimeout(URL url) throws IOException<br />	{<br />		super(url, null, -1);<br />    }<br /><br />	public void SetTimeout(int i) throws SocketException { <br />    	serverSocket.setSoTimeout(i); <br />    } <br /><br />    /* This class has no public constructor for HTTP.  This method is used to<br />     * get an HttpClient to the specifed URL.  If there's currently an<br />     * active HttpClient to that server/port, you'll get that one.<br />	 *<br />	 * no longer syncrhonized -- it slows things down too much<br />	 * synchronize at a higher level<br />     */<br />    public static HttpClientTimeout GetNew(URL url)  <br />    throws IOException {<br />	/* see if one's already around */<br />	HttpClientTimeout ret = (HttpClientTimeout) kac.get(url);<br />	if (ret == null) {<br />	    ret = new HttpClientTimeout (url);  // CTOR called openServer()<br />	} else {<br />	    ret.url = url;<br />	}<br />	// don't know if we're keeping alive until we parse the headers<br />	// for now, keepingAlive is false<br />	return ret;<br />    }<br /><br />	public void Close() throws IOException<br />	{<br />		serverSocket.close();<br />	}<br /><br />	public Socket GetSocket()<br />	{<br />		return serverSocket;<br />	}<br /><br /><br />}<br /></pre><br /><h2>HttpTimeoutFactory</h2><pre>import java.net.*;<br /><br />public class HttpTimeoutFactory implements URLStreamHandlerFactory<br />{<br />	int fiTimeoutVal;<br />	public HttpTimeoutFactory(int iT) { fiTimeoutVal = iT; }<br />	public URLStreamHandler createURLStreamHandler(String str)<br />	{<br />		return new HttpTimeoutHandler(fiTimeoutVal); <br />	}<br /><br />}<br /></pre><br /><h2>HttpTimeoutHandler</h2><pre>import java.net.*;<br />import java.io.IOException;<br /><br />public class HttpTimeoutHandler extends sun.net.www.protocol.http.Handler<br />{<br />	int fiTimeoutVal;<br />	HttpURLConnectionTimeout fHUCT;<br />	public HttpTimeoutHandler(int iT) { fiTimeoutVal = iT; }<br /><br />    protected java.net.URLConnection openConnection(URL u) throws IOException {<br />		return fHUCT = new HttpURLConnectionTimeout(u, this, fiTimeoutVal);<br />    }<br /><br />    String GetProxy() { return proxy; }		// breaking encapsulation<br />    int GetProxyPort() { return proxyPort; }    // breaking encapsulation<br /><br />	public void Close() throws Exception <br />	{<br />		fHUCT.Close();<br />	}<br /><br />	public Socket GetSocket()<br />	{<br />		return fHUCT.GetSocket();<br />	}<br />}<br /></pre><br /><h2>HttpURLConnectionTimeout</h2><pre>import java.net.*;<br />import java.io.*;<br />import sun.net.www.http.HttpClient;<br /><br />public class HttpURLConnectionTimeout extends sun.net.www.protocol.http.HttpURLConnection<br />{<br />	int fiTimeoutVal;<br />    HttpTimeoutHandler fHandler;<br />	HttpClientTimeout fClient;<br />  	public HttpURLConnectionTimeout(URL u, HttpTimeoutHandler handler, int iTimeout) throws IOException<br />	{   <br />    	super(u, handler);<br />		fiTimeoutVal = iTimeout;<br />	}<br /><br />	public HttpURLConnectionTimeout(URL u,  String host, int port) throws IOException<br />	{  <br />    	super(u, host, port);<br />	}<br /><br />    public void connect() throws IOException {<br />	if (connected) {<br />	    return;<br />	}<br />	try {<br />	    if ("http".equals(url.getProtocol()) /* &amp;&amp; !failedOnce &lt;- PRIVATE */ ) {<br />		// for safety's sake, as reported by KLGroup<br />		synchronized (url)<br />		{<br />			http = HttpClientTimeout.GetNew(url);<br />		}<br />		fClient = (HttpClientTimeout)http;<br />   		((HttpClientTimeout)http).SetTimeout(fiTimeoutVal);<br />	    } else {<br />		// make sure to construct new connection if first<br />		// attempt failed<br />		http = new HttpClientTimeout(url, fHandler.GetProxy(), fHandler.GetProxyPort());<br />	    }<br />	    ps = (PrintStream)http.getOutputStream();<br />	} catch (IOException e) {<br />	    throw e;  }<br />		// this was missing from the original version<br />		connected = true;<br />	}<br /><br />    /**<br />     * Create a new HttpClient object, bypassing the cache of<br />     * HTTP client objects/connections.<br />     *<br />     * @param url	the URL being accessed<br />     */<br />    protected HttpClient getNewClient (URL url)<br />    throws IOException {<br />		HttpClientTimeout client = new HttpClientTimeout (url, (String)null, -1);<br />		try {<br />		client.SetTimeout(fiTimeoutVal);<br />		} catch (Exception e) <br />		{ System.out.println("Unable to set timeout value"); }<br />	return (HttpClient)client; <br />    }<br /><br />    /**<br />     * opens a stream allowing redirects only to the same host.<br />     */<br />    public static InputStream openConnectionCheckRedirects(URLConnection c)<br />	throws IOException<br />    {<br />        boolean redir;<br />        int redirects = 0;<br />        InputStream in = null;<br /><br />        do {<br />            if (c instanceof HttpURLConnectionTimeout) {<br />                ((HttpURLConnectionTimeout) c).setInstanceFollowRedirects(false);<br />            }<br /><br />            // We want to open the input stream before<br />            // getting headers, because getHeaderField()<br />            // et al swallow IOExceptions.<br />            in = c.getInputStream();<br />            redir = false;<br /><br />            if (c instanceof HttpURLConnectionTimeout) {<br />                HttpURLConnectionTimeout http = (HttpURLConnectionTimeout) c;<br />                int stat = http.getResponseCode();<br />                if (stat &gt;= 300 &amp;&amp; stat &lt;= 305 &amp;&amp;<br />                        stat != HttpURLConnection.HTTP_NOT_MODIFIED) {<br />                    URL base = http.getURL();<br />                    String loc = http.getHeaderField("Location");<br />                    URL target = null;<br />                    if (loc != null) {<br />                        target = new URL(base, loc);<br />                    }<br />                    http.disconnect();<br />                    if (target == null<br />                        || !base.getProtocol().equals(target.getProtocol())<br />                        || base.getPort() != target.getPort()<br />                        || !HostsEquals(base, target)<br />                        || redirects &gt;= 5)<br />                    {<br />                        throw new SecurityException("illegal URL redirect");<br />		    }<br />                    redir = true;<br />                    c = target.openConnection();<br />                    redirects++;<br />                }<br />            }<br />        } while (redir);<br />        return in;<br />    }<br /><br />    // Same as java.net.URL.hostsEqual<br /><br /><br />	static boolean HostsEquals(URL u1, URL u2) <br />    { <br />        final String h1 = u1.getHost();<br />        final String h2 = u2.getHost();<br /><br />        if (h1 == null) {<br />            return h2 == null;<br />        } else if (h2 == null) {<br />            return false;<br />        } else if (h1.equalsIgnoreCase(h2)) {<br />            return true;<br />        }<br />            // Have to resolve addresses before comparing, otherwise<br />            // names like tachyon and tachyon.eng would compare different<br />        final boolean result[] = {false};<br /><br />        java.security.AccessController.doPrivileged(<br />            new java.security.PrivilegedAction() {<br />            public Object run() {<br />            try {<br />                InetAddress a1 = InetAddress.getByName(h1);<br />                InetAddress a2 = InetAddress.getByName(h2);<br />                result[0] = a1.equals(a2);<br />            } catch(UnknownHostException e) {<br />            } catch(SecurityException e) {<br />            }<br />            return null;<br />            }<br />        });<br /><br />        return result[0];<br />	}<br /><br />	void Close() throws Exception<br />	{<br />		fClient.Close();<br />	}<br /><br />	Socket GetSocket()<br />	{<br />		return fClient.GetSocket();<br />	}<br />}<br /><br /></pre><h2>Sample Usage #1</h2><pre>import java.net.*;<br />public class MainTest<br />{<br /><br />	public static void main(String args[])<br />	{<br />	    int i = 0;<br />    	try {<br />			URL theURL = new URL((URL)null, "http://www.snowball.com", new HttpTimeoutHandler(150)); // timeout value in milliseconds<br /><br />	        // the next step is optional<br />			theURL.setURLStreamHandlerFactory(new HttpTimeoutFactory(150));<br /><br /><br />			URLConnection theURLconn = theURL.openConnection();<br />	        theURLconn.connect();<br />    	    i = theURLconn.getContentLength();<br />        }<br />        catch (InterruptedIOException e)<br />        {<br />        	System.out.println("timeout on socket");<br />        }<br />        System.out.println("Done, Length:" + i);<br />	}<br />}<br /></pre><br /><h2 style="">Sample Usage #2</h2><pre>		try<br />		{<br />			HttpTimeoutHandler xHTH = new HttpTimeoutHandler(10);	// timeout value in milliseconds<br />	        URL theURL = new URL((URL)null, "http://www.javasoft.com", xHTH);<br />	        HttpURLConnection theUC = theURL.openConnection();<br />			.<br />			.<br />			.<br />		}<br />		catch (InterruptedIOException e)<br />		{<br />			// socket timed out<br /><br />		}<br /></pre><br /><p>Some remarks: this code is thread safe.</p><p>More to come</p><p>来源:http://www.logicamente.com/sockets.html</p><p>     http://www.edevs.com/java-programming/15068/</p><p><br /></p><p>Thanks Felipe!</p><p style="">If I understand information at 
http://www.logicamente.com/sockets.html correctly there are 2 problems 
with timeout when using HttpURLConnection in JDK 1.3:</p><p style="">1. 
HttpURLConnection does not allow changing the default timeout that is in
 order of few minutes.</p><p>2. If actual HTTP stream is chunked then 
HttpURLConnection ignores even the default timeout and tries to read 
what it perceives as a continued stream resulting in indefinite read 
wait.</p><p>The patch shown at the above URL, consisting of subclassing 
of 4 system classes (1 from java.net... and 3 from sun.net.www...), is 
aimed to resolve problem 1 above but does not help in problem 2.</p><p>My
 main problem is to have timeout when reading chunked stream (system 
default timeout will be ok to beginning with) and therefore the question
 is if this bug has been corrected in later versions of JDK? Thanks.</p><p>-----<br /></p><p style="">I have seen much chat about this "problem", that is 
setSoTimeout not available or not working properly.</p><p>how about you 
write your own Timer (resettable) or 1.4 has Timer class</p><p>you just 
reset it anytime you detect network activity and close the Socket if the
 Timer finishes its cycle?</p><img src ="http://www.blogjava.net/leekiang/aggbug/318278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-04-14 17:09 <a href="http://www.blogjava.net/leekiang/archive/2010/04/14/318278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpURLConnection timeout solution</title><link>http://www.blogjava.net/leekiang/archive/2010/04/14/318274.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 14 Apr 2010 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/04/14/318274.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/318274.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/04/14/318274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/318274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/318274.html</trackback:ping><description><![CDATA[
		<strong>From:</strong> Niels Campbell (<em>niels_campbell_at_lycos.co.uk</em>)<br /><strong>Date:</strong> 01/23/04<br /><pre>Date: 23 Jan 2004 09:14:16 -0800<br />After spending nearly 3 days on this problem to come up with a
<br /></pre><p>
solution I think it is only right to post the solution.
<br /></p><p>I found that you can't set the soTimeout on an HttpURLConnection 
as
<br />
the sockets are encapsulated within the HttpURLConnection
<br />
implementation.
<br /></p><p>I found Mike Reiche solution in which he uses a handler to set a
<br />
timeout value. This nearly worked. Looking at the code in the rt.jar I
<br />
found that the initial timeout was working, but the call
<br />
parseHTTP(...) in HttpClient was then attempting a second connection
<br />
which had a time out value of 0(infinite).
<br /></p><p>I modified the code to override the doConnect() in the 
NetworkClient
<br />
and managed to get a timeout occurring. To be exact two timeouts
<br />
occur.
<br /></p><p>It works on 
<br />
java version "1.4.0_03"
<br />
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_03-b04)
<br />
Java HotSpot(TM) Client VM (build 1.4.0_03-b04, mixed mode)
<br />
and
<br />
java version "1.2.2"
<br />
Classic VM (build JDK-1.2.2_013, native threads, symcjit)
<br /></p><p>Anyway here is the code, excuse the formatting.
<br /></p><p>/* HttpTimeoutURLConnection.java */
<br />
import java.net.*;
<br />
import java.io.*;
<br />
import sun.net.www.http.HttpClient;
<br /></p><p>// Need to override any function in HttpURLConnection that create
 a
<br />
new HttpClient
<br />
// and create a HttpTimeoutClient instead. Those functions are
<br />
// connect(), getNewClient(), getProxiedClient()
<br /></p><p>public class HttpTimeoutURLConnection extends
<br />
sun.net.www.protocol.http.HttpURLConnection
<br />
{
<br /></p><p>    public HttpTimeoutURLConnection(URL u, HttpTimeoutHandler 
handler,
<br />
int iSoTimeout)
<br />
        throws IOException
<br />
    {
<br />
        super(u, handler);
<br />
        HttpTimeoutClient.setSoTimeout(iSoTimeout);
<br />
    }
<br /></p><p>    public void connect() throws IOException
<br />
    {
<br />
        if (connected)
<br />
        {
<br />
            return;
<br />
        }
<br /></p><p>        try
<br />
        {
<br />
            if ("http".equals(url.getProtocol())) // &amp;&amp; 
!failedOnce &lt;-
<br />
PRIVATE
<br />
            {
<br />
                // for safety's sake, as reported by KLGroup
<br />
                synchronized (url)
<br />
                {
<br />
                    http = HttpTimeoutClient.getNew(url);
<br />
                }
<br />
            }
<br />
            else
<br />
            {
<br />
                if (handler instanceof HttpTimeoutHandler)
<br />
                {
<br />
                    http = new HttpTimeoutClient(super.url,
<br />
((HttpTimeoutHandler)handler).getProxy(),
<br />
((HttpTimeoutHandler)handler).getProxyPort());
<br />
                }
<br />
                else
<br />
                {
<br />
                    throw new IOException("HttpTimeoutHandler
<br />
expected");
<br />
                }
<br />
            }
<br /></p><p>            ps = (PrintStream)http.getOutputStream();
<br />
        }
<br />
        catch (IOException e)
<br />
        {
<br />
            throw e;
<br />
        }
<br /></p><p>        connected = true;
<br />
    }
<br /></p><p>    protected HttpClient getNewClient(URL url)
<br />
        throws IOException
<br />
    {
<br />
        HttpTimeoutClient httpTimeoutClient = new HttpTimeoutClient
<br />
(url, (String)null, -1);
<br />
        return httpTimeoutClient;
<br />
    }
<br /></p><p>    protected HttpClient getProxiedClient(URL url, String 
s, int i)
<br />
        throws IOException
<br />
    {
<br />
        HttpTimeoutClient httpTimeoutClient = new HttpTimeoutClient
<br />
(url, s, i);
<br />
        return httpTimeoutClient;
<br />
    }
<br /></p><p>}
<br /></p><p>/* HttpTimeoutHandler.java */
<br />
import java.net.*;
<br />
import java.io.IOException;
<br /></p><p>public class HttpTimeoutHandler extends
<br />
sun.net.www.protocol.http.Handler
<br />
{
<br />
    private int iSoTimeout=0;
<br /></p><p>    public HttpTimeoutHandler(int iSoTimeout)
<br />
    {
<br />
        // Divide the time out by two because two connection attempts
<br />
are made
<br />
        // in HttpClient.parseHTTP()
<br /></p><p>        if (iSoTimeout%2!=0)
<br />
        {
<br />
            iSoTimeout++;
<br />
        }
<br />
        this.iSoTimeout = (iSoTimeout/2);
<br />
    }
<br /></p><p>    protected java.net.URLConnection openConnection(URL u) throws
<br />
IOException
<br />
    {
<br />
        return new HttpTimeoutURLConnection(u, this, iSoTimeout);
<br />
    }
<br /></p><p>    protected String getProxy()
<br />
    {
<br />
        return proxy;
<br />
    }
<br /></p><p>    protected int getProxyPort()
<br />
    {
<br />
        return proxyPort;
<br />
    }
<br />
}
<br /></p><p>/* HttpTimeoutFactory.java */
<br />
import java.net.*;
<br /></p><p>public class HttpTimeoutFactory implements 
URLStreamHandlerFactory
<br />
{
<br />
    private int iSoTimeout=0;
<br /></p><p>    public HttpTimeoutFactory(int iSoTimeout)
<br />
    {
<br />
        this.iSoTimeout = iSoTimeout;
<br />
    }
<br /></p><p>    public URLStreamHandler createURLStreamHandler(String str)
<br />
    {
<br />
        return new HttpTimeoutHandler(iSoTimeout);
<br />
    }
<br />
}
<br /></p><p>/* HttpTimeoutClient.java */
<br />
import sun.net.www.http.HttpClient;
<br />
import java.net.*;
<br />
import sun.net.*;
<br />
import sun.net.www.*;
<br />
import java.io.*;
<br /></p><p>public class HttpTimeoutClient extends HttpClient
<br />
{
<br />
    private static int iSoTimeout=0;
<br /></p><p>    public HttpTimeoutClient(URL url, String proxy, int 
proxyPort)
<br />
throws IOException
<br />
    {
<br />
        super(url, proxy, proxyPort);
<br />
    }
<br /></p><p>    public HttpTimeoutClient(URL url) throws IOException
<br />
    {
<br />
        super(url, null, -1);
<br />
    }
<br /></p><p>    public static HttpTimeoutClient getNew(URL url)
<br />
        throws IOException
<br />
    {
<br />
        HttpTimeoutClient httpTimeoutClient = (HttpTimeoutClient)
<br />
kac.get(url);
<br /></p><p>        if (httpTimeoutClient == null)
<br />
        {
<br />
            httpTimeoutClient = new HttpTimeoutClient (url);  // CTOR
<br />
called openServer()
<br />
        }
<br />
        else
<br />
        {
<br />
            httpTimeoutClient.url = url;
<br />
        }
<br /></p><p>        return httpTimeoutClient;
<br />
    }
<br /></p><p>    public static void setSoTimeout(int iNewSoTimeout)
<br />
    {
<br />
        iSoTimeout=iNewSoTimeout;
<br />
    }
<br /></p><p>    public static int getSoTimeout()
<br />
    {
<br />
        return iSoTimeout;
<br />
    }
<br /></p><p>    // Override doConnect in NetworkClient
<br /></p><p>    protected Socket doConnect(String s, int i)
<br />
        throws IOException, UnknownHostException, SocketException
<br />
    {
<br />
        Socket socket=super.doConnect(s,i);
<br /></p><p>        // This is the important bit
<br />
        socket.setSoTimeout(iSoTimeout);
<br />
        return socket;
<br />
    }
<br /></p><p>}
<br /></p><p>/* Example use */
<br />
import java.util.*;
<br />
import java.io.*;
<br />
import java.net.*;
<br /></p><p>public class SystemProperty
<br />
{
<br />
    public static void main(String[] args)
<br />
    {
<br />
        String sSoapUrl="<a href="http://192.168.0.223/mobaqSecurity/SslTunnelServlet">http://192.168.0.223/mobaqSecurity/SslTunnelServlet</a>";
<br />
        System.out.println("Connecting to [" + sSoapUrl + "]");
<br /></p><p>        URLConnection urlConnection = null;
<br />
        URL url=null;
<br /></p><p>        try
<br />
        {
<br />
            url = new URL((URL)null, sSoapUrl, new
<br />
HttpTimeoutHandler(10000));
<br />
            urlConnection = url.openConnection();
<br /></p><p>            // Optional
<br />
            url.setURLStreamHandlerFactory(new
<br />
HttpTimeoutFactory(10000));
<br /></p><p>            System.out.println("Url class
<br />
["+urlConnection.getClass().getName()+"]");
<br />
        }
<br />
        catch (MalformedURLException mue)
<br />
        {
<br />
            System.out.println("&gt;&gt;MalformedURLException&lt;&lt;");
<br />
            mue.printStackTrace();
<br />
        }
<br />
        catch (IOException ioe)
<br />
        {
<br />
            System.out.println("&gt;&gt;IOException&lt;&lt;");
<br />
            ioe.printStackTrace();
<br />
        }
<br /></p><p>        HttpURLConnection httpConnection =
<br />
(HttpURLConnection)urlConnection;
<br />
        System.out.println("Connected to [" + sSoapUrl + "]");
<br /></p><p>        byte[] messageBytes=new byte[10000];
<br />
        for (int i=0; i&lt;10000; i++)
<br />
        {
<br />
            messageBytes[i]=80;
<br />
        }
<br /></p><p>        try
<br />
        {
<br />
            httpConnection.setRequestProperty("Connection", "Close");
<br />
            httpConnection.setRequestProperty("Content-Length",
<br />
String.valueOf(messageBytes.length));
<br />
            httpConnection.setRequestProperty("Content-Type",
<br />
"text/xml; charset=utf-8");
<br />
            httpConnection.setRequestMethod("POST");
<br />
            httpConnection.setDoOutput(true);
<br />
            httpConnection.setDoInput(true);
<br />
        }
<br />
        catch (ProtocolException pe)
<br />
        {
<br />
            System.out.println("&gt;&gt;ProtocolException&lt;&lt;");
<br />
            pe.printStackTrace();
<br />
        }
<br /></p><p>        OutputStream outputStream=null;
<br /></p><p>        try
<br />
        {
<br />
            System.out.println("Getting output stream");
<br />
            outputStream =httpConnection.getOutputStream();
<br />
            System.out.println("Got output stream");
<br /></p><p>            outputStream.write(messageBytes);
<br />
        }
<br />
        catch (IOException ioe)
<br />
        {
<br />
            System.out.println("&gt;&gt;IOException&lt;&lt;");
<br />
            ioe.printStackTrace();
<br />
        }
<br /></p><p style="">        try
<br />
        {
<br />
            System.out.println("Getting input stream");
<br />
            InputStream is=httpConnection.getInputStream();
<br />
            System.out.println("Got input stream");
<br /></p><p>            byte[] buf = new byte[1000];
<br />
            int i;
<br /></p><p>            while((i = is.read(buf)) &gt; 0)
<br />
            {
<br />
                System.out.println(""+new String(buf));
<br />
            }
<br />
            is.close();
<br />
        }
<br />
        catch (Exception ie)
<br />
        {
<br />
            ie.printStackTrace();
<br />
        }
<br /></p><p>    }
<br />
}
<br /></p>Cheers,
<br />
Niels
<br /><br />来源:http://coding.derkeiler.com/Archive/Java/comp.lang.java.programmer/2004-01/3271.html<br />     http://www.weblogicfans.net/viewthread.php?tid=1101<br />     http://forums.sun.com/thread.jspa?threadID=568948<br />备注：在HttpTimeoutClient类中的第二个构造函数中的：super(url,null,-1)改为super(url,
(String)null,-1)即可。<br /><img src ="http://www.blogjava.net/leekiang/aggbug/318274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-04-14 17:04 <a href="http://www.blogjava.net/leekiang/archive/2010/04/14/318274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpURLConnection设置网络超时</title><link>http://www.blogjava.net/leekiang/archive/2010/04/13/318185.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Tue, 13 Apr 2010 11:00:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/04/13/318185.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/318185.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/04/13/318185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/318185.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/318185.html</trackback:ping><description><![CDATA[Java中可以使用HttpURLConnection来请求WEB资源。<br />HttpURLConnection对象不能直接构造，需要通过
URL.openConnection()来获得HttpURLConnection对象，示例代码如下：<br />String urlStr= <a href="http://www.jaddy.org/">www.ttt.org</a>;<br />URL url = new 
URL(urlStr);<br />HttpURLConnection conn = 
(HttpURLConnection)url.openConnection();
<p> </p><p style="line-height: 150%;">HttpURLConnection是基于HTTP协议的，其底层通过socket通信实
现。如果不设置超时（timeout），在网络异常的情况下，可能会导致程序僵死而不继续往下执行。可以通过以下两个语句来设置相应的超时：<br />System.setProperty("sun.net.client.defaultConnectTimeout",
 超时毫秒数字符串);<br />System.setProperty("sun.net.client.defaultReadTimeout", 
超时毫秒数字符串);<br /></p><p style="line-height: 150%;">其中： 
sun.net.client.defaultConnectTimeout：连接主机的超时时间（单位：毫秒）<br />sun.net.client.defaultReadTimeout：
从主机读取数据的超时时间（单位：毫秒） </p><p style="line-height: 150%;">例如：<br />System.setProperty("sun.net.client.defaultConnectTimeout",
 "30000");<br />System.setProperty("sun.net.client.defaultReadTimeout", 
"30000"); </p><p style="line-height: 150%;">JDK 
1.5以前的版本，只能通过设置这两个系统属性来控制网络超时。在1.5中，还可以使用HttpURLConnection的父类
URLConnection的以下两个方法：<br />setConnectTimeout：设置连接主机超时（单位：毫秒）<br />setReadTimeout：
设置从主机读取数据超时（单位：毫秒） </p><p style="line-height: 150%;">例如：<br />HttpURLConnection urlCon = 
(HttpURLConnection)url.openConnection();<br />urlCon.setConnectTimeout(30000);<br />urlCon.setReadTimeout(30000); <br /></p><p style="line-height: 150%;">来源:http://www.xd-tech.com.cn/blog/article.asp?id=37</p><p style="line-height: 150%;">另外可参考<a target="_blank" href="http://hi.baidu.com/xisct/blog/item/e0ba1fa7a49ee291d0435834.html">java中处理http连接超时的方法</a></p><p style="line-height: 150%;"><a target="_blank" href="/supercrsky/articles/247449.html">JDK中的URLConnection参数详解<br /></a></p><p style="line-height: 150%;"><a target="_blank" href="http://hi.baidu.com/%CE%DE%D0%C4%CF%F2%BA%F3/blog/item/3e00d5805869a0a90df4d245.html">linux下设置connect连接超时的方法</a></p><p style="line-height: 150%;"><a href="http://lgh3292.javaeye.com/blog/283425" style="" target="_blank">java socket 用法(一)<br /></a></p><p style="line-height: 150%;">Linux，可以修改/proc/sys/net/ipv4/tcp_syn_retries的值，缺省是72，大约5分钟左右，改小点时间就短些</p><img src ="http://www.blogjava.net/leekiang/aggbug/318185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-04-13 19:00 <a href="http://www.blogjava.net/leekiang/archive/2010/04/13/318185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.io.CharConversionException: Not an ISO 8859-1 character: xx</title><link>http://www.blogjava.net/leekiang/archive/2010/03/05/314552.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 04 Mar 2010 17:43:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/03/05/314552.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/314552.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/03/05/314552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/314552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/314552.html</trackback:ping><description><![CDATA[调用Action获取字符串，其中包含中文，使用如下代码输出：
<p>ServletOutputStream out = response.getOutputStream(); <br />
request.setAttribute("xmlTree", tree);<br />
out.print(tree);</p><p>使用的编码是GBK,在JDK1.5运行抛出异常：</p><p>java.io.CharConversionException: Not an ISO 8859-1 character: 树<br /></p><p>at javax.servlet.ServletOutputStream.print(ServletOutputStream.java:88)</p><p style="">问题可能出现在ServletOutputStream上，于是用PrintWriter替换了ServletOutputStream，运行正确，如：</p><p style="">PrintWriter pw = response.getWriter();<br />pw.print(tree);</p><p style=""><br /></p><p style="">参考:</p><p style="">http://hi.baidu.com/icewee/blog/item/24f28d24016f536934a80f11.html<br /></p><p><br /></p><img src ="http://www.blogjava.net/leekiang/aggbug/314552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-03-05 01:43 <a href="http://www.blogjava.net/leekiang/archive/2010/03/05/314552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操作数组</title><link>http://www.blogjava.net/leekiang/archive/2010/01/14/309489.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Thu, 14 Jan 2010 10:43:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/01/14/309489.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/309489.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/01/14/309489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/309489.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/309489.html</trackback:ping><description><![CDATA[1，List转数组<br />    List list = new ArrayList();<br />        list.add("1");<br />        list.add("2");<br />        int size = list.size();<br />        String[] arr = (String[]) list.toArray(new String[size]);<br />     必须带参数new String[size]，否则会报造型异常<br /><br />2, 数组转List<br />    String[] arr = new String[] {"1", "2"};<br />    List list = Arrays.asList(arr);<br /><br />3,  Arrays.binarySearch(Object[] arr,Object key)<br />    public static int <b>binarySearch</b>(int[] a,int key)使用二进制搜索算法来搜索指定的 int 型数组，以获得指定的值。<strong>必须</strong>在进行此调用之前对数组进行排序（通过上面的 <tt>sort</tt> 方法）。如果没有对数组进行排序，则结果是不明确的。如果数组包含多个带有指定值的元素，则无法保证找到的是哪一个。<br />    也就是说必须先执行Arrays.sort，再执行Arrays.binarySearch<br /><br />4, commons-lang的ArrayUtils<br />   1)ArrayUtils.contains()方法可以判定数组是否存在指完元素.比Arrays.binarySearch好用(见上文)<br />     当然有两个比较实用的方法ArrayUtils.lastIndexOf()和ArrayUtils.indexOf()<br />   3)使用ArrayUtils.reverse(arr)方法可以反转一个数组<br />   4)使用ArrayUtils.toObject(arr)和ArrayUtils.toPrimitive(arr)两个方法，<br />     即可互相转换基本类型数组和对象数组<br />   5)ArrayUtils.toString()方法可以输入数组内容，此方法接受任意一个数组<br />     作为参数并输出其内容，输出时所有元素位于大括号，中间逗号隔开。<br />     如new String[] { "1","2","3","fd","3g"}会输出为字符串"{1,2,3,fd,3g}"<br />   6)<span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 判断数组是否为空(null和length=0的时候都为空)</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        ArrayUtils.isEmpty(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]);</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> true</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        ArrayUtils.isEmpty(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Object[] { </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);"> });</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> false<br />   7)</span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 合并两个数组</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        ArrayUtils.addAll(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[] { </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);"> }, </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[] { </span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);"> });</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> {1,3,5,2,4}</span><br />   8)<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 删除数组中某个对象(从正序开始搜索,删除第一个)</span><span style="color: rgb(0, 128, 0);"> 注意只删除一个<br /></span><span style="color: rgb(0, 0, 0);">        ArrayUtils.removeElement(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[] { </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);"> }, </span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">);</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> {1,5}</span><br /><span style="color: rgb(0, 128, 0);"><br /></span><br /><br /><br /><img src ="http://www.blogjava.net/leekiang/aggbug/309489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-01-14 18:43 <a href="http://www.blogjava.net/leekiang/archive/2010/01/14/309489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数学公式解析和计算</title><link>http://www.blogjava.net/leekiang/archive/2010/01/06/308369.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Tue, 05 Jan 2010 16:44:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2010/01/06/308369.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/308369.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2010/01/06/308369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/308369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/308369.html</trackback:ping><description><![CDATA[JEP<br />http://www.singularsys.com/jep/<br />https://sourceforge.net/projects/jep/<br />http://rabbit8.bokee.com/3936531.html<br />http://suneca.com/article.asp?id=28<br /><br />http://www.javaeye.com/topic/58422里办法多<br /><br />关于jexl<br />1,jexl1.1计算分母为0的表达式时，竟然算出来的值为0，被某人说没有逻辑https://issues.apache.org/jira/browse/JEXL-45<br />2,jexl2解决了这个问题，但jexl2依赖jdk5<br />https://issues.apache.org/jira/browse/JEXL-58<br />handles ArithmeticException (divide by zero)<br />division by zero ignored only if JexlEngine.isSilent()<br /><div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); 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: rgb(0, 0, 0);">JexlEngine jexl </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> JexlEngine();<br />jexl.setCache(</span><span style="color: rgb(0, 0, 0);">512</span><span style="color: rgb(0, 0, 0);">);</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">有何用</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">jexl.setLenient(</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">);</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">什么意思</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">jexl.setSilent(</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">);</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />String calculate </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">(G1 + G2)/2</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />Expression e </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">jexl.createExpression(calculate);<br /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> populate the context</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">JexlContext context </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> MapContext();<br />context.set(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">G1</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />context.set(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">G2</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">5</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />Object res </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> e.evaluate(context);</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 128, 0);">//silent</span><span style="color: rgb(0, 128, 0);">为false时evaluate方法会抛异常，为true不抛异常但res为null</span><span style="color: rgb(0, 128, 0);"><br /></span></div><br />            <br />另外，利用oracle计算,如果分母为0会报ORA-01476: divisor is equal to zero<br /><img src ="http://www.blogjava.net/leekiang/aggbug/308369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2010-01-06 00:44 <a href="http://www.blogjava.net/leekiang/archive/2010/01/06/308369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpURLConnection 的使用</title><link>http://www.blogjava.net/leekiang/archive/2009/10/21/299193.html</link><dc:creator>leekiang</dc:creator><author>leekiang</author><pubDate>Wed, 21 Oct 2009 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/leekiang/archive/2009/10/21/299193.html</guid><wfw:comment>http://www.blogjava.net/leekiang/comments/299193.html</wfw:comment><comments>http://www.blogjava.net/leekiang/archive/2009/10/21/299193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leekiang/comments/commentRss/299193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leekiang/services/trackbacks/299193.html</trackback:ping><description><![CDATA[System.setProperty("sun.net.client.defaultConnectTimeout", "3000");<br />        System.setProperty("sun.net.client.defaultReadTime ", "3000"); <br />        <br />        URL url1=null;<br />        try {<br />            url1 = new URL(url);<br />            HttpURLConnection urlCon = (HttpURLConnection)url1.openConnection();<br />            System.out.println(urlCon);<br />             BufferedReader in = null;<br />                try {<br />                  in = new BufferedReader(<br />                    new InputStreamReader(<br />                            urlCon.getInputStream()));<br />                  String inputLine;<br />                  while (<br />                    (inputLine = in.readLine()) != null) {<br />                    System.out.println(inputLine);<br />                  }<br />                } catch (IOException e) {<br />                  e.printStackTrace();<br />                }<br />                in.close();<br />                urlCon.disconnect();<br />        } catch (Exception e1) {<br />            e1.printStackTrace();<br />        } <br /><br />http://tech.techweb.com.cn/archiver/tid-225522.html<br />http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/net/HttpURLConnection.html<br />http://zhuixue.javaeye.com/blog/385793<br /><img src ="http://www.blogjava.net/leekiang/aggbug/299193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leekiang/" target="_blank">leekiang</a> 2009-10-21 14:12 <a href="http://www.blogjava.net/leekiang/archive/2009/10/21/299193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>