ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合久久美利坚合众国,欧美大奶一区二区,久久久亚洲精选http://blogjava.net/stevenjohn/category/51240.html那些青春的岁æœ?/description>zh-cnThu, 21 May 2015 19:00:30 GMTThu, 21 May 2015 19:00:30 GMT60Java for foreachhttp://www.aygfsteel.com/stevenjohn/archive/2015/05/21/425223.htmlabinabinThu, 21 May 2015 15:59:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/05/21/425223.htmlhttp://www.aygfsteel.com/stevenjohn/comments/425223.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/05/21/425223.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/425223.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/425223.htmljava 有for(;;)å’?for(Object obj : List/Array)

最明显的一个:前者是有范å›ß_¼›åŽè€…是全部ã€?br />

ž®Þq¼–码来说各有好处:for更灵‹z»ï¼Œforeach更简ä¾?br />

forå’Œforeach都是java中重要的集合遍历æ–ÒŽ³• 
for循环�你可以选择从前往后遍历,也可以从后往前遍历,也可以不遍历默写�
但是foreach只能从前往后遍历,而且每一个都会遍历一‹Æ¡ï¼Œä»–们之间的选择得看你项目程序中的需求而定
JVM在解释执行行åQŒéƒ½ä¼šå°†for与foreach解释成iteratorã€?/pre>

æ€È»“如下åQ?/p>

1.如果只是遍历集合或者数¾l„,用foreach好些åQŒå¿«äº›ã€?/p>

