ž®Þ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>
如果有些代ç 必须在项目å¯åŠ¨çš„æ—¶å€™å°±æ‰§è¡Œ,ž®±éœ€è¦ä‹Éç”¨é™æ€ä»£ç å—,˜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>
åå…˜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");
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
多æ€è¡¨çŽ°åœ¨é‡è²åQŒä¸€ä¸ªçˆ¶¾cÈš„å˜é‡å¯ä»¥å¼•用å类的对è±?/p>
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);
}
}
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();
}
}
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;
}
}
验è¯çš„代ç :
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;
}