• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 
18 package java.lang;
19 
20 /**
21  * The wrapper for the primitive type {@code long}.
22  * <p>
23  * Implementation note: The "bit twiddling" methods in this class use techniques
24  * described in <a href="http://www.hackersdelight.org/">Henry S. Warren,
25  * Jr.'s Hacker's Delight, (Addison Wesley, 2002)</a> and <a href=
26  * "http://graphics.stanford.edu/~seander/bithacks.html">Sean Anderson's
27  * Bit Twiddling Hacks.</a>
28  *
29  * @see java.lang.Integer
30  * @since 1.0
31  */
32 @FindBugsSuppressWarnings("DM_NUMBER_CTOR")
33 public final class Long extends Number implements Comparable<Long> {
34 
35     private static final long serialVersionUID = 4290774380558885855L;
36 
37     /**
38      * The value which the receiver represents.
39      */
40     private final long value;
41 
42     /**
43      * Constant for the maximum {@code long} value, 2<sup>63</sup>-1.
44      */
45     public static final long MAX_VALUE = 0x7FFFFFFFFFFFFFFFL;
46 
47     /**
48      * Constant for the minimum {@code long} value, -2<sup>63</sup>.
49      */
50     public static final long MIN_VALUE = 0x8000000000000000L;
51 
52     /**
53      * The {@link Class} object that represents the primitive type {@code long}.
54      */
55     @SuppressWarnings("unchecked")
56     public static final Class<Long> TYPE
57             = (Class<Long>) long[].class.getComponentType();
58     // Note: Long.TYPE can't be set to "long.class", since *that* is
59     // defined to be "java.lang.Long.TYPE";
60 
61     /**
62      * Constant for the number of bits needed to represent a {@code long} in
63      * two's complement form.
64      *
65      * @since 1.5
66      */
67     public static final int SIZE = 64;
68 
69     /**
70      * Constructs a new {@code Long} with the specified primitive long value.
71      *
72      * @param value
73      *            the primitive long value to store in the new instance.
74      */
Long(long value)75     public Long(long value) {
76         this.value = value;
77     }
78 
79     /**
80      * Constructs a new {@code Long} from the specified string.
81      *
82      * @param string
83      *            the string representation of a long value.
84      * @throws NumberFormatException
85      *             if {@code string} cannot be parsed as a long value.
86      * @see #parseLong(String)
87      */
Long(String string)88     public Long(String string) throws NumberFormatException {
89         this(parseLong(string));
90     }
91 
92     @Override
byteValue()93     public byte byteValue() {
94         return (byte) value;
95     }
96 
97     /**
98      * Compares this object to the specified long object to determine their
99      * relative order.
100      *
101      * @param object
102      *            the long object to compare this object to.
103      * @return a negative value if the value of this long is less than the value
104      *         of {@code object}; 0 if the value of this long and the value of
105      *         {@code object} are equal; a positive value if the value of this
106      *         long is greater than the value of {@code object}.
107      * @see java.lang.Comparable
108      * @since 1.2
109      */
compareTo(Long object)110     public int compareTo(Long object) {
111         return compare(value, object.value);
112     }
113 
114     /**
115      * Compares two {@code long} values.
116      * @return 0 if lhs = rhs, less than 0 if lhs &lt; rhs, and greater than 0 if lhs &gt; rhs.
117      * @since 1.7
118      */
compare(long lhs, long rhs)119     public static int compare(long lhs, long rhs) {
120         return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
121     }
122 
invalidLong(String s)123     private static NumberFormatException invalidLong(String s) {
124         throw new NumberFormatException("Invalid long: \"" + s + "\"");
125     }
126 
127     /**
128      * Parses the specified string and returns a {@code Long} instance if the
129      * string can be decoded into a long value. The string may be an optional
130      * optional sign character ("-" or "+") followed by a hexadecimal ("0x..."
131      * or "#..."), octal ("0..."), or decimal ("...") representation of a long.
132      *
133      * @param string
134      *            a string representation of a long value.
135      * @return a {@code Long} containing the value represented by {@code string}.
136      * @throws NumberFormatException
137      *             if {@code string} cannot be parsed as a long value.
138      */
decode(String string)139     public static Long decode(String string) throws NumberFormatException {
140         int length = string.length();
141         if (length == 0) {
142             throw invalidLong(string);
143         }
144 
145         int i = 0;
146         char firstDigit = string.charAt(i);
147         boolean negative = firstDigit == '-';
148         if (negative || firstDigit == '+') {
149             if (length == 1) {
150                 throw invalidLong(string);
151             }
152             firstDigit = string.charAt(++i);
153         }
154 
155         int base = 10;
156         if (firstDigit == '0') {
157             if (++i == length) {
158                 return valueOf(0L);
159             }
160             if ((firstDigit = string.charAt(i)) == 'x' || firstDigit == 'X') {
161                 if (i == length) {
162                     throw invalidLong(string);
163                 }
164                 i++;
165                 base = 16;
166             } else {
167                 base = 8;
168             }
169         } else if (firstDigit == '#') {
170             if (i == length) {
171                 throw invalidLong(string);
172             }
173             i++;
174             base = 16;
175         }
176 
177         long result = parse(string, i, base, negative);
178         return valueOf(result);
179     }
180 
181     @Override
doubleValue()182     public double doubleValue() {
183         return value;
184     }
185 
186     /**
187      * Compares this instance with the specified object and indicates if they
188      * are equal. In order to be equal, {@code o} must be an instance of
189      * {@code Long} and have the same long value as this object.
190      *
191      * @param o
192      *            the object to compare this long with.
193      * @return {@code true} if the specified object is equal to this
194      *         {@code Long}; {@code false} otherwise.
195      */
196     @Override
equals(Object o)197     public boolean equals(Object o) {
198         return (o instanceof Long) && (((Long) o).value == value);
199     }
200 
201     @Override
floatValue()202     public float floatValue() {
203         return value;
204     }
205 
206     /**
207      * Returns the {@code Long} value of the system property identified by
208      * {@code string}. Returns {@code null} if {@code string} is {@code null}
209      * or empty, if the property can not be found or if its value can not be
210      * parsed as a long.
211      *
212      * @param string
213      *            the name of the requested system property.
214      * @return the requested property's value as a {@code Long} or {@code null}.
215      */
getLong(String string)216     public static Long getLong(String string) {
217         if (string == null || string.length() == 0) {
218             return null;
219         }
220         String prop = System.getProperty(string);
221         if (prop == null) {
222             return null;
223         }
224         try {
225             return decode(prop);
226         } catch (NumberFormatException ex) {
227             return null;
228         }
229     }
230 
231     /**
232      * Returns the {@code Long} value of the system property identified by
233      * {@code string}. Returns the specified default value if {@code string} is
234      * {@code null} or empty, if the property can not be found or if its value
235      * can not be parsed as a long.
236      *
237      * @param string
238      *            the name of the requested system property.
239      * @param defaultValue
240      *            the default value that is returned if there is no long system
241      *            property with the requested name.
242      * @return the requested property's value as a {@code Long} or the default
243      *         value.
244      */
getLong(String string, long defaultValue)245     public static Long getLong(String string, long defaultValue) {
246         if (string == null || string.length() == 0) {
247             return valueOf(defaultValue);
248         }
249         String prop = System.getProperty(string);
250         if (prop == null) {
251             return valueOf(defaultValue);
252         }
253         try {
254             return decode(prop);
255         } catch (NumberFormatException ex) {
256             return valueOf(defaultValue);
257         }
258     }
259 
260     /**
261      * Returns the {@code Long} value of the system property identified by
262      * {@code string}. Returns the specified default value if {@code string} is
263      * {@code null} or empty, if the property can not be found or if its value
264      * can not be parsed as a long.
265      *
266      * @param string
267      *            the name of the requested system property.
268      * @param defaultValue
269      *            the default value that is returned if there is no long system
270      *            property with the requested name.
271      * @return the requested property's value as a {@code Long} or the default
272      *         value.
273      */
getLong(String string, Long defaultValue)274     public static Long getLong(String string, Long defaultValue) {
275         if (string == null || string.length() == 0) {
276             return defaultValue;
277         }
278         String prop = System.getProperty(string);
279         if (prop == null) {
280             return defaultValue;
281         }
282         try {
283             return decode(prop);
284         } catch (NumberFormatException ex) {
285             return defaultValue;
286         }
287     }
288 
289     @Override
hashCode()290     public int hashCode() {
291         return (int) (value ^ (value >>> 32));
292     }
293 
294     @Override
intValue()295     public int intValue() {
296         return (int) value;
297     }
298 
299     /**
300      * Gets the primitive value of this long.
301      *
302      * @return this object's primitive value.
303      */
304     @Override
longValue()305     public long longValue() {
306         return value;
307     }
308 
309     /**
310      * Parses the specified string as a signed decimal long value. The ASCII
311      * characters \u002d ('-') and \u002b ('+') are recognized as the minus and
312      * plus signs.
313      *
314      * @param string
315      *            the string representation of a long value.
316      * @return the primitive long value represented by {@code string}.
317      * @throws NumberFormatException
318      *             if {@code string} cannot be parsed as a long value.
319      */
parseLong(String string)320     public static long parseLong(String string) throws NumberFormatException {
321         return parseLong(string, 10);
322     }
323 
324     /**
325      * Parses the specified string as a signed long value using the specified
326      * radix. The ASCII characters \u002d ('-') and \u002b ('+') are recognized
327      * as the minus and plus signs.
328      *
329      * @param string
330      *            the string representation of a long value.
331      * @param radix
332      *            the radix to use when parsing.
333      * @return the primitive long value represented by {@code string} using
334      *         {@code radix}.
335      * @throws NumberFormatException
336      *             if {@code string} cannot be parsed as a long value, or
337      *             {@code radix < Character.MIN_RADIX ||
338      *             radix > Character.MAX_RADIX}.
339      */
parseLong(String string, int radix)340     public static long parseLong(String string, int radix) throws NumberFormatException {
341         if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
342             throw new NumberFormatException("Invalid radix: " + radix);
343         }
344         if (string == null || string.isEmpty()) {
345             throw invalidLong(string);
346         }
347         char firstChar = string.charAt(0);
348         int firstDigitIndex = (firstChar == '-' || firstChar == '+') ? 1 : 0;
349         if (firstDigitIndex == string.length()) {
350             throw invalidLong(string);
351         }
352 
353         return parse(string, firstDigitIndex, radix, firstChar == '-');
354     }
355 
parse(String string, int offset, int radix, boolean negative)356     private static long parse(String string, int offset, int radix, boolean negative) {
357         long max = Long.MIN_VALUE / radix;
358         long result = 0;
359         int length = string.length();
360         while (offset < length) {
361             int digit = Character.digit(string.charAt(offset++), radix);
362             if (digit == -1) {
363                 throw invalidLong(string);
364             }
365             if (max > result) {
366                 throw invalidLong(string);
367             }
368             long next = result * radix - digit;
369             if (next > result) {
370                 throw invalidLong(string);
371             }
372             result = next;
373         }
374         if (!negative) {
375             result = -result;
376             if (result < 0) {
377                 throw invalidLong(string);
378             }
379         }
380         return result;
381     }
382 
383     /**
384      * Equivalent to {@code parsePositiveLong(string, 10)}.
385      *
386      * @see #parsePositiveLong(String, int)
387      *
388      * @hide
389      */
parsePositiveLong(String string)390     public static long parsePositiveLong(String string) throws NumberFormatException {
391         return parsePositiveLong(string, 10);
392     }
393 
394     /**
395      * Parses the specified string as a positive long value using the
396      * specified radix. 0 is considered a positive long.
397      * <p>
398      * This method behaves the same as {@link #parseLong(String, int)} except
399      * that it disallows leading '+' and '-' characters. See that method for
400      * error conditions.
401      *
402      * @see #parseLong(String, int)
403      *
404      * @hide
405      */
parsePositiveLong(String string, int radix)406     public static long parsePositiveLong(String string, int radix) throws NumberFormatException {
407         if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
408             throw new NumberFormatException("Invalid radix: " + radix);
409         }
410         if (string == null || string.length() == 0) {
411             throw invalidLong(string);
412         }
413         return parse(string, 0, radix, false);
414     }
415 
416     @Override
shortValue()417     public short shortValue() {
418         return (short) value;
419     }
420 
421     /**
422      * Converts the specified long value into its binary string representation.
423      * The returned string is a concatenation of '0' and '1' characters.
424      *
425      * @param v
426      *            the long value to convert.
427      * @return the binary string representation of {@code v}.
428      */
toBinaryString(long v)429     public static String toBinaryString(long v) {
430         return IntegralToString.longToBinaryString(v);
431     }
432 
433     /**
434      * Converts the specified long value into its hexadecimal string
435      * representation. The returned string is a concatenation of characters from
436      * '0' to '9' and 'a' to 'f'.
437      *
438      * @param v
439      *            the long value to convert.
440      * @return the hexadecimal string representation of {@code l}.
441      */
toHexString(long v)442     public static String toHexString(long v) {
443         return IntegralToString.longToHexString(v);
444     }
445 
446     /**
447      * Converts the specified long value into its octal string representation.
448      * The returned string is a concatenation of characters from '0' to '7'.
449      *
450      * @param v
451      *            the long value to convert.
452      * @return the octal string representation of {@code l}.
453      */
toOctalString(long v)454     public static String toOctalString(long v) {
455         return IntegralToString.longToOctalString(v);
456     }
457 
458     @Override
toString()459     public String toString() {
460         return Long.toString(value);
461     }
462 
463     /**
464      * Converts the specified long value into its decimal string representation.
465      * The returned string is a concatenation of a minus sign if the number is
466      * negative and characters from '0' to '9'.
467      *
468      * @param n
469      *            the long to convert.
470      * @return the decimal string representation of {@code l}.
471      */
toString(long n)472     public static String toString(long n) {
473         return IntegralToString.longToString(n);
474     }
475 
476     /**
477      * Converts the specified signed long value into a string representation based on
478      * the specified radix. The returned string is a concatenation of a minus
479      * sign if the number is negative and characters from '0' to '9' and 'a' to
480      * 'z', depending on the radix. If {@code radix} is not in the interval
481      * defined by {@code Character.MIN_RADIX} and {@code Character.MAX_RADIX}
482      * then 10 is used as the base for the conversion.
483      *
484      * <p>This method treats its argument as signed. If you want to convert an
485      * unsigned value to one of the common non-decimal bases, you may find
486      * {@link #toBinaryString}, {@code #toHexString}, or {@link #toOctalString}
487      * more convenient.
488      *
489      * @param v
490      *            the signed long to convert.
491      * @param radix
492      *            the base to use for the conversion.
493      * @return the string representation of {@code v}.
494      */
toString(long v, int radix)495     public static String toString(long v, int radix) {
496         return IntegralToString.longToString(v, radix);
497     }
498 
499     /**
500      * Parses the specified string as a signed decimal long value.
501      *
502      * @param string
503      *            the string representation of a long value.
504      * @return a {@code Long} instance containing the long value represented by
505      *         {@code string}.
506      * @throws NumberFormatException
507      *             if {@code string} cannot be parsed as a long value.
508      * @see #parseLong(String)
509      */
valueOf(String string)510     public static Long valueOf(String string) throws NumberFormatException {
511         return valueOf(parseLong(string));
512     }
513 
514     /**
515      * Parses the specified string as a signed long value using the specified
516      * radix.
517      *
518      * @param string
519      *            the string representation of a long value.
520      * @param radix
521      *            the radix to use when parsing.
522      * @return a {@code Long} instance containing the long value represented by
523      *         {@code string} using {@code radix}.
524      * @throws NumberFormatException
525      *             if {@code string} cannot be parsed as a long value, or
526      *             {@code radix < Character.MIN_RADIX ||
527      *             radix > Character.MAX_RADIX}.
528      * @see #parseLong(String, int)
529      */
valueOf(String string, int radix)530     public static Long valueOf(String string, int radix) throws NumberFormatException {
531         return valueOf(parseLong(string, radix));
532     }
533 
534     /**
535      * Determines the highest (leftmost) bit of the specified long value that is
536      * 1 and returns the bit mask value for that bit. This is also referred to
537      * as the Most Significant 1 Bit. Returns zero if the specified long is
538      * zero.
539      *
540      * @param v
541      *            the long to examine.
542      * @return the bit mask indicating the highest 1 bit in {@code v}.
543      * @since 1.5
544      */
highestOneBit(long v)545     public static long highestOneBit(long v) {
546         // Hacker's Delight, Figure 3-1
547         v |= (v >> 1);
548         v |= (v >> 2);
549         v |= (v >> 4);
550         v |= (v >> 8);
551         v |= (v >> 16);
552         v |= (v >> 32);
553         return v - (v >>> 1);
554     }
555 
556     /**
557      * Determines the lowest (rightmost) bit of the specified long value that is
558      * 1 and returns the bit mask value for that bit. This is also referred to
559      * as the Least Significant 1 Bit. Returns zero if the specified long is
560      * zero.
561      *
562      * @param v
563      *            the long to examine.
564      * @return the bit mask indicating the lowest 1 bit in {@code v}.
565      * @since 1.5
566      */
lowestOneBit(long v)567     public static long lowestOneBit(long v) {
568         return v & -v;
569     }
570 
571     /**
572      * Determines the number of leading zeros in the specified long value prior
573      * to the {@link #highestOneBit(long) highest one bit}.
574      *
575      * @param v
576      *            the long to examine.
577      * @return the number of leading zeros in {@code v}.
578      * @since 1.5
579      */
numberOfLeadingZeros(long v)580     public static int numberOfLeadingZeros(long v) {
581         // After Hacker's Delight, Figure 5-6
582         if (v < 0) {
583             return 0;
584         }
585         if (v == 0) {
586             return 64;
587         }
588         // On a 64-bit VM, the two previous tests should probably be replaced by
589         // if (v <= 0) return ((int) (~v >> 57)) & 64;
590 
591         int n = 1;
592         int i = (int) (v >>> 32);
593         if (i == 0) {
594             n +=  32;
595             i = (int) v;
596         }
597         if (i >>> 16 == 0) {
598             n +=  16;
599             i <<= 16;
600         }
601         if (i >>> 24 == 0) {
602             n +=  8;
603             i <<= 8;
604         }
605         if (i >>> 28 == 0) {
606             n +=  4;
607             i <<= 4;
608         }
609         if (i >>> 30 == 0) {
610             n +=  2;
611             i <<= 2;
612         }
613         return n - (i >>> 31);
614     }
615 
616     /**
617      * Determines the number of trailing zeros in the specified long value after
618      * the {@link #lowestOneBit(long) lowest one bit}.
619      *
620      * @param v
621      *            the long to examine.
622      * @return the number of trailing zeros in {@code v}.
623      * @since 1.5
624      */
numberOfTrailingZeros(long v)625     public static int numberOfTrailingZeros(long v) {
626         int low = (int) v;
627         return low !=0 ? Integer.numberOfTrailingZeros(low)
628                        : 32 + Integer.numberOfTrailingZeros((int) (v >>> 32));
629     }
630 
631     /**
632      * Counts the number of 1 bits in the specified long value; this is also
633      * referred to as population count.
634      *
635      * @param v
636      *            the long to examine.
637      * @return the number of 1 bits in {@code v}.
638      * @since 1.5
639      */
bitCount(long v)640     public static int bitCount(long v) {
641         // Combines techniques from several sources
642         v -=  (v >>> 1) & 0x5555555555555555L;
643         v = (v & 0x3333333333333333L) + ((v >>> 2) & 0x3333333333333333L);
644         int i =  ((int)(v >>> 32)) + (int) v;
645         i = (i & 0x0F0F0F0F) + ((i >>> 4) & 0x0F0F0F0F);
646         i += i >>> 8;
647         i += i >>> 16;
648         return i  & 0x0000007F;
649     }
650 
651     /*
652      * On a modern 64-bit processor with a fast hardware multiply, this is
653      * much faster (assuming you're running a 64-bit VM):
654      *
655      * // http://chessprogramming.wikispaces.com/Population+Count
656      * int bitCount (long x) {
657      *     x -=  (x >>> 1) & 0x5555555555555555L;
658      *     x = (x & 0x3333333333333333L) + ((x >>> 2) & 0x3333333333333333L);
659      *     x = (x + (x >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
660      *     x = (x * 0x0101010101010101L) >>> 56;
661      *     return (int) x;
662      * }
663      *
664      * Really modern processors (e.g., Nehalem, K-10) have hardware popcount
665      * instructions.
666      */
667 
668     /**
669      * Rotates the bits of the specified long value to the left by the specified
670      * number of bits.
671      *
672      * @param v
673      *            the long value to rotate left.
674      * @param distance
675      *            the number of bits to rotate.
676      * @return the rotated value.
677      * @since 1.5
678      */
rotateLeft(long v, int distance)679     public static long rotateLeft(long v, int distance) {
680         // Shift distances are mod 64 (JLS3 15.19), so we needn't mask -distance
681         return (v << distance) | (v >>> -distance);
682     }
683 
684     /**
685      * Rotates the bits of the specified long value to the right by the
686      * specified number of bits.
687      *
688      * @param v
689      *            the long value to rotate right.
690      * @param distance
691      *            the number of bits to rotate.
692      * @return the rotated value.
693      * @since 1.5
694      */
rotateRight(long v, int distance)695     public static long rotateRight(long v, int distance) {
696         // Shift distances are mod 64 (JLS3 15.19), so we needn't mask -distance
697         return (v >>> distance) | (v << -distance);
698     }
699 
700     /**
701      * Reverses the order of the bytes of the specified long value.
702      *
703      * @param v
704      *            the long value for which to reverse the byte order.
705      * @return the reversed value.
706      * @since 1.5
707      */
reverseBytes(long v)708     public static long reverseBytes(long v) {
709         // Hacker's Delight 7-1, with minor tweak from Veldmeijer
710         // http://graphics.stanford.edu/~seander/bithacks.html
711         v = ((v >>> 8) & 0x00FF00FF00FF00FFL) | ((v & 0x00FF00FF00FF00FFL) << 8);
712         v = ((v >>>16) & 0x0000FFFF0000FFFFL) | ((v & 0x0000FFFF0000FFFFL) <<16);
713         return ((v >>>32)                   ) | ((v                      ) <<32);
714     }
715 
716     /**
717      * Reverses the order of the bits of the specified long value.
718      *
719      * @param v
720      *            the long value for which to reverse the bit order.
721      * @return the reversed value.
722      * @since 1.5
723      */
reverse(long v)724     public static long reverse(long v) {
725         // Hacker's Delight 7-1, with minor tweak from Veldmeijer
726         // http://graphics.stanford.edu/~seander/bithacks.html
727         v = ((v >>> 1) & 0x5555555555555555L) | ((v & 0x5555555555555555L) << 1);
728         v = ((v >>> 2) & 0x3333333333333333L) | ((v & 0x3333333333333333L) << 2);
729         v = ((v >>> 4) & 0x0F0F0F0F0F0F0F0FL) | ((v & 0x0F0F0F0F0F0F0F0FL) << 4);
730         v = ((v >>> 8) & 0x00FF00FF00FF00FFL) | ((v & 0x00FF00FF00FF00FFL) << 8);
731         v = ((v >>>16) & 0x0000FFFF0000FFFFL) | ((v & 0x0000FFFF0000FFFFL) <<16);
732         return ((v >>>32)                   ) | ((v                      ) <<32);
733     }
734 
735     /**
736      * Returns the value of the {@code signum} function for the specified long
737      * value.
738      *
739      * @param v
740      *            the long value to check.
741      * @return -1 if {@code v} is negative, 1 if {@code v} is positive, 0 if
742      *         {@code v} is zero.
743      * @since 1.5
744      */
signum(long v)745     public static int signum(long v) {
746         return v < 0 ? -1 : (v == 0 ? 0 : 1);
747     }
748 
749     /**
750      * Returns a {@code Long} instance for the specified long value.
751      * <p>
752      * If it is not necessary to get a new {@code Long} instance, it is
753      * recommended to use this method instead of the constructor, since it
754      * maintains a cache of instances which may result in better performance.
755      *
756      * @param v
757      *            the long value to store in the instance.
758      * @return a {@code Long} instance containing {@code v}.
759      * @since 1.5
760      */
valueOf(long v)761     public static Long valueOf(long v) {
762         return  v >= 128 || v < -128 ? new Long(v) : SMALL_VALUES[((int) v) + 128];
763     }
764 
765     /**
766      * A cache of instances used by {@link Long#valueOf(long)} and auto-boxing.
767      */
768     private static final Long[] SMALL_VALUES = new Long[256];
769 
770     static {
771         for (int i = -128; i < 128; i++) {
772             SMALL_VALUES[i + 128] = new Long(i);
773         }
774     }
775 }
776