2.如果寚w›†åˆä¸­çš„倯D¿›è¡Œä¿®æ”¹ï¼Œž®Þp¦ç”¨for循环了ã€?br />其实foreach的内部原理其实也是Iterator,但它不能像Iterator一样可以äh为的控制åQŒè€Œä¸”也不能调用iterator.remove()åQ?br />更不能ä‹É用下标来讉K—®æ¯ä¸ªå…ƒç´ åQŒæ‰€ä»¥ä¸èƒ½ç”¨äºŽå¢žåŠ ï¼Œåˆ é™¤½{‰å¤æ‚的操作ã€?/p>





]]>
JDK动态代理和CGLib动态代ç?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2015/04/22/424585.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 21 Apr 2015 16:22:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2015/04/22/424585.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/424585.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2015/04/22/424585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/424585.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/424585.html</trackback:ping><description><![CDATA[<div>静态代ç?/div><div>静态代理相å¯ÒŽ¥è¯´æ¯”较简单,无非ž®±æ˜¯èšåˆ+多态:</div><div></div><div>参考:设计模式½W”è®° – Proxy 代理模式 (Design Pattern)</div><div></div><div>动态代ç?/div><div>我们知道åQŒé€šè¿‡ä½¿ç”¨ä»£ç†åQŒå¯ä»¥åœ¨è¢«ä»£ç†çš„¾cÈš„æ–ÒŽ³•的前后添加一些处理方法,˜q™æ ·ž®Þp¾¾åˆîCº†¾cÖM¼¼AOP的效果。而JDK中提供的动态代理,ž®±æ˜¯å®žçްAOP的绝好底层技术ã€?/div><div></div><div>JDK动态代ç?/div><div>JDK动态代理主要涉及到java.lang.reflect包中的两个类åQšProxyå’ŒInvocationHandler。InvocationHandler是一个接口,通过实现该接口定义横切逻辑åQŒåƈ通过反射机制调用目标¾cȝš„代码åQŒåŠ¨æ€å°†æ¨ªåˆ‡é€»è¾‘å’Œä¸šåŠ¡é€»è¾‘¾~–制在一赗÷€?/div><div></div><div>Proxy利用InvocationHandler动态创å»ÞZ¸€ä¸ªç¬¦åˆæŸä¸€æŽ¥å£çš„实例,生成目标¾cȝš„代理对象ã€?/div><div></div><div>例子åQšJava½W”è®° – 反射 动态代ç?/div><div></div><div>CGLib动态代ç?/div><div>˜q˜æœ‰ä¸€ä¸ªå«CGLib的动态代理,CGLib全称为Code Generation LibraryåQŒæ˜¯ä¸€ä¸ªå¼ºå¤§çš„高性能åQŒé«˜è´¨é‡çš„代码生成类库,可以在运行期扩展Java¾cÖM¸Žå®žçްJava接口åQŒCGLibž®è£…了asmåQŒå¯ä»¥å†˜qè¡ŒæœŸåŠ¨æ€ç”Ÿæˆæ–°çš„class。和JDK动态代理相比较åQšJDK创徏代理有一个限åˆÓž¼Œž®±æ˜¯åªèƒ½ä¸ºæŽ¥å£åˆ›å»ÞZ»£ç†å®žä¾‹ï¼Œè€Œå¯¹äºŽæ²¡æœ‰é€šè¿‡æŽ¥å£å®šä¹‰ä¸šåŠ¡æ–ÒŽ³•的类åQŒåˆ™å¯ä»¥é€šè¿‡CGLib创徏动态代理ã€?/div><div><br /><p>CGLib采用非常底层的字节码技术,可以ä¸ÞZ¸€ä¸ªç±»åˆ›å¾å­ç±»åQŒåƈ在子¾cÖM¸­é‡‡ç”¨æ–ÒŽ³•拦截的技术拦截所有父¾cÀL–¹æ³•的调用åQŒåƈ™åºåŠ¿¾l‡å…¥æ¨ªåˆ‡é€»è¾‘ã€?/p> <div class="wmqeeuq" id="JDK动态代理和CGLib的比è¾?>JDK动态代理和CGLib的比è¾?/div> <p>CGLib所创徏的动态代理对象的性能比JDK所创徏的代理对象性能高不ž®‘,大概10倍,但CGLib在创å»ÞZ»£ç†å¯¹è±¡æ—¶æ‰€èŠÞp´¹çš„æ—¶é—´å´æ¯”JDK动态代理多大概8倍,所以对于singletonçš„ä»£ç†å¯¹è±¡æˆ–è€…å…·æœ‰å®žä¾‹æ± çš„ä»£ç†ï¼Œå› äØ“æ— éœ€é¢‘ç¹çš„åˆ›å»ºæ–°çš„å®žä¾‹ï¼Œæ‰€ä»¥æ¯”è¾ƒé€‚åˆCGLib动态代理技术,反之则适用于JDK动态代理技术。另外,ç”׃ºŽCGLib采用动态创建子¾cÈš„æ–¹å¼ç”Ÿæˆä»£ç†å¯¹è±¡åQŒæ‰€ä»¥ä¸èƒ½å¯¹ç›®æ ‡¾cÖM¸­çš„finalåQŒprivate½{‰æ–¹æ³•进行处理。所以,大家需要根据实际的情况选择使用什么样的代理了ã€?/p> <p>同样的,Springçš„AOP¾~–程中相关的ProxyFactory代理工厂内部ž®±æ˜¯ä½¿ç”¨JDK动态代理或CGLib动态代理的åQŒé€šè¿‡åŠ¨æ€ä»£ç†ï¼Œž®†å¢žå¼ºï¼ˆadvice)应用到目标类中ã€?/p><br /><div>JDK动态代理主要用到java.lang.reflect包中的两个类åQšProxyå’ŒInvocationHandler.</div> <div> </div> <div>InvocationHandler是一个接口,通过实现该接口定义横切逻辑åQŒåƈ通过反射机制调用目标¾cȝš„代码åQŒåŠ¨æ€çš„ž®†æ¨ªåˆ‡é€»è¾‘和业务逻辑¾~–织在一赗÷€?/div> <div> </div> <div>Proxy利用InvocationHandler动态创å»ÞZ¸€ä¸ªç¬¦åˆæŸä¸€æŽ¥å£çš„实例,生成目标¾cȝš„代理对象ã€?/div><br /></div><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/424585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2015-04-22 00:22 <a href="http://www.aygfsteel.com/stevenjohn/archive/2015/04/22/424585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 帔R‡æ±?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2015/03/31/424000.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 31 Mar 2015 10:22:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2015/03/31/424000.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/424000.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2015/03/31/424000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/424000.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/424000.html</trackback:ping><description><![CDATA[<div> If you are not sure about the string pool usage, try -XX:+PrintStringTableStatistics JVM argument. It will print you the string pool usage when your program terminates.</div><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/424000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2015-03-31 18:22 <a href="http://www.aygfsteel.com/stevenjohn/archive/2015/03/31/424000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中Staticæ–ÒŽ³•å’ŒStatic½E‹åºå—的用法æ€È»“http://www.aygfsteel.com/stevenjohn/archive/2015/03/25/423823.htmlabinabinWed, 25 Mar 2015 07:24:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/03/25/423823.htmlhttp://www.aygfsteel.com/stevenjohn/comments/423823.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/03/25/423823.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/423823.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/423823.htmlStatic 静态:˜q™é‡Œä¸»è¦è®°å½•的是静态程序块和静态方æ³?/p>

如果有些代码必须在项目启动的时候就执行,ž®±éœ€è¦ä‹É用静态代码块,˜q™ç§ä»£ç æ˜¯ä¸»åŠ¨æ‰§è¡Œçš„;需要在™å¹ç›®å¯åŠ¨çš„æ—¶å€™å°±åˆå§‹åŒ–ä½†æ˜¯ä¸æ‰§è¡Œ,在不创徏对象的情况下,可以供其他程序调ç”?而在调用的时候才执行åQŒè¿™éœ€è¦ä‹É用静态方æ³?˜q™ç§ä»£ç æ˜¯è¢«åŠ¨æ‰§è¡Œçš„. 静态方法在¾cÕdŠ è½½çš„æ—¶å€?ž®±å·²¾låŠ è½?可以用类名直接调用ã€?/p>

静态代码块和静态方法的区别是:

静态代码块是自动执行的;

静态方法是被调用的时候才执行�

静态方法:如果我们在程序编写的时候需要一个不实例化对象就可以调用的方法,我们ž®±å¯ä»¥ä‹É用静态方法,具体实现是在æ–ÒŽ³•前面加上staticåQŒå¦‚下:

public static void method(){}

在ä‹É用静态方法的时候需要注意一下几个方面:

在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法)åQŒè€Œä¸èƒ½ç›´æŽ¥è®¿é—®ç±»ä¸­çš„非静态成员。这是因为,对于非静态的æ–ÒŽ³•和变量,需要先创徏¾cȝš„实例对象后才可ä‹É用,而静态方法在使用前不用创å»ÞZ“Q何对象。(备注åQšé™æ€å˜é‡æ˜¯å±žäºŽæ•´ä¸ª¾cȝš„变量而不是属于某个对象的åQ?/p>

静态方法不能以ä»ÖM½•方式引用thiså’Œsuperå…³é”®å­—ï¼Œå› äØ“é™æ€æ–¹æ³•åœ¨ä½¿ç”¨å‰ä¸ç”¨åˆ›å»ÞZ“Q何实例对象,当静态方法调用时åQŒthis所引用的对象根本没有äñ”生ã€?/p>

静态程序块åQšå½“一个类需要在被蝲入时ž®±æ‰§è¡Œä¸€ŒD늨‹åºï¼Œ˜q™æ ·å¯ä»¥ä½¿ç”¨é™æ€ç¨‹åºå—ã€?/p>

public class DemoClass {

private DemoClass(){}

public static DemoClass _instance;

static{

if(null == _instance ){

_instance = new DemoClass();

}

}

public static DemoClass getInstance(){

return _instance;

}

}

˜q™æ ·çš„程序在¾c»è¢«åŠ è²çš„æ—¶å€™å°±æ‰§è¡Œäº†static中的代码ã€?/p>

Ps:java中类的装载步骤:

在Java中,¾c»è£…载器把一个类装入Java虚拟æœÞZ¸­åQŒè¦¾lè¿‡ä¸‰ä¸ªæ­¥éª¤æ¥å®Œæˆï¼šè£…蝲、链接和初始化,其中链接又可以分成校验、准备和解析三步åQŒé™¤äº†è§£æžå¤–åQŒå…¶å®ƒæ­¥éª¤æ˜¯ä¸¥æ ¼æŒ‰ç…§™åºåºå®Œæˆçš„,各个步骤的主要工作如下:

所谓装载就是寻找一个类或是一个接口的二进制åÅžå¼åÆˆç”¨è¯¥äºŒè¿›åˆ¶åŞ式来构造代表这个类或是˜q™ä¸ªæŽ¥å£çš„class对象的过½E‹ã€‚其中类或接口的名称是给定了的ã€?/p>

装蝲åQšæŸ¥æ‰‘Ö’Œå¯¼å…¥¾cÀLˆ–接口的二˜q›åˆ¶æ•°æ®åQ?/p>

链接åQšæ‰§è¡Œä¸‹é¢çš„æ ¡éªŒã€å‡†å¤‡å’Œè§£æžæ­¥éª¤åQŒå…¶ä¸­è§£æžæ­¥éª¤æ˜¯å¯ä»¥é€‰æ‹©çš„ï¼›

校验åQšæ£€æŸ¥å¯¼å…¥ç±»æˆ–æŽ¥å£çš„äºŒè¿›åˆ¶æ•°æ®çš„æ­£ç¡®æ€§ï¼›

准备åQšç»™¾cȝš„é™æ€å˜é‡åˆ†é…åÆˆåˆå§‹åŒ–å­˜å‚¨ç©ºé—ß_¼›

解析åQšå°†½W¦å·å¼•用转成直接引用åQ?/p>

初始化:‹È€‹zȝ±»çš„静态变量的初始化Java代码和静态Java代码å?/p>

]]>
JAVA内存占用http://www.aygfsteel.com/stevenjohn/archive/2014/08/01/416458.htmlabinabinFri, 01 Aug 2014 08:54:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2014/08/01/416458.htmlhttp://www.aygfsteel.com/stevenjohn/comments/416458.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2014/08/01/416458.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/416458.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/416458.html阅读全文

]]>
java位运½Ž?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2013/10/18/405417.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 18 Oct 2013 14:43:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2013/10/18/405417.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/405417.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2013/10/18/405417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/405417.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/405417.html</trackback:ping><description><![CDATA[<div><h1><a id="cb_post_title_url" style="margin: 0px; padding: 0px; color: #ff6600; text-decoration: initial;">java位运½Ž?br /><br /><div>http://www.cnblogs.com/highriver/archive/2011/08/15/2139600.html<br />单点ç™Õd½•åQ?br /><div>http://www.aygfsteel.com/rabbit/archive/2013/10/18/405392.html</div><br /></div></a></h1></div><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/405417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2013-10-18 22:43 <a href="http://www.aygfsteel.com/stevenjohn/archive/2013/10/18/405417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 占用字节æ•?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2013/10/18/405416.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Fri, 18 Oct 2013 14:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2013/10/18/405416.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/405416.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2013/10/18/405416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/405416.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/405416.html</trackback:ping><description><![CDATA[<span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; background-color: #f1fedd; "><pre id="best-content-843701432" accuse="aContent" class="best-text mb-10" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; "><a class="inner-link decor-none" target="_blank" rel="nofollow" data-word="0" style="color: #2d64b3; text-decoration: none; "><span style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; font-size: 14px; line-height: 24px; background-color: #f1fedd; "></span></a><pre id="best-content-843701432" accuse="aContent" mb-10"="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; "><a class="inner-link decor-none" target="_blank" rel="nofollow" data-word="0" style="color: #2d64b3; text-decoration: none; "></a><a decor-none"="" target="_blank" rel="nofollow" data-word="0" style="color: #2d64b3; text-decoration: none; ">数据¾cÕdž‹</a> 大小(二进制位æ•? 范围 默认å€?<br /><br />byte(字节) 8 -128 - 127 0<br />shot(短整åž? 16 -32768 - 32768 0<br />int(æ•´åž‹) 32 -2147483648-2147483648 0<br />long(é•¿æ•´åž? 64 -9233372036854477808-9233372036854477808 0 <br />float(<a decor-none"="" target="_blank" rel="nofollow" data-word="1" style="color: #2d64b3; text-decoration: none; ">‹¹®ç‚¹åž?/a>) 32 -3.40292347E+38-3.40292347E+38 0.0f<br />double(双精åº? 64 -1.79769313486231570E+308-1.79769313486231570E+308 0.0d<br />char(字符åž? 16 ‘ \u0000 - u\ffff ’ ‘\u0000 ’<br /></pre></pre></span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 'courier new', courier, 宋体, monospace; line-height: 24px; white-space: pre-wrap; background-color: #f1fedd; "><a class="inner-link decor-none" target="_blank" rel="nofollow" data-word="0" style="color: #2d64b3; text-decoration: none; "><span style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; font-size: 14px; line-height: 24px; background-color: #f1fedd; "></span></a><pre id="best-content-843701432" accuse="aContent" mb-10"="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; display: inline !important; "><a class="inner-link decor-none" target="_blank" rel="nofollow" data-word="0" style="color: #2d64b3; text-decoration: none; ">boolean(</a><a decor-none"="" target="_blank" rel="nofollow" data-word="2" style="color: #2d64b3; text-decoration: none; ">布尔åž?/a>) 1 true/false false</pre></span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; background-color: #f1fedd; "><pre accuse="aContent" class="best-text mb-10" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; "><br /><br /></pre></span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; background-color: #ffffff; "><h1 class="mb-5" accuse="qTitle" style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 16px; font: normal normal bold 16px/26px 'Microsoft YaHei', SimHei, arial; word-break: break-all; "><span id="wmqeeuq" class="ask-title" style="display: inline-block; width: 595px; overflow-x: hidden; overflow-y: hidden; ">JAVA基本数据¾cÕdž‹æ‰€å å­—节数是多ž®‘?</span></h1></span><span id="wmqeeuq" class="Apple-style-span" style="color: #494949; font-family: simsun; background-color: #e2e2e2; "><div>byte  <wbr>  <wbr> 1字节  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr> <wbr></div><div>short  <wbr>  <wbr>2字节  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr> <wbr></div><div>int  <wbr>  <wbr>  <wbr>4字节  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr> <wbr></div><div>long  <wbr>  <wbr> 8字节  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr> <wbr></div><div>char  <wbr>  <wbr> 2字节åQˆC语言中是1字节åQ‰å¯ä»¥å­˜å‚¨ä¸€ä¸ªæ±‰å­?/div><div>float  <wbr>  <wbr>4字节  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr> <wbr></div><div>double  <wbr> 8字节  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr> <wbr></div><div>boolean  <wbr>false/true(理论上占ç”?bit,1/8字节åQŒå®žé™…处理按1byte处理)  <wbr>  <wbr>  <wbr> </div></span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; background-color: #f1fedd; "><pre accuse="aContent" class="best-text mb-10" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; "><div><pre id="best-content-875525478" accuse="aContent" mb-10"="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; color: #333333; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 24px; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #f1fedd; ">JAVA是采用Unicode¾~–码。每一个字节占8位。你电脑¾pȝ»Ÿåº”该æ˜?32位系¾lŸï¼Œ˜q™æ ·æ¯ä¸ªintž®±æ˜¯ 4个字èŠ?br /></pre></div></pre></span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; background-color: #ffffff; "><pre id="answer-content-252602844" accuse="aContent" class="answer-text mb-10" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; ">其中一个字节由8个二˜q›åˆ¶ä½ç»„æˆ?br /><br /></pre></span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; background-color: #ffffff; "><pre id="answer-content-487363632" accuse="aContent" class="answer-text mb-10" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; ">Java一共有8¿UåŸºæœ?a class="inner-link decor-none" target="_blank" rel="nofollow" data-word="0" style="color: #2d64b3; text-decoration: none; ">数据¾cÕdž‹</a>åQˆåŽŸå§?a class="inner-link decor-none" target="_blank" rel="nofollow" data-word="0" style="color: #2d64b3; text-decoration: none; ">数据¾cÕdž‹</a>åQ‰ï¼š <br />¾cÕdž‹ 存储要求 范围åQˆåŒ…含) 默认å€?包装¾c?br />æ•?int 4字节åQ?2位) -231~ 231-1 0 Integer<br />æ•?short 2字节åQ?6位) -215~215-1 0 Short<br />¾c?long 8字节åQ?4位) -263~263-1 0 Long<br />åž?byte 1字节åQ?位) -27~27-1 0 Byte<br />‹¹®ç‚¹ float 4字节åQ?2位) -3.4e+38 ~ 3.4e+38 0.0f Float<br />¾cÕdž‹ double 8字节åQ?4位) -1.7e+308 ~ 1.7e+308 0 Double<br />字符 char 2字节åQ?6位) u0000~uFFFFåQ?#8216;’~‘åQ?#8217;åQ?‘0’ Character<br /> åQ?~216-1åQ?5535åQ‰ï¼‰ <br />布尔 boolean 1/8字节åQ?位) true, false FALSE Boolean</pre></span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; background-color: #ffffff; "><pre accuse="aContent" class="answer-text mb-10" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; "><br /><br /><br /></pre></span><span id="wmqeeuq" class="Apple-style-span" style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff; "><span style="color: #333333; font-family: Arial; line-height: 26px; font-size: 18px; ">在移动开发中ç”׃ºŽ¿UÕdŠ¨è®‘Ö¤‡å†…存的局限性,往往需要考虑使用的数据类型所占用的字节数。下面简单介¾lä¸‹Java中几¿UåŸºæœ¬æ•°æ®ç±»åž‹ï¼Œä»¥åŠ æ·Þp®°å¿†ã€?br /><span style="color: #ff0000; ">在Java中一共有8¿UåŸºæœ¬æ•°æ®ç±»åž‹ï¼Œå…¶ä¸­æœ?¿Uæ•´åž‹ï¼Œ2¿UæÕQ点类型,1¿Uç”¨äºŽè¡¨½CºUnicode¾~–码的字½W¦å•元的字符¾cÕdž‹å’?¿Uç”¨äºŽè¡¨½CºçœŸå€¼çš„boolean¾cÕdž‹ã€‚(一个字节等äº?个bitåQ?/span><br /><br /><span style="color: #3333ff; ">1.æ•´åž‹</span><br />¾cÕdž‹              存储需æ±?    bitæ•?   å–倯DŒƒå›?nbsp;     备注<br />int                 4字节           4*8 <br />short             2字节           2*8    åQ?2768ï½?2767<br />long              8字节           8*8<br />byte              1字节           1*8     åQ?28ï½?27<br /><br /><span style="color: #3333ff; ">2.‹¹®ç‚¹åž?/span><br />¾cÕdž‹              存储需æ±?    bitæ•?   å–倯DŒƒå›?nbsp;     备注<br />float              4字节           4*8                  float¾cÕdž‹çš„æ•°å€¼æœ‰ä¸€ä¸ªåŽ¾~€F(例如åQ?.14F)<br />double          8字节           8*8                       没有后缀Fçš„æÕQç‚ÒŽ•°å€?å¦?.14)默认为double¾cÕdž‹<br /><br /><span style="color: #3333ff; ">3.char¾cÕdž‹</span><br />¾cÕdž‹              存储需æ±?    bitæ•?    å–å€ÆDŒƒå›?nbsp;     备注<br />char              2字节          2*8<br /><br /><span style="color: #3333ff; ">4.boolean¾cÕdž‹</span><br />¾cÕdž‹              存储需æ±?   bitæ•?   å–倯DŒƒå›?nbsp;     备注<br />boolean        1字节          1*8      false、true<br /></span><span style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; "></span><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; "><span style="font-size: 18px; "><br /></span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; "><span style="font-size: 18px; "><span style="color: #ff0000; ">补充åQ?/span>Java有一个能够表½CÞZ“Q意精度的½Ž—书包,通常¿UîCØ““大数å€?#8221;(big number)。虽然被¿UîCؓ大数å€û|¼Œä½†å®ƒòq¶ä¸æ˜¯ä¸€¿UJava¾cÕdž‹åQŒè€Œæ˜¯ä¸€ä¸ªJava对象ã€?/span></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; "><span style="font-size: 18px; ">如果基本的整数和‹¹®ç‚¹æ•°ç²¾åº¦ä¸èƒ½å¤Ÿæ»¡èƒö需求,那么可以使用java.math包中的两个很有用的类åQ?span style="color: #ff0000; ">BigIntegerBigDecimal(Android SDK中也包含了java.math包以及这两个¾c?</span>˜q™ä¸¤ä¸ªç±»å¯ä»¥å¤„理包含ä»ÀL„é•¿åº¦æ•°å­—序列的数倹{€‚BigInteger¾cÕd®žçŽîCº†ä»ÀL„¾_‘Öº¦çš„æ•´æ•°è¿½Ž—,BigDecimal实现了ä“Q意精度的‹¹®ç‚¹æ•°è¿½Ž—。具体的用法可以参见Java APIã€?/span></p><div><span style="font-size: 18px; "><div>http://blog.csdn.net/witsmakemen/article/details/8974200<br /></div></span></div></span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; background-color: #ffffff; "><pre accuse="aContent" class="answer-text mb-10" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; "><br /></pre></span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; background-color: #f1fedd; "><pre id="best-content-428742571" accuse="aContent" class="best-text mb-10" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; ">int常见ä¸?个字节,跟操作系¾lŸæœ‰å…³ç³»ã€?br />turbo cåQˆä»¥åŠTurbo c的一些衍生编译器åQŒä»–们用的一å¥?a class="inner-link decor-none" target="_blank" rel="nofollow" data-word="0" style="color: #2d64b3; text-decoration: none; ">¾~–译½E‹åº</a>åQ‰æ˜¯dos时代的编译器åQŒæ˜¯ä¸Šä¸–¾U?0òq´ä»£çš„äñ”物,严重˜q‡æ—¶åQŒå±žäºŽè€æŽ‰ç‰™çš„产品åQŒä»–们编译出来的½E‹åºæ˜?6位操作系¾lŸdos下的½E‹åºåQŒæ‰€ä»¥é•¿åº¦äØ“16位,即两个字节。windowsä¸ÞZº†å…¼å®¹dosåQŒæ‰€ä»¥turbo c生成的文件也可以在windows中运行ã€?br />其他一般就都是4个字节了ã€?/pre></span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 24px; background-color: #f5f5f5; ">操作¾pȝ»Ÿ16位的时候,int 2字节åQŒæ“ä½œç³»¾l?2位的时候,int 4字节åQŒç”±äº?2位系¾lŸä¹‹å‰å ä¸ÀLµåœîC½åQŒå®žé™…现在就½Ž—是64位系¾lŸï¼Œå‡ÞZºŽå…¼å®¹æ€§è€ƒè™‘åQŒint也是4字节çš?/span><span id="wmqeeuq" class="Apple-style-span" style="color: #333333; font-family: arial, 宋体, sans-serif, 'Microsoft YaHei', tahoma; line-height: 24px; background-color: #f1fedd; "><pre accuse="aContent" class="best-text mb-10" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; "><div><pre accuse="aContent" mb-10"="" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap; word-wrap: break-word; color: #333333; font-size: 14px; font-style: normal; font-variant: normal; letter-spacing: normal; line-height: 24px; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #f1fedd; "><br /></pre></div><br /><br /></pre></span><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/405416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2013-10-18 22:31 <a href="http://www.aygfsteel.com/stevenjohn/archive/2013/10/18/405416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA¾~–程中URL传值符åïLš„转换http://www.aygfsteel.com/stevenjohn/archive/2013/08/22/403200.htmlabinabinThu, 22 Aug 2013 12:23:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2013/08/22/403200.htmlhttp://www.aygfsteel.com/stevenjohn/comments/403200.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2013/08/22/403200.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/403200.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/403200.html有些½W¦å·åœ¨URL中是不能直接传递的åQŒå¦‚果要在URL中传递这些特ŒDŠç¬¦åøP¼Œé‚£ä¹ˆž®Þp¦ä½¿ç”¨ä»–们的编码了。下表中列出了一些URLç‰ÒޮнW¦å·åŠç¼–ç ?/p>

十六˜q›åˆ¶å€?/p>

 

1 + URL ä¸?可‚¡¨½Cºç©ºæ ?/td> %2B
2 ½Iºæ ¼ URL中的½Iºæ ¼å¯ä»¥ç”?åähˆ–者编ç ?/td> %20
3 / 分隔目录和子目录 %2F
4 ? 分隔实际�URL 和参�/td> %3F
5 % 指定ç‰ÒŽ®Šå­—符 %25
6 # 表示书签 %23
7 & URL 中指定的参数间的分隔½W?/td> %26
8 = URL 中指定参数的�/td> %3D

 
  解决的方法:

  replace() æ–ÒŽ³•如果直接用str.replace("-","!") 只会替换½W¬ä¸€ä¸ªåŒ¹é…çš„字符.

  而str.replace(/\-/g,"!")则可以替换掉全部匚w…çš„å­—½W?g为全局标志)ã€?/p>

  replace()

  js中替换字½W¦å˜é‡å¦‚下:

  data2=data2.replace(/\%/g,"%25");

  data2=data2.replace(/\#/g,"%23");

  data2=data2.replace(/\&/g,"%26");



]]>
java中的堆、栈、常量池http://www.aygfsteel.com/stevenjohn/archive/2013/05/23/399677.htmlabinabinThu, 23 May 2013 14:39:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2013/05/23/399677.htmlhttp://www.aygfsteel.com/stevenjohn/comments/399677.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2013/05/23/399677.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/399677.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/399677.htmlJava内存分配:

