टीयू पर, 9 मार्च, 2010 को 03:02 पर, केविन एल स्टर्न ने लिखा:
मैंने एक त्वरित खोज की और यह प्रतीत होता है कि जावा वास्तव में दो का पूरक है। फिर भी, कृपया मुझे यह इंगित करने की अनुमति दें कि, सामान्य रूप से, इस प्रकार का कोड मुझे चिंतित करता है क्योंकि मैं पूरी तरह से उम्मीद करता हूं कि किसी बिंदु पर कोई व्यक्ति साथ आएगा और वही करेगा जो डीमित्रो ने सुझाया था; वह है, कोई बदल जाएगा:
if (a - b > 0)
सेवा
if (a > b)
और पूरा जहाज डूब जाएगा। मैं, व्यक्तिगत रूप से, अस्पष्टताओं से बचना पसंद करता हूं जैसे कि पूर्णांक मेरे एल्गोरिथ्म के लिए एक अनिवार्य आधार को ओवरफ्लो करता है जब तक कि ऐसा करने का कोई अच्छा कारण न हो। मैं, सामान्य तौर पर, अतिप्रवाह से बचने के लिए और अतिप्रवाह परिदृश्य को अधिक स्पष्ट बनाने के लिए पसंद करूंगा:
if (oldCapacity > RESIZE_OVERFLOW_THRESHOLD) {
// Do something
} else {
// Do something else
}
अच्छी बात है।
में ArrayList
हम ऐसा नहीं कर सकते (या कम से कम अनुरूपता से नहीं), क्योंकि
ensureCapacity
एक सार्वजनिक एपीआई है और प्रभावी रूप से पहले से ही एक सकारात्मक क्षमता है कि संतुष्ट नहीं किया जा सकता है के लिए अनुरोध के रूप में ऋणात्मक संख्याओं स्वीकार करता है।
वर्तमान एपीआई इस तरह प्रयोग किया जाता है:
int newcount = count + len;
ensureCapacity(newcount);
यदि आप अतिप्रवाह से बचना चाहते हैं, तो आपको कुछ कम प्राकृतिक परिवर्तन करने की आवश्यकता होगी
ensureCapacity(count, len);
int newcount = count + len;
वैसे भी, मैं अतिप्रवाह-सचेत कोड रख रहा हूं, लेकिन अधिक चेतावनी टिप्पणियां जोड़ रहा हूं, और "आउट-लाइनिंग" विशाल सरणी निर्माण कर रहा हूं ताकि
ArrayList
अब ऐसा कोड दिखता है:
/**
* Increases the capacity of this <tt>ArrayList</tt> instance, if
* necessary, to ensure that it can hold at least the number of elements
* specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
public void ensureCapacity(int minCapacity) {
modCount++;
// Overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// Overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
private int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
वेबरेव ने पुनर्जीवित किया।
मार्टिन
if (newCapacity - minCapacity < 0)
बेहतर हैif (newCapacity < minCapacity)
?