2012-01-27 12 views
21

Recenlty मैं इस तरह कोड (जावा) देखा:मतभेद (123), Integer.valueOf (123) और सिर्फ 123

myMethod(new Integer(123)); 

मैं वर्तमान में कुछ कोड पुनर्रचना कर रहा हूँ, और वहाँ में एक टिप है सोनार उपकरण, इस तरह sth उपयोग करने के लिए है कि यह अधिक स्मृति अनुकूल है:

myMethod(Integer.valueOf(123)); 

हालांकि इस मामले में, मुझे लगता है कि वहाँ कोई अंतर नहीं है कि अगर मैं का प्रयोग करेंगे:

myMethod(123); 

मैं समझ सकता था कि, यदि मैं विधि में एक चर पारित कर दूंगा, लेकिन हार्ड कोडित int? या यदि लंबी/डबल आदि होगी और मुझे संख्या का लंबा प्रतिनिधित्व करना है। लेकिन पूर्णांक?

+4

यह वास्तव में कोई फर्क नहीं पड़ता अगर आप 'MyMethod (Integer.valueOf (123))' या 'MyMethod (123)' autoboxing रूप में प्रयोग करेंगे Integer.valueOf() 'आप के लिए' करो। अपने लिए न्यायाधीश जो अधिक पठनीय है। (यह मानते हुए '' myMethod' लेता Integer') – soulcheck

उत्तर

27

new Integer(123) प्रत्येक कॉल के लिए एक नया Object उदाहरण तैयार करेगा।

javadoc के अनुसार, Integer.valueOf(123) अंतर यह वस्तुओं कैश ... है तो आप (या नहीं कर सकते हैं) के ऊपर एक ही Object साथ खत्म हो सकता है अगर आप इसे एक बार से अधिक कहते हैं। (पर विचार

a==b? false 
c==d? true 

int मूल्य का उपयोग कर, आप आदिम प्रकार का उपयोग कर रहे हैं के रूप में अपने विधि भी उपयोग करता है:

उदाहरण के लिए, निम्न कोड:

public static void main(String[] args) { 

     Integer a = new Integer(1); 
     Integer b = new Integer(1); 

     System.out.println("a==b? " + (a==b)); 

     Integer c = Integer.valueOf(1); 
     Integer d = Integer.valueOf(1); 

     System.out.println("c==d? " + (c==d)); 

    } 

निम्नलिखित उत्पादन है इसके हस्ताक्षर पर आदिम प्रकार) - यह थोड़ा कम स्मृति का उपयोग करेगा और तेजी से हो सकता है, लेकिन उदाहरण के लिए, आप इसे संग्रह में जोड़ने के लिए सक्षम नहीं होंगे।

भी जावा के AutoBoxing पर एक नज़र डालें, तो अपने विधि के हस्ताक्षर Integer का उपयोग करता है - जब यह उपयोग करते हुए, JVM आपके लिए अपने आप Integer.valueOf() कॉल करेंगे (इसलिए कैश रूप में अच्छी तरह का उपयोग)।

+1

तो हमेशा एक नई वस्तु बनाने autoboxing करता है? या यह कैशिंग का उपयोग भी कर सकता है? यदि आप इस जानकारी को अपनी पोस्ट में जोड़ते हैं, तो मुझे लगता है कि आपका सबसे अच्छा जवाब होगा। –

+0

@Marcelo ... आप कृपया उस जानकारी को भी जो कर सकते हैं एलेक्स डी का सुझाव दिया था ... –

+1

