एक पूर्णांक के अंतर मूल्य में वृद्धि?


81

मैं जावा में इंटेगर का मूल्य कैसे बढ़ाऊं? मुझे पता है कि मैं intValue के साथ मूल्य प्राप्त कर सकता हूं, और मैं इसे नए Integer (int i) के साथ सेट कर सकता हूं।

playerID.intValue()++;

काम नहीं लगता है।

नोट: PlayerID एक पूर्णांक है जिसे इसके साथ बनाया गया है:

Integer playerID = new Integer(1);

7
आप इन्टर्स के बजाय इंटेगर का उपयोग क्यों कर रहे हैं?
अमरा

5
@ मेरे लिए यह आमतौर पर है क्योंकि आप जावा में सामान्य तर्कों के रूप में आदिम प्रकारों का उपयोग नहीं कर सकते हैं।
स्टीव ब्लैकवेल

जवाबों:


100

Integerऑब्जेक्ट अपरिवर्तनीय हैं, इसलिए आपके द्वारा बनाए जाने के बाद आप मान को संशोधित नहीं कर सकते। आपको एक नया बनाने Integerऔर मौजूदा एक को बदलने की आवश्यकता होगी।

playerID = new Integer(playerID.intValue() + 1);

4
यदि आप एक गैर-आदिम int का उपयोग करना चाहते हैं, और आप परिवर्तनशीलता चाहते हैं, तो आप MutableInt commons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable// पर जाएं
Joel

धन्यवाद, लेकिन किसी कारण से यह अभी भी नहीं बढ़ रहा है। शायद यह मेरे कोड में एक बग है ...
विलियम

1
@William: जैसा कि मैं जानता हूं, यह केवल उस विधि में वेतन वृद्धि होगी जो इसे बढ़ाती है।
स्टेन कुरिलिन

13
Integer के कंस्ट्रक्टर का उपयोग न करें।
कॉलिनडी

2
@Grodriguez: शायद, तब भी मैं सुझाव दूंगा Integer.valueOf(int)... मुझे उत्तर में बुरी प्रथाओं का उपयोग करने का विचार पसंद नहीं है, यह लोगों को यह सोचने के लिए प्रेरित कर सकता है कि वे करना ठीक है। मुझे यह भी लगता है कि यह ओपी के लिए यह महसूस करना उपयोगी है कि वह उसी तरह से एक के intसाथ संचालन का उपयोग कर सकता Integerहै।
कोलिनड

49

जैसा कि ग्रोड्रिग्ज कहते हैं, Integerवस्तुएं अपरिवर्तनीय हैं। यहां समस्या यह है कि आप intखिलाड़ी आईडी के बजाय खिलाड़ी आईडी के मूल्य में वृद्धि करने का प्रयास कर रहे हैं । जावा 5+ में, आप बस लिख सकते हैं playerID++

एक साइड नोट के रूप में, कभी भी निर्माता को कॉल न करें Integer। बस बताए द्वारा autoboxing का लाभ उठाएं intको रों Integerसीधे है, की तरह Integer foo = 5। यह Integer.valueOf(int)पारदर्शी रूप से उपयोग करेगा , जो कंस्ट्रक्टर से बेहतर है क्योंकि इसे हमेशा एक नई वस्तु बनाने की ज़रूरत नहीं है।


14

AtomicInteger

हो सकता है कि यह कुछ लायक भी हो: एक जावा वर्ग कहा जाता है AtomicInteger

इस वर्ग की कुछ उपयोगी विधियाँ हैं जैसे addAndGet(int delta)या incrementAndGet()(और उनके समकक्ष) जो आपको एक ही उदाहरण के मूल्य को बढ़ाने / घटाने की अनुमति देती हैं। यद्यपि वर्ग को संगामिति के संदर्भ में उपयोग करने के लिए डिज़ाइन किया गया है , यह अन्य परिदृश्यों में भी काफी उपयोगी है और संभवत: आपकी आवश्यकता के अनुरूप है।

final AtomicInteger count = new AtomicInteger( 0 ) ;
…
count.incrementAndGet();  // Ignoring the return value. 

13

जावा 7 और 8. इंक्रीमेंट डीओईएस संदर्भ को बदल देता है, इसलिए यह किसी अन्य इंटेगर ऑब्जेक्ट को संदर्भित करता है। देखो:

