2011-11-04 10 views
23
while(i <= j && i >= j && i != j) {} 

आई और जे को एक अनंत लूप बनाने के लिए कैसे घोषित किया जाए?आई और जे को एक अनंत लूप बनाने के लिए कैसे घोषित किया जाए?

// यह एक साक्षात्कार प्रश्न है जिसे मैंने मुलाकात की।

यह पूछ रहा है कि मैं और जे की घोषणा क्या है, इसे हमेशा सत्य बनाएं।

और मैं इसे और संख्या संख्या के रूप में घोषित करके इसे बाहर नहीं कर सकता। अन्य प्रकार क्या मिल सकते हैं?

+0

मैं कहां हूं? .... – Kasturi

+0

@ डीजेक्लेवर्थ "" || "संस्करण से आपका क्या मतलब है? –

+0

@ एलन, बहुत अच्छा सवाल +1 – ELAYARAJA

उत्तर

38
Integer i=new Integer(1000); 
Integer j=new Integer(1000); 

System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j)); 

i और j<= और >= के लिए ints के लिए स्वचालित रूप अनबॉक्स्ड होगा, लेकिन != के लिए नहीं। i और j अलग-अलग उदाहरण हैं, लेकिन एक ही int मान है। यही कारण है कि सभी तीन तुलना सच हो जाएगी।

+2

अच्छा, मुझे लगता है कि यह सही जवाब है। कम से कम यह सच हो रहा है .// क्या एक मुश्किल साक्षात्कार सवाल !!! – Alan

+0

बस मुझे इसे हराया। – DJClayworth

+1

+1 'i <= j && i > = j && i! = J' [इस मामले में 'सत्य' का मूल्यांकन करता है] (http://ideone.com/G1xjn) –

-2

की 'i' और 'जे' दिया बयान के साथ सच का पता चलता है, किसी भी समान मूल्य कहते हैं:

Integer i = new Integer(1); 
Integer j = new Integer(1); 

while(i <= j && i >= j && i != j) {} 

जादू का इस्तेमाल किया ऑपरेटर के साथ है! ! = ऑपरेटर के मामले में कंपाइलर ऑब्जेक्ट्स को ऑब्जेक्ट्स (उनके मूल्यों सहित) के रूप में लेता है जबकि> = या < = कंपाइलर केवल ऑपरेंड मान लेता है। इस प्रकार, उपर्युक्त कथन सत्य देता है।

3

यह भी काम करता है ("मेरे मशीन पर"):

Integer a = 128, b = 128; 

इस जबकि काम नहीं करेगा:

Integer a = 127, b = 127; 

स्वत: मुक्केबाजी एक intInteger.valueOf(int) के लिए एक कॉल के लिए वाक्यात्मक चीनी है। यह फ़ंक्शन -128 से 127 तक मूल्यों के लिए कैश का उपयोग करता है। यह अन्य मूल्यों को कैश कर सकता है, लेकिन मेरे मामले में, यह नहीं है।

इस प्रकार, 128 के असाइनमेंट में कैश हिट नहीं है; यह प्रत्येक ऑटो-मुक्केबाजी ऑपरेशन के साथ एक नया Integer उदाहरण बनाता है, और संदर्भ तुलना a != b सत्य है। 127 के असाइनमेंट में कैश हिट है, और परिणामी Integer ऑब्जेक्ट्स वास्तव में कैश से एक ही उदाहरण हैं। तो, संदर्भ तुलना a != b गलत है।

मैं वास्तव में क्या इंगित करना चाहता हूं ऑटो-मुक्केबाजी के साथ संदर्भ तुलना से सावधान रहना है। एक और संभावित वास्तविक दुनिया की समस्या यह है कि आप a == b की उम्मीद करते हैं क्योंकि उन्हें एक ही (ऑटो-बॉक्सिंग) मान दिया गया था, आप कुछ यूनिट परीक्षण चलाते हैं जो आपकी अपेक्षा की पुष्टि करते हैं, और फिर आपका कोड "जंगली में" विफल रहता है जब कुछ काउंटर कैश की ऊपरी सीमा से अधिक है। मनोरंजन समय!

+0

+1 [बंथर के उत्तर] के लिए बढ़िया जोड़ा (http://stackoverflow.com/a/8015528/2932052)! – Wolf

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