1. 寄存器:我们在程序中无法控制
2. 栈:存放基本¾cÕdž‹çš„æ•°æ®å’Œå¯¹è±¡çš„引用,但对象本íw«ä¸å­˜æ”¾åœ¨æ ˆä¸­ï¼Œè€Œæ˜¯å­˜æ”¾åœ¨å †ä¸?br />3. 堆:存放用new产生的数æ?br />4. 静态域åQšå­˜æ”‘Öœ¨å¯¹è±¡ä¸­ç”¨static定义的静态成å‘?br />5. 帔R‡æ± ï¼šå­˜æ”¾å¸”R‡
6. 非RAM(随机存取存储å™?/span>)存储åQšç¡¬ç›˜ç­‰æ°æ€¹…存储½Iºé—´
----------------------------------------------------------------------------------------------------------------------

a.在函æ•îC¸­å®šä¹‰çš„一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配ã€?nbsp; 
当在一ŒDµä»£ç å—定义一个变量时åQŒJavaž®±åœ¨æ ˆä¸­ä¸ø™¿™ä¸ªå˜é‡åˆ†é…å†…存空é—ß_¼Œå½“è¯¥å˜é‡é€€å‡ø™¯¥ä½œç”¨åŸŸåŽåQŒJavaä¼šè‡ªåŠ¨é‡Šæ”¾æŽ‰ä¸ø™¯¥å˜é‡æ‰€åˆ†é…çš„内存空é—ß_¼Œè¯¥å†…存空间可以立卌™¢«å¦ä½œä»–用ã€?nbsp; 
b.堆内存用来存攄¡”±new创徏的对象和数组ã€?nbsp;在堆中分配的内存åQŒç”±Java虚拟机的自动垃圾回收器来½Ž¡ç†ã€?nbsp; 
在堆中äñ”生了一个数¾l„或对象后,˜q˜å¯ä»¥åœ¨æ ˆä¸­å®šä¹‰ä¸€ä¸ªç‰¹ŒDŠçš„变量åQŒè®©æ ˆä¸­˜q™ä¸ªå˜é‡çš„取值等于数¾l„或对象在堆内存中的首地址åQŒæ ˆä¸­çš„˜q™ä¸ªå˜é‡ž®±æˆäº†æ•°¾l„或对象的引用变量ã€?nbsp; å¼•用变量ž®Þq›¸å½“äºŽæ˜¯äØ“æ•°ç»„æˆ–å¯¹è±¡è“v的一个名¿UŽÍ¼Œä»¥åŽž®±å¯ä»¥åœ¨½E‹åºä¸­ä‹É用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是ä¸?数组或者对象è“v的一个名¿U°ã€‚引用变量是普通的变量åQŒå®šä¹‰æ—¶åœ¨æ ˆä¸­åˆ†é…ï¼Œå¼•用变量在程序运行到其作用域之外后被释放。而数¾l„和对象本èín在堆中分配,即ä‹É½E‹åº˜qè¡ŒåˆîC‹Éç”?new 产生数组或者对象的语句所在的代码块之外,数组和对象本íw«å æ®çš„内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用åQŒä½†ä»ç„¶å æ®å†…å­˜½Iºé—´ä¸æ”¾åQŒåœ¨éšåŽçš„一个不¼‹®å®šçš„æ—¶é—´è¢«åžƒåœ¾å›žæ”¶å™¨æ”¶èµŽÍ¼ˆé‡Šæ”¾æŽ‰ï¼‰ã€‚这也是 Java æ¯”较占内存的原因ã€?nbsp;
实际上,栈中的变量指向堆内存中的变量åQŒè¿™ž®±æ˜¯ Java ä¸­çš„æŒ‡é’ˆåQ?nbsp;
c.帔R‡æ±?/span>(constant pool)指的是在¾~–译期被¼‹®å®šåQŒåƈ被保存在已编译的.classæ–‡äšg中的一些数据。除了包含代码中所定义的各¿UåŸºæœ¬ç±»åž‹ï¼ˆå¦‚int、long½{‰ç­‰åQ‰å’Œå¯¹è±¡åž‹ï¼ˆå¦‚String及数¾l„)的常量å€?final)˜q˜åŒ…含一些以文本形式出现的符号引用,比如åQ?¾cÕd’ŒæŽ¥å£çš„全限定名; 字段的名¿U°å’Œæè¿°½W¦ï¼› æ–ÒŽ³•和名¿U°å’Œæè¿°½W¦ã€?虚拟机必™åÖMؓ每个被装载的¾cÕdž‹¾l´æŠ¤ä¸€ä¸ªå¸¸é‡æ± ã€‚常量池ž®±æ˜¯è¯¥ç±»åž‹æ‰€ç”¨åˆ°å¸”R‡çš„一个有序集和,包括直接帔R‡åQˆstring,integerå’Œfloating point帔R‡åQ‰å’Œå¯¹å…¶ä»–类型,字段和方法的½W¦å·å¼•用。对于String帔R‡åQŒå®ƒçš„值是在常量池中的。而JVM中的帔R‡æ± åœ¨å†…存当中是以表的形式存在的,对于String¾cÕdž‹åQŒæœ‰ä¸€å¼ å›ºå®šé•¿åº¦çš„CONSTANT_String_info表用来存储文字字½W¦ä¸²å€û|¼Œæ³¨æ„åQšè¯¥è¡¨åªå­˜å‚¨æ–‡å­—字符串å€û|¼Œä¸å­˜å‚¨ç¬¦å·å¼•用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了ã€?/p>