@MananShah यह पहले से वहां (: हाँ - autoboxing का उपयोग करता है 'Integer.valueOf()', तो यह उपयोग कैशिंग करता है। – Marcelo

5

public static Integer valueOf(int i)

एक पूर्णांक उदाहरण निर्दिष्ट पूर्णांक मूल्य का प्रतिनिधित्व देता है। यदि एक नया इंटीजर इंस्टेंस की आवश्यकता नहीं है, तो इस विधि को को आमतौर पर के रूप में कन्स्ट्रक्टर इंटीजर (int) के वरीयता में उपयोग किया जाना चाहिए, यह विधि अक्सर अनुरोधित मानों को कैशिंग करके प्रदर्शन को बेहतर स्थान और समय प्रदान करने की संभावना है।

पैरामीटर:
i - एक int मूल्य।
रिटर्न:
a इंटीजर इंस्टेंस i का प्रतिनिधित्व करता है।
के बाद से:
1,5

उल्लेख http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#valueOf%28int%29

valueOf की इस प्रकार बाइट के लिए JDK 5 में जोड़ा गया है, लघु, पूर्णांक, और लांग (यह पहले से ही JDK 1.4 के बाद से बूलियन में तुच्छ मामले में ही अस्तित्व में)। ये सभी, निश्चित रूप से, जावा में अपरिवर्तनीय वस्तुएं हैं।ऐसा प्रतीत होता है कि यदि आपको किसी इंटीग्रेट ऑब्जेक्ट की आवश्यकता होती है, तो आप एक नया इंटीजर बनायेंगे। लेकिन जेडीके 5+, में आपको वास्तव में valueOf का उपयोग करना चाहिए क्योंकि इंटीजर अब -128 और 127 के बीच इंटीजर ऑब्जेक्ट्स को कैश करता है और आपको ब्रांड के समान समान इंटीजर पर ऑब्जेक्ट निर्माण को बर्बाद करने के बजाय हर बार एक ही सटीक इंटीजर (0) ऑब्जेक्ट को वापस ले सकता है वस्तु।

private static class IntegerCache { 
private IntegerCache(){} 

static final Integer cache[] = new Integer[-(-128) + 127 + 1]; 

static { 
    for(int i = 0; i < cache.length; i++) 
    cache[i] = new Integer(i - 128); 
} 
} 

public static Integer valueOf(int i) { 
final int offset = 128; 
if (i >= -128 && i <= 127) { // must cache 
    return IntegerCache.cache[i + offset]; 
} 
    return new Integer(i); 
} 

उल्लेख Why YOU should use Integer.valueOf(int)

संपादित

autoboxing और ऑब्जेक्ट निर्माण:

महत्वपूर्ण बात हम पर विचार करना चाहिए कि autoboxing ऑब्जेक्ट निर्माण को कम नहीं करता है, लेकिन यह कोड को कम कर देता जटिलता। अंगूठे का एक अच्छा नियम उन प्राचीन प्रकारों का उपयोग करना है जहां वस्तुओं की आवश्यकता नहीं है, दो कारणों से:

आदिम प्रकार उनके संबंधित रैपर प्रकारों से धीमे नहीं होंगे, और बहुत तेज़ हो सकते हैं। कुछ अप्रत्याशित व्यवहार हो सकते हैं जिसमें == (संदर्भों की तुलना करें) और .equals() (मानों की तुलना करें) शामिल हैं।

आम तौर पर, जब प्राचीन प्रकारों को रैपर प्रकारों में बॉक्स किया जाता है, तो JVM स्मृति आवंटित करता है और एक नई वस्तु बनाता है। लेकिन कुछ विशेष मामलों के लिए, जेवीएम एक ही वस्तु का पुन: उपयोग करता है।

निम्नलिखित अपरिवर्तनीय वस्तुओं के रूप में जमा पुरातन की सूची है:

  • बूलियन मूल्यों सच्चे और झूठे

  • सभी बाइट -128 और 127

  • के बीच

  • कम मूल्यों को महत्व देता है

  • int मूल्य -128 और 127

  • 0 के बीच int मान श्रेणी \ u0000 में
  • चार \ u007F

उल्लेख http://today.java.net/pub/a/today/2005/03/24/autoboxing.html#performance_issue

1

पूर्णांक आदिम प्रकार, नहीं एक वस्तु है।

एक पूर्णांक उदाहरण निर्दिष्ट पूर्णांक मूल्य का प्रतिनिधित्व रिटर्न:

new Integer(123) और Integer.valueOf(123) दोनों Integer वस्तु Integer.valueOf() के लिए प्रति जावाडोक के रूप में मूल्य 123 का प्रतिनिधित्व लौट आते हैं। यदि कोई नया इंटीजर इंस्टेंस आवश्यक नहीं है, तो इस विधि को आमतौर पर को कन्स्ट्रक्टर इंटीजर (int) के वरीयता में उपयोग किया जाना चाहिए, क्योंकि यह विधि कैश करके अक्सर बेहतर स्थान और समय प्रदर्शन प्रदान करने की संभावना है।

1

क्या आपकी विधि को int या Integer की आवश्यकता है?

new Integer(int) और Integer.valueOf(int) दोनों Integer वस्तुओं लौटने के लिए, लेकिन के रूप में यह और अधिक कुशल है, क्योंकि यह कैश्ड वस्तुओं रिटर्न valueOf प्राथमिकता दी जानी चाहिए। अपने विधि एक Integer की आवश्यकता है, तो आप Integer.valueOf उपयोग करना चाहिए।

यदि आपकी विधि को int की आवश्यकता है, तो आपको int (उदा। 123) का उपयोग करना चाहिए।

हालांकि, यह autoboxing की वजह से इस तरह से है, जो स्वचालित रूप से एक Integer और इसके विपरीत करने के लिए एक int धर्मान्तरित जब प्रकार से मेल नहीं खाते में प्रकार मैच के लिए सख्ती से आवश्यक नहीं है। यह आपको एक विधि एक Integer, एक प्रणाली की एक int की आवश्यकता होती है में एक Integer की आवश्यकता होती है में एक int पारित करने के लिए अनुमति देता है। लेकिन ध्यान रखें कि ऑटोबॉक्सिंग से जुड़े प्रदर्शन लागतें हैं। जब आप ऑटोबॉक्सिंग का उपयोग करेंगे तो सबसे आम उदाहरण यह है कि यदि आप संग्रह में प्राइमेटिव स्टोर करना चाहते हैं।

1

केवल कैश में -128 127 को लागू के बीच है।

http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7

JDK में

5 +, तुम सच में valueOf का उपयोग करना चाहिए क्योंकि पूर्णांक अब -128 और 127 के बीच पूर्णांक वस्तुओं कैश और तुम वापस हाथ कर सकते हैं एक ही सटीक:

Integer a = new Integer(1); 
Integer b = new Integer(1); 

System.out.println("a==b? " + (a==b)); 

Integer c = Integer.valueOf(127); 
Integer d = Integer.valueOf(127); 

System.out.println("c==d? " + (c==d)); 

Integer e = Integer.valueOf(128); 
Integer f = Integer.valueOf(128); 

System.out.println("e==f? " + (e==f)); 

इस जावा विनिर्देश देखें एक ब्रांड नई समान इंटीजर ऑब्जेक्ट पर ऑब्जेक्ट निर्माण को बर्बाद करने के बजाय हर बार इंटीजर (0) ऑब्जेक्ट।

संबंधित मुद्दे