@Test
public void incInteger()
{
    Integer i = 5;
    Integer iOrig = i;
    ++i; // Same as i = i + 1;
    Assert.assertEquals(6, i.intValue());
    Assert.assertNotEquals(iOrig, i);
}

अपने आप में पूर्णांक अभी भी अपरिवर्तनीय है।


यह IMHO सबसे अच्छा जवाब है क्योंकि यह ++iफ़ंक्शन (वेरिएबल पर iध्यान देता है; ध्यान दें कि आपने i++जैसा भी लिखा हो ) और Integerवर्ग अपरिवर्तनीयता (वेरिएबल पर iOrig)। अधिकांश अन्य उत्तर केवल दो धारणाओं में से एक को प्रदर्शित करते हैं।
जुलिएन क्रोनग

7

पूर्णांक वस्तुएँ अपरिवर्तनीय हैं। आप ऑब्जेक्ट द्वारा रखे गए पूर्णांक के मान को बदल नहीं सकते हैं, लेकिन आप परिणाम को धारण करने के लिए एक नया पूर्णांक ऑब्जेक्ट बना सकते हैं:

Integer start = new Integer(5);
Integer end = start + 5; // end == 10;

6

जावा 7 के लिए, इंक्रीमेंट ऑपरेटर '++' इंटिजर्स पर काम करता है। नीचे एक परीक्षित उदाहरण है

    Integer i = new Integer( 12 );
    System.out.println(i); //12
    i = i++;
    System.out.println(i); //13

2
लेकिन इस बात का ध्यान रखें कि अन्य संदर्भ i = new Integer(12)अभी भी संदर्भित होंगे 12, नहीं 13... इस पर एक
दूसरे से उलझना

1
हाँ, इस कारण से आपको पूर्णांक वस्तु का मान पुन:
सौंपना होगा

2
i = i++जैसा है वैसा नहीं है i++। तकनीकी रूप से, ++वास्तव में पूर्णांकों पर काम नहीं करता है , मैं कहूंगा कि आप इसका उपयोग स्वयं बिना किसी परिणाम के असाइन किए बिना कर सकते हैं।
साइमन फोर्सबर्ग

1
आपको पुन: असाइन करने की आवश्यकता नहीं है! लुक: इंटेगर फू = 5; इंटेगर बार = फू; foo ++; System.out.println ("foo:" + foo + "bar:" + bar); आउटपुट: फू: ६ बार: ५
क्लेमेप

4

शायद आप कोशिश कर सकते हैं:

final AtomicInteger i = new AtomicInteger(0);
i.set(1);
i.get();

3

आप IntHolder का उपयोग कर सकते हैं के रूप में पूर्णांक के लिए वैकल्पिक विकल्प। लेकिन क्या यह मूल्य है?


1

सभी आदिम आवरण वस्तुएं अपरिवर्तनीय हैं।

मुझे शायद इस सवाल पर देर हो रही है लेकिन मैं जोड़ना चाहता हूं और स्पष्ट करना चाहता हूं कि जब आप करते हैं playerID++, तो वास्तव में ऐसा कुछ होता है:

playerID = Integer.valueOf( playerID.intValue() + 1);

Integer.valueOf (int) हमेशा रेंज -128 में 127, समावेशी, और इस रेंज के बाहर अन्य मूल्यों को कैश कर सकता है


1
playerID = Integer.valueOf (playerID.intValue () + 1); एक नया इंटेगर ऑब्जेक्ट हमेशा नहीं बनाया जाता है। ऑटोबॉक्सिंग कल्पना: docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7। यदि मूल्य p बॉक्सिंग किया जा रहा है तो सही, गलत, एक बाइट, या एक चार रेंज \ u0000 से \ u007f, या -128 और 127 (समावेशी) के बीच एक इंट या शॉर्ट नंबर, फिर r1 और r2 को पी के किसी भी दो बॉक्सिंग रूपांतरणों का परिणाम होने दें। यह हमेशा ऐसा होता है कि r1 == r2। जावा 7 के बाद से, docs.oracle.com/javase/specs/jls/se7/html/… ++ ऑपरेटर पर भी लागू होता है
gary

समझ गया, जवाब मिला। इंटेगर ऑब्जेक्ट के playerID++परिणाम में कुछ वृद्धि होती है playerID = Integer.valueOf( playerID.intValue() + 1)और विधि के डॉक्स के अनुसार: यह विधि हमेशा -128-127 से लेकर 127 तक समावेशी मूल्यों को कैश करेगी।
हमजा बेल्मेलॉकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.