在程序执行的时å€?帔R‡æ±?/span>会储存在Method Area,而不是堆ä¸?
d.Java的堆是一个运行时数据åŒ?¾cȝš„(对象从中分配½Iºé—´ã€‚这些对象通过new、newarray、anewarrayå’Œmultianewarray½{‰æŒ‡ä»¤å¾ç«‹ï¼Œå®ƒä»¬ä¸éœ€è¦ç¨‹åºä»£ç æ¥æ˜‘Ö¼çš„释放。堆是由垃圾回收来负责的åQŒå †çš„优势是可以动态地分配内存大小åQŒç”Ÿå­˜æœŸä¹Ÿä¸å¿…事先告诉编译器åQŒå› ä¸ºå®ƒæ˜¯åœ¨˜qè¡Œæ—¶åŠ¨æ€åˆ†é…å†…å­˜çš„åQŒJava的垃圾收集器会自动收走这些不再ä‹É用的数据。但¾~ºç‚¹æ˜¯ï¼Œç”׃ºŽè¦åœ¨˜qè¡Œæ—¶åŠ¨æ€åˆ†é…å†…å­˜ï¼Œå­˜å–é€Ÿåº¦è¾ƒæ…¢ã€?nbsp;

栈的优势是,存取速度比堆要快åQŒä»…‹Æ¡äºŽå¯„存器,栈数据可以共享。但¾~ºç‚¹æ˜¯ï¼Œå­˜åœ¨æ ˆä¸­çš„æ•°æ®å¤§ž®ä¸Žç”Ÿå­˜æœŸå¿…™åÀL˜¯¼‹®å®šçš„,¾~ÞZ¹ç‰|´»æ€§ã€‚栈中主要存放一些基本类型的变量数据åQˆint, short, long, byte, float, double, boolean, charåQ‰å’Œå¯¹è±¡å¥æŸ„(引用)ã€?nbsp;

栈有一个很重要的特ŒDŠæ€§ï¼Œž®±æ˜¯å­˜åœ¨æ ˆä¸­çš„æ•°æ®å¯ä»¥å…±äº«ã€‚假设我们同时定义: 
int a = 3; 
int b = 3åQ?nbsp;
¾~–译器先处理int a = 3åQ›é¦–å…ˆå®ƒä¼šåœ¨æ ˆä¸­åˆ›å¾ä¸€ä¸ªå˜é‡äØ“a的引用,然后查找栈中是否æœ?˜q™ä¸ªå€û|¼Œå¦‚果没找刎ͼŒž®±å°†3存放˜q›æ¥åQŒç„¶åŽå°†a指向3。接着处理int b = 3åQ›åœ¨åˆ›å¾å®Œb的引用变量后åQŒå› ä¸ºåœ¨æ ˆä¸­å·²ç»æœ?˜q™ä¸ªå€û|¼Œä¾¿å°†b直接指向3ã€‚è¿™æ øP¼Œž®±å‡ºçŽîCº†a与b同时均指å?的情å†üc€?nbsp;

˜q™æ—¶åQŒå¦‚果再令a=4åQ›é‚£ä¹ˆç¼–译器会重新搜索栈中是否有4å€û|¼Œå¦‚果没有åQŒåˆ™ž®?存放˜q›æ¥åQŒåƈ令a指向4åQ›å¦‚果已¾læœ‰äº†ï¼Œåˆ™ç›´æŽ¥å°†a指向˜q™ä¸ªåœ°å€ã€‚å› æ­¤a值的改变不会影响到b的倹{€?nbsp;

要注意这¿Uæ•°æ®çš„å…׃ín与两个对象的引用同时指向一个对象的˜q™ç§å…׃ín是不同的åQŒå› ä¸ø™¿™¿Uæƒ…况açš„ä¿®æ”¹åÆˆä¸ä¼šå½±å“åˆ°b, 它是ç”Þq¼–译器完成的,它有利于节省½Iºé—´ã€‚而一个对象引用变量修改了˜q™ä¸ªå¯¹è±¡çš„内部状态,会媄响到另一个对象引用变量ã€?/p>

/*****************************************************************************/

 

String是一个特ŒDŠçš„包装¾cÀL•°æ®ã€‚可以用åQ?nbsp;
String str = new String("abc"); 
String str = "abc"; 
两种的åŞ式来创徏åQŒç¬¬ä¸€¿Uæ˜¯ç”¨new()来新建对象的åQŒå®ƒä¼šåœ¨å­˜æ”¾äºŽå †ä¸­ã€‚每调用一‹Æ¡å°±ä¼šåˆ›å»ÞZ¸€ä¸ªæ–°çš„对象ã€?nbsp;
而第二种是先在栈中创å»ÞZ¸€ä¸ªå¯¹String¾cȝš„对象引用变量stråQŒç„¶åŽé€šè¿‡½W¦å·å¼•用åŽ?span style="color: #ff0000;">字符串常量池里找有没æœ?abc",如果没有åQŒåˆ™ž®?abc"存放˜q?span style="color: #ff0000;">字符串常量池åQŒåƈ令str指向”abc”åQŒå¦‚果已¾læœ‰”abc” 则直接ä×ostr指向“abc”ã€?nbsp;

比较¾c»é‡Œé¢çš„æ•°å€¼æ˜¯å¦ç›¸½{‰æ—¶åQŒç”¨equals()æ–ÒŽ³•åQ›å½“‹¹‹è¯•两个包装¾cȝš„引用是否指向同一个对象时åQŒç”¨==åQŒä¸‹é¢ç”¨ä¾‹å­è¯´æ˜Žä¸Šé¢çš„理论ã€?nbsp;
String str1 = "abc"; 
String str2 = "abc"; 
System.out.println(str1==str2); //true 
可以看出str1和str2是指向同一个对象的�nbsp;

String str1 =new String ("abc"); 
String str2 =new String ("abc"); 
System.out.println(str1==str2); // false 
用new的方式是生成不同的对象。每一‹Æ¡ç”Ÿæˆä¸€ä¸ªã€?nbsp;

因此用第二种方式创徏多个”abc”字符ä¸?在内存中其实只存在一个对象而已. ˜q™ç§å†™æ³•有利与节省内存空é—? 同时它可以在一定程度上提高½E‹åºçš„运行速度åQŒå› ä¸ºJVM会自动根据栈中数据的实际情况来决定是否有必要创徏新对象。而对于String str = new String("abc")åQ›çš„代码åQŒåˆ™ä¸€æ¦‚在堆中创徏新对象,而不½Ž¡å…¶å­—符串值是否相½{‰ï¼Œæ˜¯å¦æœ‰å¿…要创建新对象åQŒä»Žè€ŒåŠ é‡äº†½E‹åºçš„è´Ÿæ‹…ã€?nbsp;

另一斚w¢, 要注æ„? 我们在ä‹É用诸如String str = "abc"åQ›çš„æ ¼å¼å®šä¹‰¾cÀL—¶åQŒæ€ÀL˜¯æƒ›_½“ç„¶åœ°è®¤äØ“åQŒåˆ›å»ÞZº†String¾cȝš„对象str。担心陷阱!对象可能òq¶æ²¡æœ‰è¢«åˆ›å¾åQè€Œå¯èƒ½åªæ˜¯æŒ‡å‘一个先前已¾låˆ›å»ºçš„对象。只有通过new()æ–ÒŽ³•才能保证每次都创å»ÞZ¸€ä¸ªæ–°çš„对象ã€?nbsp;
ç”׃ºŽString¾cȝš„immutable性质åQŒå½“String变量需要经常变换其值时åQŒåº”该考虑使用StringBuffer¾c»ï¼Œä»¥æé«˜ç¨‹åºæ•ˆçއã€?nbsp;
1. 首先String不属äº?¿UåŸºæœ¬æ•°æ®ç±»åž‹ï¼ŒString是一个对象ã€?nbsp;
å› äØ“å¯¹è±¡çš„é»˜è®¤å€¼æ˜¯nullåQŒæ‰€ä»¥String的默认å€ég¹Ÿæ˜¯nullåQ›ä½†å®ƒåˆæ˜¯ä¸€¿Uç‰¹ŒDŠçš„对象åQŒæœ‰å…¶å®ƒå¯¹è±¡æ²¡æœ‰çš„一些特性ã€?nbsp;

2. new String()å’Œnew String(”")都是ç”Ïx˜Žä¸€ä¸ªæ–°çš„空字符ä¸ÔŒ¼Œæ˜¯ç©ºä¸²ä¸æ˜¯nullåQ?nbsp;

3. String str=”kvill”åQ›String str=new String (”kvill”)的区åˆ?br />
看例1åQ?nbsp;

String s0="kvill"; 
String s1="kvill"; 
String s2="kv" + "ill"; 
System.out.println( s0==s1 ); 
System.out.println( s0==s2 ); 
¾l“果为: 
true 
true 

首先åQŒæˆ‘ä»¬è¦çŸ¥ç»“æžœäØ“é?span style="background-color: #ffff00;">Java会确保一个字½W¦ä¸²å¸”R‡åªæœ‰ä¸€ä¸ªæ‹·è´ã€?nbsp;
å› äØ“ä¾‹å­ä¸­çš„s0å’Œs1中的”kvill”都是字符串常量,它们在编译期ž®Þp¢«¼‹®å®šäº†ï¼Œæ‰€ä»¥s0==s1为trueåQ›è€?#8221;kv”å’?#8221;ill”也都是字½W¦ä¸²å¸”R‡åQŒå½“一个字½W¦ä¸²ç”±å¤šä¸ªå­—½W¦ä¸²å¸”R‡˜qžæŽ¥è€Œæˆæ—Óž¼Œå®ƒè‡ªå·Þp‚¯å®šä¹Ÿæ˜¯å­—½W¦ä¸²å¸”R‡åQŒæ‰€ä»¥s2也同样在¾~–è¯‘æœŸå°±è¢«è§£æžäØ“ä¸€ä¸ªå­—½W¦ä¸²å¸”R‡åQŒæ‰€ä»¥s2也是帔R‡æ± ä¸­” kvill”的一个引用。所以我们得出s0==s1==s2åQ›ç”¨new String() 创徏的字½W¦ä¸²ä¸æ˜¯å¸”R‡åQŒä¸èƒ½åœ¨¾~–译期就¼‹®å®šåQŒæ‰€ä»¥new String() 创徏的字½W¦ä¸²ä¸æ”¾å…¥å¸¸é‡æ± ä¸­ï¼Œå®ƒä»¬æœ‰è‡ªå·Þqš„地址½Iºé—´ã€?nbsp;

看例2åQ?nbsp;
String s0="kvill"; 
String s1=new String("kvill"); 
String s2="kv" + new String("ill"); 
System.out.println( s0==s1 ); 
System.out.println( s0==s2 ); 
System.out.println( s1==s2 ); 
¾l“果为: 
false 
false 
false 

ä¾?中s0˜q˜æ˜¯å¸”R‡æ± ä¸­"kvill”的应用,s1å› äØ“æ— æ³•åœ¨ç¼–è¯‘æœŸ¼‹®å®šåQŒæ‰€ä»¥æ˜¯˜qè¡Œæ—¶åˆ›å»ºçš„æ–°å¯¹è±?#8221;kvill”的引用,s2å› äØ“æœ‰åŽåŠéƒ¨åˆ?new String(”ill”)所以也无法在编译期¼‹®å®šåQŒæ‰€ä»¥ä¹Ÿæ˜¯ä¸€ä¸ªæ–°åˆ›å¾å¯¹è±¡”kvill”的应ç”?明白了这些也ž®ÞqŸ¥é“äØ“ä½•å¾—å‡ºæ­¤¾l“果了ã€?nbsp;

4. String.intern()åQ?nbsp;
再补充介¾lä¸€ç‚¹ï¼šå­˜åœ¨äº?classæ–‡äšg中的帔R‡æ± ï¼Œåœ¨è¿è¡ŒæœŸè¢«JVM装蝲åQŒåƈ且可以扩充。Stringçš„intern()æ–ÒŽ³•ž®±æ˜¯æ‰©å……帔R‡æ± çš„ 一个方法;当一个String实例str调用intern()æ–ÒŽ³•æ—Óž¼ŒJava查找帔R‡æ± ä¸­æ˜¯å¦æœ‰ç›¸åŒUnicode的字½W¦ä¸²å¸”R‡åQŒå¦‚果有åQŒåˆ™˜q”回其的引用åQŒå¦‚果没有,则在帔R‡æ± ä¸­å¢žåŠ ä¸€ä¸ªUnicode½{‰äºŽstr的字½W¦ä¸²òq¶è¿”回它的引用;看例3ž®±æ¸…楚了 

ä¾?åQ?nbsp;
String s0= "kvill"; 
String s1=new String("kvill"); 
String s2=new String("kvill"); 
System.out.println( s0==s1 ); 
System.out.println( "**********" ); 
s1.intern(); 
s2=s2.intern(); //把常量池ä¸?kvill"的引用赋¾l™s2 
System.out.println( s0==s1); 
System.out.println( s0==s1.intern() ); 
System.out.println( s0==s2 ); 
¾l“果为: 
false 
********** 
false //虽然执行了s1.intern(),但它的返回值没有赋¾l™s1 
true //说明s1.intern()˜q”回的是帔R‡æ± ä¸­"kvill"的引ç”?nbsp;
true 

最后我再破除一个错误的理解åQšæœ‰äºø™¯´åQ?#8220;使用 String.intern() æ–ÒŽ³•则可以将一ä¸?String ¾cȝš„保存åˆîC¸€ä¸ªå…¨å±€ String 表中 åQŒå¦‚果具有相同值的 Unicode 字符串已¾låœ¨˜q™ä¸ªè¡¨ä¸­åQŒé‚£ä¹ˆè¯¥æ–ÒŽ³•˜q”回表中已有字符串的地址åQŒå¦‚果在表中没有相同值的字符ä¸ÔŒ¼Œåˆ™å°†è‡ªå·±çš„地址注册到表ä¸?#8221;如果我把他说的这个全局çš?String è¡¨ç†è§£äØ“å¸”R‡æ± çš„话,他的最后一句话åQ?#8221;如果在表中没有相同值的字符ä¸ÔŒ¼Œåˆ™å°†è‡ªå·±çš„地址注册到表ä¸?#8221;是错的: 

看例4åQ?nbsp;
String s1=new String("kvill"); 
String s2=s1.intern(); 
System.out.println( s1==s1.intern() ); 
System.out.println( s1+" "+s2 ); 
System.out.println( s2==s1.intern() ); 
¾l“æžœåQ?nbsp;
false 
kvill kvill 
true 

在这个类中我们没有声名一ä¸?#8221;kvill”帔R‡åQŒæ‰€ä»¥å¸¸é‡æ± ä¸­ä¸€å¼€å§‹æ˜¯æ²¡æœ‰”kvill”的,当我们调用s1.intern()后就在常量池中新æ·ÕdŠ äº†ä¸€ä¸?#8221;kvill”帔R‡åQŒåŽŸæ¥çš„ä¸åœ¨å¸”R‡æ± ä¸­çš?#8221;kvill”仍然存在åQŒä¹Ÿž®×ƒ¸æ˜?#8220;ž®†è‡ªå·Þqš„地址注册到常量池ä¸?#8221;了ã€?nbsp;
s1==s1.intern()为false说明原来çš?#8221;kvill”仍然存在åQ›s2现在为常量池ä¸?#8221;kvill”的地址åQŒæ‰€ä»¥æœ‰s2==s1.intern()为trueã€?nbsp;

5. 关于equals()å’?=: 
˜q™ä¸ªå¯¹äºŽString½Ž€å•来说就是比较两字符串的Unicode序列是否相当åQŒå¦‚果相½{‰è¿”回true;è€?=是比较两字符串的地址是否相同åQŒä¹Ÿž®±æ˜¯æ˜¯å¦æ˜¯åŒä¸€ä¸ªå­—½W¦ä¸²çš„引用ã€?nbsp;

6. 关于String是不可变�nbsp;
˜q™ä¸€è¯´åˆè¦è¯´å¾ˆå¤šåQŒå¤§å®¶åªè¦çŸ¥é“String的实例一旦生成就不会再改变了åQŒæ¯”如说åQšString str=”kv”+”ill”+” “+”ans”; ž®±æ˜¯æœ?个字½W¦ä¸²å¸”R‡åQŒé¦–å…?#8221;kv”å’?#8221;ill”生成äº?#8221;kvill”存在内存中,然后”kvill”又和” ” 生成 “kvill “存在内存中,最后又和生成了”kvill ans”;òq¶æŠŠ˜q™ä¸ªå­—符串的地址赋给了str,ž®±æ˜¯å› äØ“Stringçš?#8221;不可å?#8221;产生了很多äÍ时变量,˜q™ä¹Ÿž®±æ˜¯ä¸ÞZ»€ä¹ˆå¾è®®ç”¨StringBuffer的原因了åQŒå› ä¸ºStringBuffer是可改变的ã€?/p>

/*******************************************************************************/

下面是一些String相关的常见问题:

String中的final用法和理�br />final StringBuffer a = new StringBuffer("111");
final StringBuffer b = new StringBuffer("222");
a=b;//此句¾~–译不通过

final StringBuffer a = new StringBuffer("111");
a.append("222");//¾~–译通过

可见åQŒfinal只对引用çš?å€?(卛_†…存地址)有效åQŒå®ƒ˜q«ä‹É引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化åQŒfinal是不负责的ã€?/p>

String 帔R‡æ± é—®é¢˜çš„几个例子

下面是几个常见例子的比较分析和理解:
[1]
String a = "a1"; 
String b = "a" + 1; 
System.out.println((a == b)); //result = true
String a = "atrue"; 
String b = "a" + "true"; 
System.out.println((a == b)); //result = true
String a = "a3.4"; 
String b = "a" + 3.4; 
System.out.println((a == b)); //result = true

分析åQšJVM对于字符串常量的"+"可‚¿žæŽ¥ï¼Œž®†ç¨‹åºç¼–译期åQŒJVMž®±å°†å¸”R‡å­—符串的"+"˜qžæŽ¥ä¼˜åŒ–䏸™¿žæŽ¥åŽçš„å€û|¼Œæ‹?a" + 1来说åQŒç»¾~–译器优化后在class中就已经是a1。在¾~–译期其字符串常量的值就¼‹®å®šä¸‹æ¥åQŒæ•…上面½E‹åºæœ€¾lˆçš„¾l“æžœéƒ½äØ“trueã€?/p>

[2]
String a = "ab"; 
String bb = "b"; 
String b = "a" + bb; 
System.out.println((a == b)); //result = false

分析åQšJVM对于字符串引用,ç”׃ºŽåœ¨å­—½W¦ä¸²çš?+"˜qžæŽ¥ä¸­ï¼Œæœ‰å­—½W¦ä¸²å¼•用存在åQŒè€Œå¼•用的值在½E‹åº¾~–译期是无法¼‹®å®šçš„,å?a" + bb无法被编译器优化åQŒåªæœ‰åœ¨½E‹åº˜qè¡ŒæœŸæ¥åŠ¨æ€åˆ†é…åÆˆž®†è¿žæŽ¥åŽçš„æ–°åœ°å€èµ‹ç»™b。所以上面程序的¾l“果也就为falseã€?/p>

[3]
String a = "ab"; 
final String bb = "b"; 
String b = "a" + bb; 
System.out.println((a == b)); //result = true

分析åQšå’Œ[3]中唯一不同的是bb字符串加了final修饰åQŒå¯¹äºŽfinal修饰的变量,它在¾~–译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码‹¹ä¸­ã€‚所以此时的"a" + bbå’?a" + "b"效果是一æ ïLš„。故上面½E‹åºçš„ç»“æžœäØ“trueã€?/p>

[4]
String a = "ab"; 
final String bb = getBB(); 
String b = "a" + bb; 
System.out.println((a == b)); //result = false 
private static String getBB() {
return "b"; 
}

分析åQšJVM对于字符串引用bbåQŒå®ƒçš„值在¾~–译期无法确定,只有在程序运行期调用æ–ÒŽ³•后,ž®†æ–¹æ³•çš„˜q”回值和"a"æ¥åŠ¨æ€è¿žæŽ¥åÆˆåˆ†é…åœ°å€ä¸ºbåQŒæ•…上面½E‹åºçš„ç»“æžœäØ“falseã€?/p>

通过上面4个例子可以得出得知:
String  s  =  "a" + "b" + "c";   
ž®Þq­‰ä»·äºŽString s = "abc";   

String  a  =  "a";   
String  b  =  "b";   
String  c  =  "c";   
String  s  =   a  +  b  +  c;  

˜q™ä¸ªž®×ƒ¸ä¸€æ ·äº†åQŒæœ€¾lˆç»“果等于:   
StringBuffer temp = new StringBuffer();   
temp.append(a).append(b).append(c);   
String s = temp.toString();

ç”׃¸Šé¢çš„分析¾l“æžœåQŒå¯ž®×ƒ¸éš¾æŽ¨æ–­å‡ºString 采用˜qžæŽ¥˜qç®—½W¦ï¼ˆ+åQ‰æ•ˆçŽ‡ä½Žä¸‹åŽŸå› åˆ†æžï¼Œå½¢å¦‚˜q™æ ·çš„代码:

public class Test {
public static void main(String args[]) {
String s = null;
for(int i = 0; i < 100; i++) {
s += "a";
}
}
}

每做一‹Æ?+ ž®×ƒñ”生个StringBuilder对象åQŒç„¶åŽappend后就扔掉。下‹Æ¡åó@环再到达旉™‡æ–îCñ”生个StringBuilder对象åQŒç„¶å?append 字符ä¸ÔŒ¼Œå¦‚此循环直至¾l“束ã€?如果我们直接采用 StringBuilder 对象˜q›è¡Œ append 的话åQŒæˆ‘们可以节çœ?N - 1 ‹Æ¡åˆ›å»ºå’Œé”€æ¯å¯¹è±¡çš„æ—‰™—´ã€‚所以对于在循环中要˜q›è¡Œå­—符串连接的应用åQŒä¸€èˆ¬éƒ½æ˜¯ç”¨StringBuffer或StringBulider对象来进行append操作ã€?/p>

String对象的internæ–ÒŽ³•理解和分析:

public class Test4 {
private static String a = "ab"; 
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == a);//false
System.out.println(s.intern() == a);//true  
}
}

˜q™é‡Œç”¨åˆ°Java里面是一个常量池的问题。对于s1+s2操作åQŒå…¶å®žæ˜¯åœ¨å †é‡Œé¢é‡æ–°åˆ›å¾äº†ä¸€ä¸ªæ–°çš„对è±?s保存的是˜q™ä¸ªæ–°å¯¹è±¡åœ¨å †ç©ºé—´çš„的内容,所以s与a的值是不相½{‰çš„。而当调用s.intern()æ–ÒŽ³•åQŒå´å¯ä»¥˜q”回s在常量池中的地址å€û|¼Œå› äØ“a的值存储在帔R‡æ± ä¸­åQŒæ•…s.internå’Œa的值相½{?/p>

 

æ€È»“:

a.栈中用来存放一些原始数据类型的局部变量数据和对象的引ç”?String,数组.对象½{‰ç­‰)但不存放对象内容

b.堆中存放使用new关键字创建的对象.

c.字符串是一个特ŒDŠåŒ…装类,其引用是存放在栈里的,而对象内容必™åÀL ¹æ®åˆ›å»ºæ–¹å¼ä¸åŒå®š(帔R‡æ± å’Œå ?.有的是编译期ž®±å·²¾låˆ›å»ºå¥½åQŒå­˜æ”‘Öœ¨å­—符串常量池中,而有的是˜qè¡Œæ—¶æ‰è¢«åˆ›å»?使用new关键字,存放在堆中ã€?/p>

 

本文转自åQ?a style="color: #ff9900; text-decoration: initial;">http://zy19880423.javaeye.com/blog/434179



]]>
jdk动态代理和java的多态有啥区别?http://www.aygfsteel.com/stevenjohn/archive/2012/12/11/392825.htmlabinabinTue, 11 Dec 2012 09:46:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/12/11/392825.htmlhttp://www.aygfsteel.com/stevenjohn/comments/392825.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/12/11/392825.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/392825.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/392825.html
动态代理,不是java语言ç‰ÒŽ€§ï¼Œ 只是java提供动态方法拦截的一¿Uæ–¹å¼ï¼ˆå·¥å…·åQ?br />有点¾cÖM¼¼ hook
动态代理,只是动态的通过反射åQŒåŠ¨æ€æ‰§è¡Œç›®æ ‡çš„ç›¸å…³æ“ä½œåQ?br />当然要想实现动态代理,必须该类有接å?貌似cglib不需要的)
动态代理,是一¿Uå®žçŽ°æ–¹å¼?br />

多态,是oo语言的特�br />

多态表现在重蝲åQŒä¸€ä¸ªçˆ¶¾cȝš„变量可以引用子类的对è±?/p>


 



]]>
Java 抽象¾cÕd’ŒæŽ¥å£é€‚用场合http://www.aygfsteel.com/stevenjohn/archive/2012/11/22/391773.htmlabinabinThu, 22 Nov 2012 09:01:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/11/22/391773.htmlhttp://www.aygfsteel.com/stevenjohn/comments/391773.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/11/22/391773.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/391773.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/391773.html
对于抽象¾cÕd’ŒæŽ¥å£åQŒæˆ‘个äh觉得åQŒä¸€èˆ¬æ€§çš„æŽ¥å£åQŒéƒ½å¯ä»¥ç”¨è¿™ä¸¤è€…,
1、接口,接口实现¾c»ï¼Œ
2、普通类¾l§æ‰¿æŠ½è±¡¾c?br />
我想问下åQŒä»€ä¹ˆåœºåˆç”¨æŽ¥å£å¥½ç‚¹åQŒä»€ä¹ˆåœºåˆç”¨æŠ½è±¡¾cÕd¥½ç‚?br />接口¾cÖM¼¼ä¸€ä¸ªåè®®ï¼Œä¸€èˆ¬åªä½œå®šä¹?br />面向对象的语意是完全不同çš?br />一¿Uæ˜¯å®žçްåQŒä¸€¿Uæ˜¯ä¸ªåˆ«åŒ?br />看uml ž®ÞqŸ¥é“了
˜q™ä¸ªéƒ½ç”¨˜q‡ï¼ŒæŽ¥å£ç”¨çš„æ˜¯æœ€å¤šçš„åQŒä½†æ˜¯èƒ½ä¸èƒ½¾l™è®²ä¸ªè¯­å¢ƒï¼Œæ¯”如˜q™é‡Œç”¨æŠ½è±¡ç±»ž®±æ¯”接口好点
目前åQŒæœ‰è§‚点ž®±æ˜¯åQŒä‹É用接å?nbsp;è§£è€?br />不是˜q™æ ·åœŽÍ¼Œæ¨¡å¼é‡Œç”¨çš„æŽ¥å£å¤šåQŒä½†æœ‰äº›æ¨¡å¼åQŒå¦‚模版æ–ÒŽ³•模式åQŒç”¨åˆ°æŠ½åƒ?br />看具体的使用
恩恩åQŒæ€»è§‰å¾—è¿·˜qïL³Š¾pŠçš„
ä¹‹å‰æˆ‘å…¬åæ€»–们写呼叫¾pȝ»Ÿçš„æ—¶å€™ï¼Œå¤§é‡çš„ä‹É用了抽象¾c?br />抽象¾cÕd¯ä»¥å®šä¹‰æ–¹æ³•的内容åQŒå…·ä½“实现留¾l™å­¾cÕd®žçŽ?br />抽象的目的是个别化,ž®±æ˜¯å„个子类都有自己的特æ€?br />虽然都ç‘ô承父¾c»ï¼Œä½†æœ‰äº›æ–¹æ³•需要重斎ͼŒæˆ–新增,ž®±æ˜¯å®žçŽ°äº†å­¾cȝš„ç‰Òޮп€?br />æŽ¥å£ä¸ä¸€æ øP¼ŒæŽ¥å£åªæ˜¯å•独çš?nbsp;realize


]]>
Java ZIPæ–‡äšg压羃http://www.aygfsteel.com/stevenjohn/archive/2012/11/11/391170.htmlabinabinSun, 11 Nov 2012 15:32:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/11/11/391170.htmlhttp://www.aygfsteel.com/stevenjohn/comments/391170.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/11/11/391170.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/391170.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/391170.htmlpackage lc.abin.lee.basic.zip;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class CreateZip {
 public static String createZipFile(String filePath){
  String result="failure";
  try {
   FileOutputStream fileOut=new FileOutputStream("example.zip");
   CheckedOutputStream checkOut=new CheckedOutputStream(fileOut,new CRC32());
   ZipOutputStream zipOut=new ZipOutputStream(new BufferedOutputStream(checkOut));
   
   BufferedReader in=new BufferedReader(new FileReader(filePath));
   zipOut.putNextEntry(new ZipEntry(filePath));
   int line;
   while((line=in.read())!=-1){
    zipOut.write(line);
    zipOut.flush();
   }
   result="success";
   in.close();
   zipOut.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
  return result;
 }
 public static void main(String[] args) {
  String fileName="D:\\abin.txt";
  String result=createZipFile(fileName);
  System.out.println("result="+result);
 }
}



貌似˜q˜æœ‰ç‚šw—®é¢˜ï¼Œæ˜Žå¤©è§£å†³ä¸€ä¸?img src ="http://www.aygfsteel.com/stevenjohn/aggbug/391170.html" width = "1" height = "1" />

]]>
Java Cloneablehttp://www.aygfsteel.com/stevenjohn/archive/2012/10/24/390150.htmlabinabinWed, 24 Oct 2012 05:27:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/10/24/390150.htmlhttp://www.aygfsteel.com/stevenjohn/comments/390150.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/10/24/390150.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/390150.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/390150.htmlpackage net.abin.lee.basic;

