2016-03-21 5 views
7

मेरे पास नीचे दो स्ट्रिंग हैं:असाइनमेंट ऑपरेटर जावा में मेमोरी का उपभोग करता है?

"yes", "no"

अब, मैं दो तरीकों से इन स्ट्रिंग्स तुलना करने के लिए करना चाहते हैं:

  1. सीधे:
    उदाहरण: "yes".equals("no")

  2. कुछ चर करने के लिए तार बताए द्वारा: उदाहरण:

    String string1 = "yes"; 
    String string2 ="no"; 
    string1.equals(string2); 
    

इन दो मामलों में, क्या कोई स्मृति या प्रदर्शन अंतर है?

+1

समान प्रदर्शन – Andrew

+1

ऐसे छोटे कोड स्निपेट के बारे में तर्क करना मुश्किल है। वेरिएबल्स को कहीं और संदर्भित किया गया है, भले ही उन्हें असाइन किया गया हो, और वास्तव में 'बराबर' का परिणाम वास्तव में संग्रहीत या उपयोग किया जाता है या नहीं, यह संकुचित हो सकता है कि संकलक किस कोड को आउटपुट करने का निर्णय लेता है। – Pharap

+0

प्रोग्रामिंग के बारे में सोचने का यह तरीका आपको प्रदर्शन में कोई वृद्धि के बिना अपठनीय कोड लिखने के लिए प्रेरित करेगा। – Radiodef

उत्तर

14

एक बहुत ही मामूली अंतर है (प्रभावी रूप से नगण्य, हम यहां माइक्रो-ऑप्टिमाइज़ेशन की बात कर रहे हैं), क्योंकि स्ट्रिंग को स्थानीय चर में संग्रहीत किया जाना चाहिए जो इसी विधि के स्टैक फ्रेम पर अतिरिक्त मात्रा में स्मृति लेता है। जबकि स्थिरांक वास्तव में निरंतर पूल में संग्रहीत होते हैं और साझा किए जाते हैं। आमंत्रण की संख्या के आधार पर जेवीएम की संभावित अनुकूलन के साथ, इससे कोई फर्क नहीं पड़ता।

ध्यान दें कि वेरिएबल final या प्रभावी ढंग से final (केवल एक बार असाइन किए गए) थे, क्योंकि बाइटकोड समान होगा, क्योंकि इस मामले में उन्हें स्थिरांक माना जाता है।

+2

* ध्यान दें कि चर के अंतिम होने पर कोई फर्क नहीं पड़ता है, इस मामले में उन्हें प्रभावी रूप से स्थिरांक के रूप में माना जाता है। *> यह भी ध्यान रखें कि, दिए गए चर को कोड में कहीं और फिर से असाइन नहीं किया गया है, संकलक उन्हें स्पष्ट रूप से पहचानेंगे "अंतिम" और वही अनुकूलन करें जो किया जाएगा यदि 'अंतिम' कीवर्ड का स्पष्ट रूप से उपयोग किया गया था। – errantlinguist

+4

मुझे नहीं लगता कि ढेर यहां शामिल है। वे निरंतर पूल में तारों के संदर्भ हैं। संदर्भ चर ढेर, AFAIK पर रखा जाता है। – Puce

+0

हमारे कोड में अगर हम इस असाइनमेंट को लगभग 100 बार करते हैं। तो क्या यह स्मृति और प्रदर्शन का उपभोग करता है? –

6

कंपाइलर के आधार पर यह स्टैक पर 2 अतिरिक्त ऑब्जेक्ट संदर्भों की जगह ले सकता है, मुझे लगता है। ये बहुत छोटे हैं, जब तक आप अपना आवेदन प्रोफाइल नहीं करते हैं, तब तक आप उन्हें अनदेखा कर सकते हैं और आपने वहां एक समस्या देखी है (बहुत संभावना नहीं है)।

"हाँ" .equals ("नहीं")

वास्तविक कोड में वहाँ शायद ही कभी इस तरह एक स्थिति है के रूप में आप पहले से ही है, तो 2 शाब्दिक एक ही हैं या नहीं पता होगा।

9

इन कोड स्निपेट को संकलित करने के परिणामस्वरूप उसी बाइटकोड होगा। इसलिए, कोई स्मृति खपत या प्रदर्शन अंतर नहीं है।

असाइनमेंट ऑपरेटर कभी स्मृति का उपभोग (ऑटोबॉक्सिंग के मामले को छोड़कर: Integer number = 42)। स्थानीय परिवर्तनीय घोषणा स्टैक में स्मृति आवंटित कर सकती है (यदि आवश्यक हो), लेकिन आपको कोड पठनीयता पसंद करना चाहिए।

+1

कुछ स्थिर (128?) से कम संख्या के लिए, ऑटोबॉक्सिंग या तो कोई स्मृति नहीं लेता है। – Cephalopod

+1

@ सेफलोपॉड आप सही हैं, संख्याओं में संख्या के लिए [-128, 127] यह जेएलएस 7 5.1.7 – fRoStBiT

+0

द्वारा गारंटी है नोट करें कि ऊपरी बाउंड को संशोधित किया जा सकता है, इसलिए मुझे संदेह है कि यह स्पष्ट रूप से गारंटीकृत है। –

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