×Ô¶¯×°ÏäºÍ²ðÏä´ÓJava 1.5¿ªÊ¼ÒýÈ룬ĿµÄÊǽ«ÔʼÀàÐÍֵת×Ô¶¯µØ×ª»»³É¶ÔÓ¦µÄ¶ÔÏó¡£×Ô¶¯×°ÏäÓë²ðÏäµÄ»úÖÆ¿ÉÒÔÈÃÎÒÃÇÔÚJavaµÄ±äÁ¿¸³Öµ»òÕßÊÇ·½·¨µ÷ÓõÈÇé¿öÏÂʹÓÃÔʼÀàÐÍ»òÕß¶ÔÏóÀàÐ͸ü¼Ó¼òµ¥Ö±½Ó¡£

Èç¹ûÄãÔÚJava1.5ϽøÐйý±à³ÌµÄ»°£¬ÄãÒ»¶¨²»»áİÉúÕâÒ»µã£¬Äã²»ÄÜÖ±½ÓµØÏò¼¯ºÏ(Collections)ÖзÅÈëÔʼÀàÐÍÖµ£¬ÒòΪ¼¯ºÏÖ»½ÓÊÕ¶ÔÏó¡£Í¨³£ÕâÖÖÇé¿öÏÂÄãµÄ×ö·¨ÊÇ£¬½«ÕâЩÔʼÀàÐ͵Äֵת»»³É¶ÔÏó£¬È»ºó½«ÕâЩת»»µÄ¶ÔÏó·ÅÈ뼯ºÏÖС£Ê¹ÓÃInteger,Double,BooleanµÈÕâЩÀàÎÒÃÇ¿ÉÒÔ½«ÔʼÀàÐÍֵת»»³É¶ÔÓ¦µÄ¶ÔÏ󣬵«ÊÇ´ÓijЩ³Ì¶È¿ÉÄÜʹµÃ´úÂë²»ÊÇÄÇô¼ò½à¾«Á¶¡£ÎªÁËÈôúÂë¼òÁ·£¬Java 1.5ÒýÈëÁ˾ßÓÐÔÚÔʼÀàÐͺͶÔÏóÀàÐÍ×Ô¶¯×ª»»µÄ×°ÏäºÍ²ðÏä»úÖÆ¡£µ«ÊÇ×Ô¶¯×°ÏäºÍ²ðÏä²¢·ÇÍêÃÀ£¬ÔÚʹÓÃʱÐèÒªÓÐһЩעÒâÊÂÏÈç¹ûûÓиãÃ÷°××Ô¶¯×°ÏäºÍ²ðÏ䣬¿ÉÄÜ»áÒýÆðÄÑÒÔ²ì¾õµÄbug¡£
±¾ÎĽ«½éÉÜ£¬Ê²Ã´ÊÇ×Ô¶¯×°ÏäºÍ²ðÏ䣬×Ô¶¯×°ÏäºÍ²ðÏä·¢ÉúÔÚʲôʱºò£¬ÒÔ¼°Òª×¢ÒâµÄÊÂÏî¡£
ʲôÊÇ×Ô¶¯×°ÏäºÍ²ðÏä
×Ô¶¯×°Ïä¾ÍÊÇJava×Ô¶¯½«ÔʼÀàÐÍֵת»»³É¶ÔÓ¦µÄ¶ÔÏ󣬱ÈÈ罫intµÄ±äÁ¿×ª»»³ÉInteger¶ÔÏó£¬Õâ¸ö¹ý³Ì½Ð×ö×°Ï䣬·´Ö®½«Integer¶ÔÏóת»»³ÉintÀàÐÍÖµ£¬Õâ¸ö¹ý³Ì½Ð×ö²ðÏä¡£ÒòΪÕâÀïµÄ×°ÏäºÍ²ðÏäÊÇ×Ô¶¯½øÐеķÇÈËΪת»»£¬ËùÒԾͳÆ×÷Ϊ×Ô¶¯×°ÏäºÍ²ðÏä¡£ÔʼÀàÐÍbyte,short,char,int,long,float,doubleºÍboolean¶ÔÓ¦µÄ·â×°ÀàΪByte,Short,Character,Integer,Long,Float,Double,Boolean¡£
×Ô¶¯×°Ïä²ðÏäÒªµã
- ×Ô¶¯×°Ïäʱ±àÒëÆ÷µ÷ÓÃvalueOf½«ÔʼÀàÐÍֵת»»³É¶ÔÏó£¬Í¬Ê±×Ô¶¯²ðÏäʱ£¬±àÒëÆ÷ͨ¹ýµ÷ÓÃÀàËÆintValue(),doubleValue()ÕâÀàµÄ·½·¨½«¶ÔÏóת»»³ÉÔʼÀàÐÍÖµ¡£
- ×Ô¶¯×°ÏäÊǽ«booleanֵת»»³ÉBoolean¶ÔÏó£¬byteֵת»»³ÉByte¶ÔÏó£¬charת»»³ÉCharacter¶ÔÏó£¬floatֵת»»³ÉFloat¶ÔÏó£¬intת»»³ÉInteger£¬longת»»³ÉLong£¬shortת»»³ÉShort£¬×Ô¶¯²ðÏäÔòÊÇÏà·´µÄ²Ù×÷¡£
ºÎʱ·¢Éú×Ô¶¯×°ÏäºÍ²ðÏä
×Ô¶¯×°ÏäºÍ²ðÏäÔÚJavaÖкܳ£¼û£¬±ÈÈçÎÒÃÇÓÐÒ»¸ö·½·¨£¬½ÓÊÜÒ»¸ö¶ÔÏóÀàÐ͵IJÎÊý£¬Èç¹ûÎÒÃÇ´«µÝÒ»¸öÔʼÀàÐÍÖµ£¬ÄÇôJava»á×Ô¶¯½²Õâ¸öÔʼÀàÐÍֵת»»³ÉÓëÖ®¶ÔÓ¦µÄ¶ÔÏó¡£×î¾µäµÄÒ»¸ö³¡¾°¾ÍÊǵ±ÎÒÃÇÏòArrayListÕâÑùµÄÈÝÆ÷ÖÐÔö¼ÓÔʼÀàÐÍÊý¾Ýʱ»òÕßÊÇ´´½¨Ò»¸ö²ÎÊý»¯µÄÀ࣬±ÈÈçÏÂÃæµÄThreadLocal¡£
ArrayList<Integer> intList = new ArrayList<Integer>(); intList.add(1); //autoboxing - primitive to object intList.add(2); //autoboxing
ThreadLocal<Integer> intLocal = new ThreadLocal<Integer>();
intLocal.set(4); //autoboxing
int number = intList.get(0); // unboxing
int local = intLocal.get(); // unboxing in Java |
¾ÙÀý˵Ã÷
ÉÏÃæµÄ²¿·ÖÎÒÃǽéÉÜÁË×Ô¶¯×°ÏäºÍ²ðÏäÒÔ¼°ËüÃǺÎʱ·¢Éú£¬ÎÒÃÇÖªµÀÁË×Ô¶¯×°ÏäÖ÷Òª·¢ÉúÔÚÁ½ÖÖÇé¿ö£¬Ò»ÖÖÊǸ³ÖµÊ±£¬ÁíÒ»ÖÖÊÇÔÚ·½·¨µ÷ÓõÄʱºò¡£ÎªÁ˸üºÃµØÀí½âÕâÁ½ÖÖÇé¿ö£¬ÎÒÃǾÙÀý½øÐÐ˵Ã÷¡£
¸³ÖµÊ±
ÕâÊÇ×î³£¼ûµÄÒ»ÖÖÇé¿ö£¬ÔÚJava 1.5ÒÔǰÎÒÃÇÐèÒªÊÖ¶¯µØ½øÐÐת»»²ÅÐУ¬¶øÏÖÔÚËùÓеÄת»»¶¼ÊÇÓɱàÒëÆ÷À´Íê³É¡£
//before autoboxing Integer iObject = Integer.valueOf(3); Int iPrimitive = iObject.intValue()
//after java5
Integer iObject = 3; //autobxing - primitive to wrapper conversion
int iPrimitive = iObject; //unboxing - object to primitive conversion |
·½·¨µ÷ÓÃʱ
ÕâÊÇÁíÒ»¸ö³£ÓõÄÇé¿ö£¬µ±ÎÒÃÇÔÚ·½·¨µ÷ÓÃʱ£¬ÎÒÃÇ¿ÉÒÔ´«ÈëÔʼÊý¾ÝÖµ»òÕß¶ÔÏó£¬Í¬Ñù±àÒëÆ÷»á°ïÎÒÃǽøÐÐת»»¡£
public static Integer show(Integer iParam){ System.out.println("autoboxing example - method invocation i: " + iParam); return iParam; }
//autoboxing and unboxing in method invocation
show(3); //autoboxing
int result = show(3); //unboxing because return type of method is Integer |
show·½·¨½ÓÊÜInteger¶ÔÏó×÷Ϊ²ÎÊý£¬µ±µ÷ÓÃshow(3)ʱ£¬»á½«intֵת»»³É¶ÔÓ¦µÄInteger¶ÔÏó£¬Õâ¾ÍÊÇËùνµÄ×Ô¶¯×°Ï䣬show·½·¨·µ»ØInteger¶ÔÏ󣬶øint result = show(3);ÖÐresultΪintÀàÐÍ£¬ËùÒÔÕâʱºò·¢Éú×Ô¶¯²ðÏä²Ù×÷£¬½«show·½·¨µÄ·µ»ØµÄInteger¶ÔÏóת»»³ÉintÖµ¡£
×Ô¶¯×°ÏäµÄ±×¶Ë
×Ô¶¯×°ÏäÓÐÒ»¸öÎÊÌ⣬ÄǾÍÊÇÔÚÒ»¸öÑ»·ÖнøÐÐ×Ô¶¯×°Ïä²Ù×÷µÄÇé¿ö£¬ÈçÏÂÃæµÄÀý×Ӿͻᴴ½¨¶àÓàµÄ¶ÔÏó£¬Ó°Ïì³ÌÐòµÄÐÔÄÜ¡£
Integer sum = 0; for(int i=1000; i<5000; i++){ sum+=i; } |
ÉÏÃæµÄ´úÂësum+=i¿ÉÒÔ¿´³Ésum = sum + i£¬µ«ÊÇ+Õâ¸ö²Ù×÷·û²»ÊÊÓÃÓÚInteger¶ÔÏó£¬Ê×ÏÈsum½øÐÐ×Ô¶¯²ðÏä²Ù×÷£¬½øÐÐÊýÖµÏà¼Ó²Ù×÷£¬×îºó·¢Éú×Ô¶¯×°Ïä²Ù×÷ת»»³ÉInteger¶ÔÏ󡣯äÄÚ²¿±ä»¯ÈçÏÂ
sum = sum.intValue() + i; Integer sum = new Integer(result); |
ÓÉÓÚÎÒÃÇÕâÀïÉùÃ÷µÄsumΪIntegerÀàÐÍ£¬ÔÚÉÏÃæµÄÑ»·Öлᴴ½¨½«½ü4000¸öÎÞÓõÄInteger¶ÔÏó£¬ÔÚÕâÑùÅÓ´óµÄÑ»·ÖУ¬»á½µµÍ³ÌÐòµÄÐÔÄܲ¢ÇÒ¼ÓÖØÁËÀ¬»ø»ØÊյŤ×÷Á¿¡£Òò´ËÔÚÎÒÃDZà³Ìʱ£¬ÐèҪעÒâµ½ÕâÒ»µã£¬ÕýÈ·µØÉùÃ÷±äÁ¿ÀàÐÍ£¬±ÜÃâÒòΪ×Ô¶¯×°ÏäÒýÆðµÄÐÔÄÜÎÊÌâ¡£
ÖØÔØÓë×Ô¶¯×°Ïä
µ±ÖØÔØÓöÉÏ×Ô¶¯×°Ïäʱ£¬Çé¿ö»á±È½ÏÓÐЩ¸´ÔÓ£¬¿ÉÄÜ»áÈÃÈ˲úÉúÓÐЩÀ§»ó¡£ÔÚ1.5֮ǰ£¬value(int)ºÍvalue(Integer)ÊÇÍêÈ«²»ÏàͬµÄ·½·¨£¬¿ª·¢Õß²»»áÒòΪ´«ÈëÊÇint»¹ÊÇIntegerµ÷ÓÃÄĸö·½·¨À§»ó£¬µ«ÊÇÓÉÓÚ×Ô¶¯×°ÏäºÍ²ðÏäµÄÒýÈ룬´¦ÀíÖØÔØ·½·¨Ê±ÉÔ΢Óе㸴ÔÓ¡£Ò»¸öµäÐ͵ÄÀý×Ó¾ÍÊÇArrayListµÄremove·½·¨£¬ËüÓÐremove(index)ºÍremove(Object)Á½ÖÖÖØÔØ£¬ÎÒÃÇ¿ÉÄÜ»áÓÐÒ»µãССµÄÀ§»ó£¬ÆäʵÕâÖÖÀ§»óÊÇ¿ÉÒÔÑéÖ¤²¢½â¿ªµÄ£¬Í¨¹ýÏÂÃæµÄÀý×ÓÎÒÃÇ¿ÉÒÔ¿´µ½£¬µ±³öÏÖÕâÖÖÇé¿öʱ£¬²»»á·¢Éú×Ô¶¯×°Ïä²Ù×÷¡£
public void test(int num){ System.out.println("method with primitive argument");
}
public void test(Integer num){
System.out.println("method with wrapper argument");
}
//calling overloaded method
AutoboxingTest autoTest = new AutoboxingTest();
int value = 3;
autoTest.test(value); //no autoboxing
Integer iValue = value;
autoTest.test(iValue); //no autoboxing
Output:
method with primitive argument
method with wrapper argument |
ҪעÒâµÄÊÂÏî
×Ô¶¯×°ÏäºÍ²ðÏä¿ÉÒÔʹ´úÂë±äµÃ¼ò½à,µ«ÊÇÆäÒ²´æÔÚһЩÎÊÌâºÍ¼«¶ËÇé¿öϵÄÎÊÌ⣬ÒÔϼ¸µãÐèÒªÎÒÃǼÓǿעÒâ¡£
¶ÔÏóÏàµÈ±È½Ï
ÕâÊÇÒ»¸ö±È½ÏÈÝÒ׳ö´íµÄµØ·½£¬¡±==¡°¿ÉÒÔÓÃÓÚÔʼֵ½øÐбȽϣ¬Ò²¿ÉÒÔÓÃÓÚ¶ÔÏó½øÐбȽϣ¬µ±ÓÃÓÚ¶ÔÏóÓë¶ÔÏóÖ®¼ä±È½Ïʱ£¬±È½ÏµÄ²»ÊǶÔÏó´ú±íµÄÖµ£¬¶øÊǼì²éÁ½¸ö¶ÔÏóÊÇ·ñÊÇͬһ¶ÔÏó£¬Õâ¸ö±È½Ï¹ý³ÌÖÐûÓÐ×Ô¶¯×°Ïä·¢Éú¡£½øÐжÔÏóÖµ±È½Ï²»Ó¦¸ÃʹÓá±==¡°£¬¶øÓ¦¸ÃʹÓöÔÏó¶ÔÓ¦µÄequals·½·¨¡£¿´Ò»¸öÄÜ˵Ã÷ÎÊÌâµÄÀý×Ó¡£
public class AutoboxingTest {
public static void main(String args[]) {
// Example 1: == comparison pure primitive ¨C no autoboxing
int i1 = 1;
int i2 = 1;
System.out.println("i1==i2 : " + (i1 == i2)); // true
// Example 2: equality operator mixing object and primitive
Integer num1 = 1; // autoboxing
int num2 = 1;
System.out.println("num1 == num2 : " + (num1 == num2)); // true
// Example 3: special case - arises due to autoboxing in Java
Integer obj1 = 1; // autoboxing will call Integer.valueOf()
Integer obj2 = 1; // same call to Integer.valueOf() will return same
// cached Object
System.out.println("obj1 == obj2 : " + (obj1 == obj2)); // true
// Example 4: equality operator - pure object comparison
Integer one = new Integer(1); // no autoboxing
Integer anotherOne = new Integer(1);
System.out.println("one == anotherOne : " + (one == anotherOne)); // false
}
}
Output:
i1==i2 : true
num1 == num2 : true
obj1 == obj2 : true
one == anotherOne : false |
ÖµµÃ×¢ÒâµÄÊǵÚÈý¸öСÀý×Ó£¬ÕâÊÇÒ»ÖÖ¼«¶ËÇé¿ö¡£obj1ºÍobj2µÄ³õʼ»¯¶¼·¢ÉúÁË×Ô¶¯×°Ïä²Ù×÷¡£µ«ÊÇ´¦ÓÚ½ÚÊ¡ÄÚ´æµÄ¿¼ÂÇ£¬JVM»á»º´æ-128µ½127µÄInteger¶ÔÏó¡£ÒòΪobj1ºÍobj2ʵ¼ÊÉÏÊÇͬһ¸ö¶ÔÏó¡£ËùÒÔʹÓá±==¡°±È½Ï·µ»Øtrue¡£
ÈÝÒ×»ìÂҵĶÔÏóºÍÔʼÊý¾ÝÖµ
ÁíÒ»¸öÐèÒª±ÜÃâµÄÎÊÌâ¾ÍÊÇ»ìÂÒʹÓöÔÏóºÍÔʼÊý¾ÝÖµ£¬Ò»¸ö¾ßÌåµÄÀý×Ó¾ÍÊǵ±ÎÒÃÇÔÚÒ»¸öÔʼÊý¾ÝÖµÓëÒ»¸ö¶ÔÏó½øÐбȽÏʱ£¬Èç¹ûÕâ¸ö¶ÔÏóûÓнøÐгõʼ»¯»òÕßΪNull£¬ÔÚ×Ô¶¯²ðÏä¹ý³ÌÖÐobj.xxxValue£¬»áÅ׳öNullPointerException,ÈçÏÂÃæµÄ´úÂë
private static Integer count;
//NullPointerException on unboxing
if( count <= 0){
System.out.println("Count is not started yet");
} |
»º´æµÄ¶ÔÏó
Õâ¸öÎÊÌâ¾ÍÊÇÎÒÃÇÉÏÃæÌáµ½µÄ¼«¶ËÇé¿ö£¬ÔÚJavaÖУ¬»á¶Ô-128µ½127µÄInteger¶ÔÏó½øÐлº´æ£¬µ±´´½¨ÐµÄInteger¶ÔÏóʱ£¬Èç¹û·ûºÏÕâ¸öÕâ¸ö·¶Î§£¬²¢ÇÒÒÑÓдæÔÚµÄÏàֵͬµÄ¶ÔÏó£¬Ôò·µ»ØÕâ¸ö¶ÔÏ󣬷ñÔò´´½¨ÐµÄInteger¶ÔÏó¡£
ÔÚJavaÖÐÁíÒ»¸ö½ÚÊ¡ÄÚ´æµÄÀý×Ó¾ÍÊÇ×Ö·û´®³£Á¿³Ø,¸ÐÐËȤµÄͬѧ¿ÉÒÔÁ˽âһϡ£
Éú³ÉÎÞÓöÔÏóÔö¼ÓGCѹÁ¦
ÒòΪ×Ô¶¯×°Ïä»áÒþʽµØ´´½¨¶ÔÏó£¬ÏñÇ°ÃæÌáµ½µÄÄÇÑù£¬Èç¹ûÔÚÒ»¸öÑ»·ÌåÖУ¬»á´´½¨ÎÞÓõÄÖмä¶ÔÏó£¬ÕâÑù»áÔö¼ÓGCѹÁ¦£¬ÀµÍ³ÌÐòµÄÐÔÄÜ¡£ËùÒÔÔÚдѻ·Ê±Ò»¶¨Òª×¢Òâ´úÂ룬±ÜÃâÒýÈë²»±ØÒªµÄ×Ô¶¯×°Ïä²Ù×÷¡£
×ܵÄÀ´Ëµ£¬×Ô¶¯×°ÏäºÍ²ðÏä×ÅʵΪ¿ª·¢Õß´øÀ´Á˺ܴóµÄ·½±ã£¬µ«ÊÇÔÚʹÓÃʱҲÊÇÐèÒª¸ñÍâÁôÒ⣬±ÜÃâÒýÆð³öÏÖÎÄÕÂÌáµ½µÄÎÊÌâ¡£ |