public class Can implements Cloneable{
 private int id;
 private String address;
 public Can() {
 }
 public Can(int id, String address) {
  super();
  this.id = id;
  this.address = address;
 }
 public Object clone()throws CloneNotSupportedException{
  return super.clone();
 }
 public int hashCode(){
  final int prime=31;
  int result=1;
  result=prime*result+id;
  result=prime*result+((address==null?0:address.hashCode()));
  return result;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getAddress() {
  return address;
 }
 public void setAddress(String address) {
  this.address = address;
 }
 
}










package net.abin.lee.basic;

import junit.framework.TestCase;

public class UserTest extends TestCase{
 public void test1() throws CloneNotSupportedException{
  User user1=new User("12","abin",3);
  User user2=user1;
  User user3=(User)user1.clone();
  System.out.println("user1=user2 :"+(user1==user2));
  System.out.println("user1equalsuser2 :"+(user1.equals(user2)));
  
  System.out.println("user1=user3 :"+(user1==user3));
  System.out.println("user1equalsuser3 :"+(user1.equals(user3)));
  
 }
 @Override
 protected void runTest() throws Throwable {
  System.out.println("55");
  super.runTest();
 }
}



]]>
Java volatile的用�http://www.aygfsteel.com/stevenjohn/archive/2012/09/01/386728.htmlabinabinFri, 31 Aug 2012 16:27:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/09/01/386728.htmlhttp://www.aygfsteel.com/stevenjohn/comments/386728.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/01/386728.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/386728.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/386728.html/**
 * 双重‹‚€æŸ¥åŠ é”?单例模式
 * @author abin
 * ˜q™ä¸ªå•例模式写法可以大大减少getInstance的时间消耗!
 */
public class SingletonOne {
  /** 
     * volatile关键词确保:当singleton变量被初始化成SingletonOne实例æ—Óž¼Œå¤šä¸ª¾U¿ç¨‹æ­£ç¡®åœ°å¤„理singleton变量 
     */ 
 private volatile static SingletonOne singleton=null;
 public SingletonOne(){}
 public static SingletonOne getInstance(){
  if(null==singleton){//‹‚€æŸ¥å®žä¾‹ï¼Œå¦‚果不存在就˜q›å…¥åŒæ­¥åŒºå—
   synchronized (SingletonOne.class) {//注意åQŒåªæœ‰ç¬¬ä¸€‹Æ¡æ‰å½Õdº•执行˜q™é‡Œçš„代ç ?
    if(null!=singleton){
     singleton=new SingletonOne();
    }
   }
  }
  return singleton;
 }
}





package com.abin.lee.collection.singleton;

public class SingletonTwo {
 /**
  * volatile关键词确保:当uniqueInstance变量被初始化成Singleton实例æ—Óž¼Œ
  * 多个¾U¿ç¨‹æ­£ç¡®åœ°å¤„理uniqueInstance变量
  */
 private volatile static SingletonTwo singleton = new SingletonTwo();

 private SingletonTwo() {
 }

 public static SingletonTwo getInstance() {
  return singleton;
 }
}



]]>
¾l§æ‰¿ä¸­é™æ€å—、游¼›Õd—、构造器½{‰çš„æ‰§è¡Œ™åºåº http://www.aygfsteel.com/stevenjohn/archive/2012/08/22/386034.htmlabinabinWed, 22 Aug 2012 07:07:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/08/22/386034.htmlhttp://www.aygfsteel.com/stevenjohn/comments/386034.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/08/22/386034.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/386034.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/386034.html  çˆ¶ç±»é™æ€å—
  子类静态块
  父类变量
  父类静态变é‡?br />  父类游离å?br />  父类构造器
  子类变量
  子类静态变é‡?br />  子类游离å?br />  子类的构造器

验证的代码:


package com.jlq.test;

public class Test1 {

private static String s1 = "父类静态变�;

private String s2 = "父类变量";

public Test1() {
System.out.println("父类构造器");
}
/**
* 静态代码块
*/

static {
System.out.println("父类静态块");

}
/**
* 游离�
*/
{
System.out.println(s2);
System.out.println(s1);
System.out.println("父类游离�);

}

public static void main(String[] args) {
new TestChild();
}

}

class TestChild extends Test1 {

private static String s1 = "子类静态变�;

private String s2 = "子类变量";
/**
* 静态代码块
*/

static {
System.out.println("子类静态块");

}
/**
* 游离�
*/
{
System.out.println(s2);
System.out.println(s1);
System.out.println("子类游离�);

}

public TestChild() {
System.out.println("子类的构造器");
}

}


]]>
Java 重写equals和hashcodehttp://www.aygfsteel.com/stevenjohn/archive/2012/08/08/385078.htmlabinabinWed, 08 Aug 2012 08:30:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/08/08/385078.htmlhttp://www.aygfsteel.com/stevenjohn/comments/385078.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/08/08/385078.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/385078.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/385078.htmlpublic boolean equals(Object other) {
  if ((this == other))
   return true;
  if ((other == null))
   return false;
  if (!(other instanceof BtsfSysAlipayNotifyJournal))
   return false;
  BtsfSysAlipayNotifyJournal castOther = (BtsfSysAlipayNotifyJournal) other;

  return ((this.getId() == castOther.getId()) || (this.getId() != null
    && castOther.getId() != null && this.getId().equals(
    castOther.getId())))
    && ((this.getPartner() == castOther.getPartner()) || (this
      .getPartner() != null
      && castOther.getPartner() != null && this.getPartner()
      .equals(castOther.getPartner())))
    && ((this.getDiscount() == castOther.getDiscount()) || (this
      .getDiscount() != null
      && castOther.getDiscount() != null && this
      .getDiscount().equals(castOther.getDiscount())))
    && ((this.getPaymentType() == castOther.getPaymentType()) || (this
      .getPaymentType() != null
      && castOther.getPaymentType() != null && this
      .getPaymentType().equals(castOther.getPaymentType())))
    && ((this.getSubject() == castOther.getSubject()) || (this
      .getSubject() != null
      && castOther.getSubject() != null && this.getSubject()
      .equals(castOther.getSubject())))
    && ((this.getTradeNo() == castOther.getTradeNo()) || (this
      .getTradeNo() != null
      && castOther.getTradeNo() != null && this.getTradeNo()
      .equals(castOther.getTradeNo())))
    && ((this.getBuyerEmail() == castOther.getBuyerEmail()) || (this
      .getBuyerEmail() != null
      && castOther.getBuyerEmail() != null && this
      .getBuyerEmail().equals(castOther.getBuyerEmail())))
    && ((this.getGmtCreate() == castOther.getGmtCreate()) || (this
      .getGmtCreate() != null
      && castOther.getGmtCreate() != null && this
      .getGmtCreate().equals(castOther.getGmtCreate())))
    && ((this.getQuantity() == castOther.getQuantity()) || (this
      .getQuantity() != null
      && castOther.getQuantity() != null && this
      .getQuantity().equals(castOther.getQuantity())))
    && ((this.getOutTradeNo() == castOther.getOutTradeNo()) || (this
      .getOutTradeNo() != null
      && castOther.getOutTradeNo() != null && this
      .getOutTradeNo().equals(castOther.getOutTradeNo())))
    && ((this.getSellerId() == castOther.getSellerId()) || (this
      .getSellerId() != null
      && castOther.getSellerId() != null && this
      .getSellerId().equals(castOther.getSellerId())))
    && ((this.getTradeStatus() == castOther.getTradeStatus()) || (this
      .getTradeStatus() != null
      && castOther.getTradeStatus() != null && this
      .getTradeStatus().equals(castOther.getTradeStatus())))
    && ((this.getIsTotalFeeAdjust() == castOther
      .getIsTotalFeeAdjust()) || (this.getIsTotalFeeAdjust() != null
      && castOther.getIsTotalFeeAdjust() != null && this
      .getIsTotalFeeAdjust().equals(
        castOther.getIsTotalFeeAdjust())))
    && ((this.getTotalFee() == castOther.getTotalFee()) || (this
      .getTotalFee() != null
      && castOther.getTotalFee() != null && this
      .getTotalFee().equals(castOther.getTotalFee())))
    && ((this.getGmtPayment() == castOther.getGmtPayment()) || (this
      .getGmtPayment() != null
      && castOther.getGmtPayment() != null && this
      .getGmtPayment().equals(castOther.getGmtPayment())))
    && ((this.getSellerEmail() == castOther.getSellerEmail()) || (this
      .getSellerEmail() != null
      && castOther.getSellerEmail() != null && this
      .getSellerEmail().equals(castOther.getSellerEmail())))
    && ((this.getGmtClose() == castOther.getGmtClose()) || (this
      .getGmtClose() != null
      && castOther.getGmtClose() != null && this
      .getGmtClose().equals(castOther.getGmtClose())))
    && ((this.getPrice() == castOther.getPrice()) || (this
      .getPrice() != null
      && castOther.getPrice() != null && this.getPrice()
      .equals(castOther.getPrice())))
    && ((this.getBuyerId() == castOther.getBuyerId()) || (this
      .getBuyerId() != null
      && castOther.getBuyerId() != null && this.getBuyerId()
      .equals(castOther.getBuyerId())))
    && ((this.getUseCoupon() == castOther.getUseCoupon()) || (this
      .getUseCoupon() != null
      && castOther.getUseCoupon() != null && this
      .getUseCoupon().equals(castOther.getUseCoupon())))
    && ((this.getCreateTime() == castOther.getCreateTime()) || (this
      .getCreateTime() != null
      && castOther.getCreateTime() != null && this
      .getCreateTime().equals(castOther.getCreateTime())))
    && ((this.getLastUpdateTime() == castOther.getLastUpdateTime()) || (this
      .getLastUpdateTime() != null
      && castOther.getLastUpdateTime() != null && this
      .getLastUpdateTime().equals(
        castOther.getLastUpdateTime())))
    && ((this.getPaymentMethod() == castOther.getPaymentMethod()) || (this
      .getPaymentMethod() != null
      && castOther.getPaymentMethod() != null && this
      .getPaymentMethod()
      .equals(castOther.getPaymentMethod())));
 }

 public int hashCode() {
  int result = 17;

  result = 37 * result + (getId() == null ? 0 : this.getId().hashCode());
  result = 37 * result
    + (getPartner() == null ? 0 : this.getPartner().hashCode());
  result = 37 * result
    + (getDiscount() == null ? 0 : this.getDiscount().hashCode());
  result = 37
    * result
    + (getPaymentType() == null ? 0 : this.getPaymentType()
      .hashCode());
  result = 37 * result
    + (getSubject() == null ? 0 : this.getSubject().hashCode());
  result = 37 * result
    + (getTradeNo() == null ? 0 : this.getTradeNo().hashCode());
  result = 37
    * result
    + (getBuyerEmail() == null ? 0 : this.getBuyerEmail()
      .hashCode());
  result = 37 * result
    + (getGmtCreate() == null ? 0 : this.getGmtCreate().hashCode());
  result = 37 * result
    + (getQuantity() == null ? 0 : this.getQuantity().hashCode());
  result = 37
    * result
    + (getOutTradeNo() == null ? 0 : this.getOutTradeNo()
      .hashCode());
  result = 37 * result
    + (getSellerId() == null ? 0 : this.getSellerId().hashCode());
  result = 37
    * result
    + (getTradeStatus() == null ? 0 : this.getTradeStatus()
      .hashCode());
  result = 37
    * result
    + (getIsTotalFeeAdjust() == null ? 0 : this
      .getIsTotalFeeAdjust().hashCode());
  result = 37 * result
    + (getTotalFee() == null ? 0 : this.getTotalFee().hashCode());
  result = 37
    * result
    + (getGmtPayment() == null ? 0 : this.getGmtPayment()
      .hashCode());
  result = 37
    * result
    + (getSellerEmail() == null ? 0 : this.getSellerEmail()
      .hashCode());
  result = 37 * result
    + (getGmtClose() == null ? 0 : this.getGmtClose().hashCode());
  result = 37 * result
    + (getPrice() == null ? 0 : this.getPrice().hashCode());
  result = 37 * result
    + (getBuyerId() == null ? 0 : this.getBuyerId().hashCode());
  result = 37 * result
    + (getUseCoupon() == null ? 0 : this.getUseCoupon().hashCode());
  result = 37
    * result
    + (getCreateTime() == null ? 0 : this.getCreateTime()
      .hashCode());
  result = 37
    * result
    + (getLastUpdateTime() == null ? 0 : this.getLastUpdateTime()
      .hashCode());
  result = 37
    * result
    + (getPaymentMethod() == null ? 0 : this.getPaymentMethod()
      .hashCode());
  return result;
 }



]]>
Java 拆分字符ä¸?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2012/03/27/372845.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 27 Mar 2012 12:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2012/03/27/372845.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/372845.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2012/03/27/372845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/372845.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/372845.html</trackback:ping><description><![CDATA[<p>package com.abin.inter.test;</p> <p>public class SplitString1 {<br /> public static void main(String[] args) {<br />  StringBuffer stb = new StringBuffer();<br />  String unitId1 = "aaaaa";<br />  String callerNumber1 = "bbbbb";<br />  String calleeNumber1 = "ccccc";<br />  stb.append(unitId1).append("|").append(callerNumber1).append("|")<br />    .append(calleeNumber1);<br />  System.out.println("stb=" + stb.toString());<br />  String unitId = stb.toString()<br />    .substring(0, stb.toString().indexOf("|"));<br />  System.out.println("unitId=" + unitId);<br />  String temp1 = stb.toString().substring(unitId.length() + 1,<br />    stb.toString().length() - unitId.length());<br />  System.out.println("temp1=" + temp1);<br />  String callerNumber = temp1.substring(0, temp1.indexOf("|"));<br />  System.out.println("callerNumber=" + callerNumber);<br />  System.out.println("unitId.length()=" + unitId.length());<br />  System.out.println("callerNumber.length()=" + callerNumber.length());<br />  System.out.println("stb=" + stb.toString().length());<br />  String temp2 = stb.toString().substring(<br />    unitId.length() + callerNumber.length() + 2,<br />    stb.toString().length());<br />  System.out.println("temp2=" + temp2);<br />  String calleeNumber = temp2.substring(0, temp2.length());<br />  System.out.println("calleeNumber=" + calleeNumber);<br /> }<br />}<br /></p> <img src ="http://www.aygfsteel.com/stevenjohn/aggbug/372845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2012-03-27 20:04 <a href="http://www.aygfsteel.com/stevenjohn/archive/2012/03/27/372845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">̨ÖÝÊÐ</a>| <a href="http://" target="_blank">¸£º£ÏØ</a>| <a href="http://" target="_blank">Àè³ÇÏØ</a>| <a href="http://" target="_blank">ÉÏÓÝÊÐ</a>| <a href="http://" target="_blank">ÎÚÀ­ÌØÖÐÆì</a>| <a href="http://" target="_blank">ÄáÄ¾ÏØ</a>| <a href="http://" target="_blank">ÖÛɽÊÐ</a>| <a href="http://" target="_blank">½­´ïÏØ</a>| <a href="http://" target="_blank">°°É½ÊÐ</a>| <a href="http://" target="_blank">Óñ»·ÏØ</a>| <a href="http://" target="_blank">½ðÕ¯ÏØ</a>| <a href="http://" target="_blank">Û°³ÇÏØ</a>| <a href="http://" target="_blank">°²ÔÀÏØ</a>| <a href="http://" target="_blank">®½­ÏØ</a>| <a href="http://" target="_blank">Æ¤É½ÏØ</a>| <a href="http://" target="_blank">ÇɼÒÏØ</a>| <a href="http://" target="_blank">Ïå·®ÊÐ</a>| <a href="http://" target="_blank">¾ÅÁúÏØ</a>| <a href="http://" target="_blank">³¤¸ðÊÐ</a>| <a href="http://" target="_blank">ÑïÖÝÊÐ</a>| <a href="http://" target="_blank">À¥Ã÷ÊÐ</a>| <a href="http://" target="_blank">¾äÈÝÊÐ</a>| <a href="http://" target="_blank">ºÏ×÷ÊÐ</a>| <a href="http://" target="_blank">¾°Ì©ÏØ</a>| <a href="http://" target="_blank">ÈðÀöÊÐ</a>| <a href="http://" target="_blank">º£ÁÖÊÐ</a>| <a href="http://" target="_blank">¿üÍÍÊÐ</a>| <a href="http://" target="_blank">ÉÏÓÝÊÐ</a>| <a href="http://" target="_blank">Ð˰²ÏØ</a>| <a href="http://" target="_blank">ÐËÂ¡ÏØ</a>| <a href="http://" target="_blank">¼ÎÒåÊÐ</a>| <a href="http://" target="_blank">èëµéÊÐ</a>| <a href="http://" target="_blank">½ðƽ</a>| <a href="http://" target="_blank">äÃÖÝÊÐ</a>| <a href="http://" target="_blank">×ÊÐËÊÐ</a>| <a href="http://" target="_blank">Çຣʡ</a>| <a href="http://" target="_blank">ÆîÃÅÏØ</a>| <a href="http://" target="_blank">À¼ÏªÊÐ</a>| <a href="http://" target="_blank">½¨Ë®ÏØ</a>| <a href="http://" target="_blank">ƽ¹ûÏØ</a>| <a href="http://" target="_blank">÷ÖÝÊÐ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>