沉淀再出发:java中的equals()辨析

沉淀再出发:java中的equals()辨析

一、前言

    关于java中的equals,我们可能非常奇怪,在Object中定义了这个函数,其他的很多类中都重载了它,导致了我们对于辨析其中的内涵有了混淆,再加上和“==”的比较,就显得更加的复杂了。

二、java中的equals()

 2.1、Object.java中的equals()

    让我们来看一下Object.java中的equals()。

    首先是Object的定义:

  1 /*
  2  * Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights reserved.
  3  * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  4  *
  5  *
  6  *
  7  *
  8  *
  9  *
 10  *
 11  *
 12  *
 13  *
 14  *
 15  *
 16  *
 17  *
 18  *
 19  *
 20  *
 21  *
 22  *
 23  *
 24  */
 25 
 26 package java.lang;
 27 
 28 /**
 29  * Class {@code Object} is the root of the class hierarchy.
 30  * Every class has {@code Object} as a superclass. All objects,
 31  * including arrays, implement the methods of this class.
 32  *
 33  * @author  unascribed
 34  * @see     java.lang.Class
 35  * @since   JDK1.0
 36  */
 37 public class Object {
 38 
 39     private static native void registerNatives();
 40     static {
 41         registerNatives();
 42     }
 43 
 44     /**
 45      * Returns the runtime class of this {@code Object}. The returned
 46      * {@code Class} object is the object that is locked by {@code
 47      * static synchronized} methods of the represented class.
 48      *
 49      * <p><b>The actual result type is {@code Class<? extends |X|>}
 50      * where {@code |X|} is the erasure of the static type of the
 51      * expression on which {@code getClass} is called.</b> For
 52      * example, no cast is required in this code fragment:</p>
 53      *
 54      * <p>
 55      * {@code Number n = 0;                             }<br>
 56      * {@code Class<? extends Number> c = n.getClass(); }
 57      * </p>
 58      *
 59      * @return The {@code Class} object that represents the runtime
 60      *         class of this object.
 61      * @jls 15.8.2 Class Literals
 62      */
 63     public final native Class<?> getClass();
 64 
 65     /**
 66      * Returns a hash code value for the object. This method is
 67      * supported for the benefit of hash tables such as those provided by
 68      * {@link java.util.HashMap}.
 69      * <p>
 70      * The general contract of {@code hashCode} is:
 71      * <ul>
 72      * <li>Whenever it is invoked on the same object more than once during
 73      *     an execution of a Java application, the {@code hashCode} method
 74      *     must consistently return the same integer, provided no information
 75      *     used in {@code equals} comparisons on the object is modified.
 76      *     This integer need not remain consistent from one execution of an
 77      *     application to another execution of the same application.
 78      * <li>If two objects are equal according to the {@code equals(Object)}
 79      *     method, then calling the {@code hashCode} method on each of
 80      *     the two objects must produce the same integer result.
 81      * <li>It is <em>not</em> required that if two objects are unequal
 82      *     according to the {@link java.lang.Object#equals(java.lang.Object)}
 83      *     method, then calling the {@code hashCode} method on each of the
 84      *     two objects must produce distinct integer results.  However, the
 85      *     programmer should be aware that producing distinct integer results
 86      *     for unequal objects may improve the performance of hash tables.
 87      * </ul>
 88      * <p>
 89      * As much as is reasonably practical, the hashCode method defined by
 90      * class {@code Object} does return distinct integers for distinct
 91      * objects. (This is typically implemented by converting the internal
 92      * address of the object into an integer, but this implementation
 93      * technique is not required by the
 94      * Java&trade; programming language.)
 95      *
 96      * @return  a hash code value for this object.
 97      * @see     java.lang.Object#equals(java.lang.Object)
 98      * @see     java.lang.System#identityHashCode
 99      */
100     public native int hashCode();
101 
102     /**
103      * Indicates whether some other object is "equal to" this one.
104      * <p>
105      * The {@code equals} method implements an equivalence relation
106      * on non-null object references:
107      * <ul>
108      * <li>It is <i>reflexive</i>: for any non-null reference value
109      *     {@code x}, {@code x.equals(x)} should return
110      *     {@code true}.
111      * <li>It is <i>symmetric</i>: for any non-null reference values
112      *     {@code x} and {@code y}, {@code x.equals(y)}
113      *     should return {@code true} if and only if
114      *     {@code y.equals(x)} returns {@code true}.
115      * <li>It is <i>transitive</i>: for any non-null reference values
116      *     {@code x}, {@code y}, and {@code z}, if
117      *     {@code x.equals(y)} returns {@code true} and
118      *     {@code y.equals(z)} returns {@code true}, then
119      *     {@code x.equals(z)} should return {@code true}.
120      * <li>It is <i>consistent</i>: for any non-null reference values
121      *     {@code x} and {@code y}, multiple invocations of
122      *     {@code x.equals(y)} consistently return {@code true}
123      *     or consistently return {@code false}, provided no
124      *     information used in {@code equals} comparisons on the
125      *     objects is modified.
126      * <li>For any non-null reference value {@code x},
127      *     {@code x.equals(null)} should return {@code false}.
128      * </ul>
129      * <p>
130      * The {@code equals} method for class {@code Object} implements
131      * the most discriminating possible equivalence relation on objects;
132      * that is, for any non-null reference values {@code x} and
133      * {@code y}, this method returns {@code true} if and only
134      * if {@code x} and {@code y} refer to the same object
135      * ({@code x == y} has the value {@code true}).
136      * <p>
137      * Note that it is generally necessary to override the {@code hashCode}
138      * method whenever this method is overridden, so as to maintain the
139      * general contract for the {@code hashCode} method, which states
140      * that equal objects must have equal hash codes.
141      *
142      * @param   obj   the reference object with which to compare.
143      * @return  {@code true} if this object is the same as the obj
144      *          argument; {@code false} otherwise.
145      * @see     #hashCode()
146      * @see     java.util.HashMap
147      */
148     public boolean equals(Object obj) {
149         return (this == obj);
150     }
151 
152     /**
153      * Creates and returns a copy of this object.  The precise meaning
154      * of "copy" may depend on the class of the object. The general
155      * intent is that, for any object {@code x}, the expression:
156      * <blockquote>
157      * <pre>
158      * x.clone() != x</pre></blockquote>
159      * will be true, and that the expression:
160      * <blockquote>
161      * <pre>
162      * x.clone().getClass() == x.getClass()</pre></blockquote>
163      * will be {@code true}, but these are not absolute requirements.
164      * While it is typically the case that:
165      * <blockquote>
166      * <pre>
167      * x.clone().equals(x)</pre></blockquote>
168      * will be {@code true}, this is not an absolute requirement.
169      * <p>
170      * By convention, the returned object should be obtained by calling
171      * {@code super.clone}.  If a class and all of its superclasses (except
172      * {@code Object}) obey this convention, it will be the case that
173      * {@code x.clone().getClass() == x.getClass()}.
174      * <p>
175      * By convention, the object returned by this method should be independent
176      * of this object (which is being cloned).  To achieve this independence,
177      * it may be necessary to modify one or more fields of the object returned
178      * by {@code super.clone} before returning it.  Typically, this means
179      * copying any mutable objects that comprise the internal "deep structure"
180      * of the object being cloned and replacing the references to these
181      * objects with references to the copies.  If a class contains only
182      * primitive fields or references to immutable objects, then it is usually
183      * the case that no fields in the object returned by {@code super.clone}
184      * need to be modified.
185      * <p>
186      * The method {@code clone} for class {@code Object} performs a
187      * specific cloning operation. First, if the class of this object does
188      * not implement the interface {@code Cloneable}, then a
189      * {@code CloneNotSupportedException} is thrown. Note that all arrays
190      * are considered to implement the interface {@code Cloneable} and that
191      * the return type of the {@code clone} method of an array type {@code T[]}
192      * is {@code T[]} where T is any reference or primitive type.
193      * Otherwise, this method creates a new instance of the class of this
194      * object and initializes all its fields with exactly the contents of
195      * the corresponding fields of this object, as if by assignment; the
196      * contents of the fields are not themselves cloned. Thus, this method
197      * performs a "shallow copy" of this object, not a "deep copy" operation.
198      * <p>
199      * The class {@code Object} does not itself implement the interface
200      * {@code Cloneable}, so calling the {@code clone} method on an object
201      * whose class is {@code Object} will result in throwing an
202      * exception at run time.
203      *
204      * @return     a clone of this instance.
205      * @throws  CloneNotSupportedException  if the object's class does not
206      *               support the {@code Cloneable} interface. Subclasses
207      *               that override the {@code clone} method can also
208      *               throw this exception to indicate that an instance cannot
209      *               be cloned.
210      * @see java.lang.Cloneable
211      */
212     protected native Object clone() throws CloneNotSupportedException;
213 
214     /**
215      * Returns a string representation of the object. In general, the
216      * {@code toString} method returns a string that
217      * "textually represents" this object. The result should
218      * be a concise but informative representation that is easy for a
219      * person to read.
220      * It is recommended that all subclasses override this method.
221      * <p>
222      * The {@code toString} method for class {@code Object}
223      * returns a string consisting of the name of the class of which the
224      * object is an instance, the at-sign character `{@code @}', and
225      * the unsigned hexadecimal representation of the hash code of the
226      * object. In other words, this method returns a string equal to the
227      * value of:
228      * <blockquote>
229      * <pre>
230      * getClass().getName() + '@' + Integer.toHexString(hashCode())
231      * </pre></blockquote>
232      *
233      * @return  a string representation of the object.
234      */
235     public String toString() {
236         return getClass().getName() + "@" + Integer.toHexString(hashCode());
237     }
238 
239     /**
240      * Wakes up a single thread that is waiting on this object's
241      * monitor. If any threads are waiting on this object, one of them
242      * is chosen to be awakened. The choice is arbitrary and occurs at
243      * the discretion of the implementation. A thread waits on an object's
244      * monitor by calling one of the {@code wait} methods.
245      * <p>
246      * The awakened thread will not be able to proceed until the current
247      * thread relinquishes the lock on this object. The awakened thread will
248      * compete in the usual manner with any other threads that might be
249      * actively competing to synchronize on this object; for example, the
250      * awakened thread enjoys no reliable privilege or disadvantage in being
251      * the next thread to lock this object.
252      * <p>
253      * This method should only be called by a thread that is the owner
254      * of this object's monitor. A thread becomes the owner of the
255      * object's monitor in one of three ways:
256      * <ul>
257      * <li>By executing a synchronized instance method of that object.
258      * <li>By executing the body of a {@code synchronized} statement
259      *     that synchronizes on the object.
260      * <li>For objects of type {@code Class,} by executing a
261      *     synchronized static method of that class.
262      * </ul>
263      * <p>
264      * Only one thread at a time can own an object's monitor.
265      *
266      * @throws  IllegalMonitorStateException  if the current thread is not
267      *               the owner of this object's monitor.
268      * @see        java.lang.Object#notifyAll()
269      * @see        java.lang.Object#wait()
270      */
271     public final native void notify();
272 
273     /**
274      * Wakes up all threads that are waiting on this object's monitor. A
275      * thread waits on an object's monitor by calling one of the
276      * {@code wait} methods.
277      * <p>
278      * The awakened threads will not be able to proceed until the current
279      * thread relinquishes the lock on this object. The awakened threads
280      * will compete in the usual manner with any other threads that might
281      * be actively competing to synchronize on this object; for example,
282      * the awakened threads enjoy no reliable privilege or disadvantage in
283      * being the next thread to lock this object.
284      * <p>
285      * This method should only be called by a thread that is the owner
286      * of this object's monitor. See the {@code notify} method for a
287      * description of the ways in which a thread can become the owner of
288      * a monitor.
289      *
290      * @throws  IllegalMonitorStateException  if the current thread is not
291      *               the owner of this object's monitor.
292      * @see        java.lang.Object#notify()
293      * @see        java.lang.Object#wait()
294      */
295     public final native void notifyAll();
296 
297     /**
298      * Causes the current thread to wait until either another thread invokes the
299      * {@link java.lang.Object#notify()} method or the
300      * {@link java.lang.Object#notifyAll()} method for this object, or a
301      * specified amount of time has elapsed.
302      * <p>
303      * The current thread must own this object's monitor.
304      * <p>
305      * This method causes the current thread (call it <var>T</var>) to
306      * place itself in the wait set for this object and then to relinquish
307      * any and all synchronization claims on this object. Thread <var>T</var>
308      * becomes disabled for thread scheduling purposes and lies dormant
309      * until one of four things happens:
310      * <ul>
311      * <li>Some other thread invokes the {@code notify} method for this
312      * object and thread <var>T</var> happens to be arbitrarily chosen as
313      * the thread to be awakened.
314      * <li>Some other thread invokes the {@code notifyAll} method for this
315      * object.
316      * <li>Some other thread {@linkplain Thread#interrupt() interrupts}
317      * thread <var>T</var>.
318      * <li>The specified amount of real time has elapsed, more or less.  If
319      * {@code timeout} is zero, however, then real time is not taken into
320      * consideration and the thread simply waits until notified.
321      * </ul>
322      * The thread <var>T</var> is then removed from the wait set for this
323      * object and re-enabled for thread scheduling. It then competes in the
324      * usual manner with other threads for the right to synchronize on the
325      * object; once it has gained control of the object, all its
326      * synchronization claims on the object are restored to the status quo
327      * ante - that is, to the situation as of the time that the {@code wait}
328      * method was invoked. Thread <var>T</var> then returns from the
329      * invocation of the {@code wait} method. Thus, on return from the
330      * {@code wait} method, the synchronization state of the object and of
331      * thread {@code T} is exactly as it was when the {@code wait} method
332      * was invoked.
333      * <p>
334      * A thread can also wake up without being notified, interrupted, or
335      * timing out, a so-called <i>spurious wakeup</i>.  While this will rarely
336      * occur in practice, applications must guard against it by testing for
337      * the condition that should have caused the thread to be awakened, and
338      * continuing to wait if the condition is not satisfied.  In other words,
339      * waits should always occur in loops, like this one:
340      * <pre>
341      *     synchronized (obj) {
342      *         while (&lt;condition does not hold&gt;)
343      *             obj.wait(timeout);
344      *         ... // Perform action appropriate to condition
345      *     }
346      * </pre>
347      * (For more information on this topic, see Section 3.2.3 in Doug Lea's
348      * "Concurrent Programming in Java (Second Edition)" (Addison-Wesley,
349      * 2000), or Item 50 in Joshua Bloch's "Effective Java Programming
350      * Language Guide" (Addison-Wesley, 2001).
351      *
352      * <p>If the current thread is {@linkplain java.lang.Thread#interrupt()
353      * interrupted} by any thread before or while it is waiting, then an
354      * {@code InterruptedException} is thrown.  This exception is not
355      * thrown until the lock status of this object has been restored as
356      * described above.
357      *
358      * <p>
359      * Note that the {@code wait} method, as it places the current thread
360      * into the wait set for this object, unlocks only this object; any
361      * other objects on which the current thread may be synchronized remain
362      * locked while the thread waits.
363      * <p>
364      * This method should only be called by a thread that is the owner
365      * of this object's monitor. See the {@code notify} method for a
366      * description of the ways in which a thread can become the owner of
367      * a monitor.
368      *
369      * @param      timeout   the maximum time to wait in milliseconds.
370      * @throws  IllegalArgumentException      if the value of timeout is
371      *               negative.
372      * @throws  IllegalMonitorStateException  if the current thread is not
373      *               the owner of the object's monitor.
374      * @throws  InterruptedException if any thread interrupted the
375      *             current thread before or while the current thread
376      *             was waiting for a notification.  The <i>interrupted
377      *             status</i> of the current thread is cleared when
378      *             this exception is thrown.
379      * @see        java.lang.Object#notify()
380      * @see        java.lang.Object#notifyAll()
381      */
382     public final native void wait(long timeout) throws InterruptedException;
383 
384     /**
385      * Causes the current thread to wait until another thread invokes the
386      * {@link java.lang.Object#notify()} method or the
387      * {@link java.lang.Object#notifyAll()} method for this object, or
388      * some other thread interrupts the current thread, or a certain
389      * amount of real time has elapsed.
390      * <p>
391      * This method is similar to the {@code wait} method of one
392      * argument, but it allows finer control over the amount of time to
393      * wait for a notification before giving up. The amount of real time,
394      * measured in nanoseconds, is given by:
395      * <blockquote>
396      * <pre>
397      * 1000000*timeout+nanos</pre></blockquote>
398      * <p>
399      * In all other respects, this method does the same thing as the
400      * method {@link #wait(long)} of one argument. In particular,
401      * {@code wait(0, 0)} means the same thing as {@code wait(0)}.
402      * <p>
403      * The current thread must own this object's monitor. The thread
404      * releases ownership of this monitor and waits until either of the
405      * following two conditions has occurred:
406      * <ul>
407      * <li>Another thread notifies threads waiting on this object's monitor
408      *     to wake up either through a call to the {@code notify} method
409      *     or the {@code notifyAll} method.
410      * <li>The timeout period, specified by {@code timeout}
411      *     milliseconds plus {@code nanos} nanoseconds arguments, has
412      *     elapsed.
413      * </ul>
414      * <p>
415      * The thread then waits until it can re-obtain ownership of the
416      * monitor and resumes execution.
417      * <p>
418      * As in the one argument version, interrupts and spurious wakeups are
419      * possible, and this method should always be used in a loop:
420      * <pre>
421      *     synchronized (obj) {
422      *         while (&lt;condition does not hold&gt;)
423      *             obj.wait(timeout, nanos);
424      *         ... // Perform action appropriate to condition
425      *     }
426      * </pre>
427      * This method should only be called by a thread that is the owner
428      * of this object's monitor. See the {@code notify} method for a
429      * description of the ways in which a thread can become the owner of
430      * a monitor.
431      *
432      * @param      timeout   the maximum time to wait in milliseconds.
433      * @param      nanos      additional time, in nanoseconds range
434      *                       0-999999.
435      * @throws  IllegalArgumentException      if the value of timeout is
436      *                      negative or the value of nanos is
437      *                      not in the range 0-999999.
438      * @throws  IllegalMonitorStateException  if the current thread is not
439      *               the owner of this object's monitor.
440      * @throws  InterruptedException if any thread interrupted the
441      *             current thread before or while the current thread
442      *             was waiting for a notification.  The <i>interrupted
443      *             status</i> of the current thread is cleared when
444      *             this exception is thrown.
445      */
446     public final void wait(long timeout, int nanos) throws InterruptedException {
447         if (timeout < 0) {
448             throw new IllegalArgumentException("timeout value is negative");
449         }
450 
451         if (nanos < 0 || nanos > 999999) {
452             throw new IllegalArgumentException(
453                                 "nanosecond timeout value out of range");
454         }
455 
456         if (nanos > 0) {
457             timeout++;
458         }
459 
460         wait(timeout);
461     }
462 
463     /**
464      * Causes the current thread to wait until another thread invokes the
465      * {@link java.lang.Object#notify()} method or the
466      * {@link java.lang.Object#notifyAll()} method for this object.
467      * In other words, this method behaves exactly as if it simply
468      * performs the call {@code wait(0)}.
469      * <p>
470      * The current thread must own this object's monitor. The thread
471      * releases ownership of this monitor and waits until another thread
472      * notifies threads waiting on this object's monitor to wake up
473      * either through a call to the {@code notify} method or the
474      * {@code notifyAll} method. The thread then waits until it can
475      * re-obtain ownership of the monitor and resumes execution.
476      * <p>
477      * As in the one argument version, interrupts and spurious wakeups are
478      * possible, and this method should always be used in a loop:
479      * <pre>
480      *     synchronized (obj) {
481      *         while (&lt;condition does not hold&gt;)
482      *             obj.wait();
483      *         ... // Perform action appropriate to condition
484      *     }
485      * </pre>
486      * This method should only be called by a thread that is the owner
487      * of this object's monitor. See the {@code notify} method for a
488      * description of the ways in which a thread can become the owner of
489      * a monitor.
490      *
491      * @throws  IllegalMonitorStateException  if the current thread is not
492      *               the owner of the object's monitor.
493      * @throws  InterruptedException if any thread interrupted the
494      *             current thread before or while the current thread
495      *             was waiting for a notification.  The <i>interrupted
496      *             status</i> of the current thread is cleared when
497      *             this exception is thrown.
498      * @see        java.lang.Object#notify()
499      * @see        java.lang.Object#notifyAll()
500      */
501     public final void wait() throws InterruptedException {
502         wait(0);
503     }
504 
505     /**
506      * Called by the garbage collector on an object when garbage collection
507      * determines that there are no more references to the object.
508      * A subclass overrides the {@code finalize} method to dispose of
509      * system resources or to perform other cleanup.
510      * <p>
511      * The general contract of {@code finalize} is that it is invoked
512      * if and when the Java&trade; virtual
513      * machine has determined that there is no longer any
514      * means by which this object can be accessed by any thread that has
515      * not yet died, except as a result of an action taken by the
516      * finalization of some other object or class which is ready to be
517      * finalized. The {@code finalize} method may take any action, including
518      * making this object available again to other threads; the usual purpose
519      * of {@code finalize}, however, is to perform cleanup actions before
520      * the object is irrevocably discarded. For example, the finalize method
521      * for an object that represents an input/output connection might perform
522      * explicit I/O transactions to break the connection before the object is
523      * permanently discarded.
524      * <p>
525      * The {@code finalize} method of class {@code Object} performs no
526      * special action; it simply returns normally. Subclasses of
527      * {@code Object} may override this definition.
528      * <p>
529      * The Java programming language does not guarantee which thread will
530      * invoke the {@code finalize} method for any given object. It is
531      * guaranteed, however, that the thread that invokes finalize will not
532      * be holding any user-visible synchronization locks when finalize is
533      * invoked. If an uncaught exception is thrown by the finalize method,
534      * the exception is ignored and finalization of that object terminates.
535      * <p>
536      * After the {@code finalize} method has been invoked for an object, no
537      * further action is taken until the Java virtual machine has again
538      * determined that there is no longer any means by which this object can
539      * be accessed by any thread that has not yet died, including possible
540      * actions by other objects or classes which are ready to be finalized,
541      * at which point the object may be discarded.
542      * <p>
543      * The {@code finalize} method is never invoked more than once by a Java
544      * virtual machine for any given object.
545      * <p>
546      * Any exception thrown by the {@code finalize} method causes
547      * the finalization of this object to be halted, but is otherwise
548      * ignored.
549      *
550      * @throws Throwable the {@code Exception} raised by this method
551      * @see java.lang.ref.WeakReference
552      * @see java.lang.ref.PhantomReference
553      * @jls 12.6 Finalization of Class Instances
554      */
555     protected void finalize() throws Throwable { }
556 }
Object的定义

    其次我们看看其中的函数:

    这就是Object中的equals,非常的简单,完全就是比较两个对象的引用是不是同一个内存空间。因此如果直接使用这个equals来比较,使用new创建的对象就不相等了。

1     public boolean equals(Object obj) {
2         return (this == obj);
3     }

    比如我们测试:

 1 package com.consumer.test;
 2 
 3 public class EqualTest {
 4     public static void main(String[] args) {
 5         MyTest m1=new MyTest();
 6         MyTest m2=new MyTest();
 7         System.out.println(m1==m2);
 8         System.out.println(m1.equals(m2));
 9     }
10 
11 }
12 class MyTest{
13     public MyTest(){
14         output();
15     }
16     private void output(){
17         System.out.println("创建对象成功!");
18     }
19 }

 2.2、String中的equals()

   String的定义:

   1 /*
   2  * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
   4  *
   5  *
   6  *
   7  *
   8  *
   9  *
  10  *
  11  *
  12  *
  13  *
  14  *
  15  *
  16  *
  17  *
  18  *
  19  *
  20  *
  21  *
  22  *
  23  *
  24  */
  25 
  26 package java.lang;
  27 
  28 import java.io.ObjectStreamField;
  29 import java.io.UnsupportedEncodingException;
  30 import java.nio.charset.Charset;
  31 import java.util.ArrayList;
  32 import java.util.Arrays;
  33 import java.util.Comparator;
  34 import java.util.Formatter;
  35 import java.util.Locale;
  36 import java.util.Objects;
  37 import java.util.StringJoiner;
  38 import java.util.regex.Matcher;
  39 import java.util.regex.Pattern;
  40 import java.util.regex.PatternSyntaxException;
  41 
  42 /**
  43  * The {@code String} class represents character strings. All
  44  * string literals in Java programs, such as {@code "abc"}, are
  45  * implemented as instances of this class.
  46  * <p>
  47  * Strings are constant; their values cannot be changed after they
  48  * are created. String buffers support mutable strings.
  49  * Because String objects are immutable they can be shared. For example:
  50  * <blockquote><pre>
  51  *     String str = "abc";
  52  * </pre></blockquote><p>
  53  * is equivalent to:
  54  * <blockquote><pre>
  55  *     char data[] = {'a', 'b', 'c'};
  56  *     String str = new String(data);
  57  * </pre></blockquote><p>
  58  * Here are some more examples of how strings can be used:
  59  * <blockquote><pre>
  60  *     System.out.println("abc");
  61  *     String cde = "cde";
  62  *     System.out.println("abc" + cde);
  63  *     String c = "abc".substring(2,3);
  64  *     String d = cde.substring(1, 2);
  65  * </pre></blockquote>
  66  * <p>
  67  * The class {@code String} includes methods for examining
  68  * individual characters of the sequence, for comparing strings, for
  69  * searching strings, for extracting substrings, and for creating a
  70  * copy of a string with all characters translated to uppercase or to
  71  * lowercase. Case mapping is based on the Unicode Standard version
  72  * specified by the {@link java.lang.Character Character} class.
  73  * <p>
  74  * The Java language provides special support for the string
  75  * concatenation operator (&nbsp;+&nbsp;), and for conversion of
  76  * other objects to strings. String concatenation is implemented
  77  * through the {@code StringBuilder}(or {@code StringBuffer})
  78  * class and its {@code append} method.
  79  * String conversions are implemented through the method
  80  * {@code toString}, defined by {@code Object} and
  81  * inherited by all classes in Java. For additional information on
  82  * string concatenation and conversion, see Gosling, Joy, and Steele,
  83  * <i>The Java Language Specification</i>.
  84  *
  85  * <p> Unless otherwise noted, passing a <tt>null</tt> argument to a constructor
  86  * or method in this class will cause a {@link NullPointerException} to be
  87  * thrown.
  88  *
  89  * <p>A {@code String} represents a string in the UTF-16 format
  90  * in which <em>supplementary characters</em> are represented by <em>surrogate
  91  * pairs</em> (see the section <a href="Character.html#unicode">Unicode
  92  * Character Representations</a> in the {@code Character} class for
  93  * more information).
  94  * Index values refer to {@code char} code units, so a supplementary
  95  * character uses two positions in a {@code String}.
  96  * <p>The {@code String} class provides methods for dealing with
  97  * Unicode code points (i.e., characters), in addition to those for
  98  * dealing with Unicode code units (i.e., {@code char} values).
  99  *
 100  * @author  Lee Boynton
 101  * @author  Arthur van Hoff
 102  * @author  Martin Buchholz
 103  * @author  Ulf Zibis
 104  * @see     java.lang.Object#toString()
 105  * @see     java.lang.StringBuffer
 106  * @see     java.lang.StringBuilder
 107  * @see     java.nio.charset.Charset
 108  * @since   JDK1.0
 109  */
 110 
 111 public final class String
 112     implements java.io.Serializable, Comparable<String>, CharSequence {
 113     /** The value is used for character storage. */
 114     private final char value[];
 115 
 116     /** Cache the hash code for the string */
 117     private int hash; // Default to 0
 118 
 119     /** use serialVersionUID from JDK 1.0.2 for interoperability */
 120     private static final long serialVersionUID = -6849794470754667710L;
 121 
 122     /**
 123      * Class String is special cased within the Serialization Stream Protocol.
 124      *
 125      * A String instance is written into an ObjectOutputStream according to
 126      * <a href="{@docRoot}/../platform/serialization/spec/output.html">
 127      * Object Serialization Specification, Section 6.2, "Stream Elements"</a>
 128      */
 129     private static final ObjectStreamField[] serialPersistentFields =
 130         new ObjectStreamField[0];
 131 
 132     /**
 133      * Initializes a newly created {@code String} object so that it represents
 134      * an empty character sequence.  Note that use of this constructor is
 135      * unnecessary since Strings are immutable.
 136      */
 137     public String() {
 138         this.value = "".value;
 139     }
 140 
 141     /**
 142      * Initializes a newly created {@code String} object so that it represents
 143      * the same sequence of characters as the argument; in other words, the
 144      * newly created string is a copy of the argument string. Unless an
 145      * explicit copy of {@code original} is needed, use of this constructor is
 146      * unnecessary since Strings are immutable.
 147      *
 148      * @param  original
 149      *         A {@code String}
 150      */
 151     public String(String original) {
 152         this.value = original.value;
 153         this.hash = original.hash;
 154     }
 155 
 156     /**
 157      * Allocates a new {@code String} so that it represents the sequence of
 158      * characters currently contained in the character array argument. The
 159      * contents of the character array are copied; subsequent modification of
 160      * the character array does not affect the newly created string.
 161      *
 162      * @param  value
 163      *         The initial value of the string
 164      */
 165     public String(char value[]) {
 166         this.value = Arrays.copyOf(value, value.length);
 167     }
 168 
 169     /**
 170      * Allocates a new {@code String} that contains characters from a subarray
 171      * of the character array argument. The {@code offset} argument is the
 172      * index of the first character of the subarray and the {@code count}
 173      * argument specifies the length of the subarray. The contents of the
 174      * subarray are copied; subsequent modification of the character array does
 175      * not affect the newly created string.
 176      *
 177      * @param  value
 178      *         Array that is the source of characters
 179      *
 180      * @param  offset
 181      *         The initial offset
 182      *
 183      * @param  count
 184      *         The length
 185      *
 186      * @throws  IndexOutOfBoundsException
 187      *          If the {@code offset} and {@code count} arguments index
 188      *          characters outside the bounds of the {@code value} array
 189      */
 190     public String(char value[], int offset, int count) {
 191         if (offset < 0) {
 192             throw new StringIndexOutOfBoundsException(offset);
 193         }
 194         if (count <= 0) {
 195             if (count < 0) {
 196                 throw new StringIndexOutOfBoundsException(count);
 197             }
 198             if (offset <= value.length) {
 199                 this.value = "".value;
 200                 return;
 201             }
 202         }
 203         // Note: offset or count might be near -1>>>1.
 204         if (offset > value.length - count) {
 205             throw new StringIndexOutOfBoundsException(offset + count);
 206         }
 207         this.value = Arrays.copyOfRange(value, offset, offset+count);
 208     }
 209 
 210     /**
 211      * Allocates a new {@code String} that contains characters from a subarray
 212      * of the <a href="Character.html#unicode">Unicode code point</a> array
 213      * argument.  The {@code offset} argument is the index of the first code
 214      * point of the subarray and the {@code count} argument specifies the
 215      * length of the subarray.  The contents of the subarray are converted to
 216      * {@code char}s; subsequent modification of the {@code int} array does not
 217      * affect the newly created string.
 218      *
 219      * @param  codePoints
 220      *         Array that is the source of Unicode code points
 221      *
 222      * @param  offset
 223      *         The initial offset
 224      *
 225      * @param  count
 226      *         The length
 227      *
 228      * @throws  IllegalArgumentException
 229      *          If any invalid Unicode code point is found in {@code
 230      *          codePoints}
 231      *
 232      * @throws  IndexOutOfBoundsException
 233      *          If the {@code offset} and {@code count} arguments index
 234      *          characters outside the bounds of the {@code codePoints} array
 235      *
 236      * @since  1.5
 237      */
 238     public String(int[] codePoints, int offset, int count) {
 239         if (offset < 0) {
 240             throw new StringIndexOutOfBoundsException(offset);
 241         }
 242         if (count <= 0) {
 243             if (count < 0) {
 244                 throw new StringIndexOutOfBoundsException(count);
 245             }
 246             if (offset <= codePoints.length) {
 247                 this.value = "".value;
 248                 return;
 249             }
 250         }
 251         // Note: offset or count might be near -1>>>1.
 252         if (offset > codePoints.length - count) {
 253             throw new StringIndexOutOfBoundsException(offset + count);
 254         }
 255 
 256         final int end = offset + count;
 257 
 258         // Pass 1: Compute precise size of char[]
 259         int n = count;
 260         for (int i = offset; i < end; i++) {
 261             int c = codePoints[i];
 262             if (Character.isBmpCodePoint(c))
 263                 continue;
 264             else if (Character.isValidCodePoint(c))
 265                 n++;
 266             else throw new IllegalArgumentException(Integer.toString(c));
 267         }
 268 
 269         // Pass 2: Allocate and fill in char[]
 270         final char[] v = new char[n];
 271 
 272         for (int i = offset, j = 0; i < end; i++, j++) {
 273             int c = codePoints[i];
 274             if (Character.isBmpCodePoint(c))
 275                 v[j] = (char)c;
 276             else
 277                 Character.toSurrogates(c, v, j++);
 278         }
 279 
 280         this.value = v;
 281     }
 282 
 283     /**
 284      * Allocates a new {@code String} constructed from a subarray of an array
 285      * of 8-bit integer values.
 286      *
 287      * <p> The {@code offset} argument is the index of the first byte of the
 288      * subarray, and the {@code count} argument specifies the length of the
 289      * subarray.
 290      *
 291      * <p> Each {@code byte} in the subarray is converted to a {@code char} as
 292      * specified in the method above.
 293      *
 294      * @deprecated This method does not properly convert bytes into characters.
 295      * As of JDK&nbsp;1.1, the preferred way to do this is via the
 296      * {@code String} constructors that take a {@link
 297      * java.nio.charset.Charset}, charset name, or that use the platform's
 298      * default charset.
 299      *
 300      * @param  ascii
 301      *         The bytes to be converted to characters
 302      *
 303      * @param  hibyte
 304      *         The top 8 bits of each 16-bit Unicode code unit
 305      *
 306      * @param  offset
 307      *         The initial offset
 308      * @param  count
 309      *         The length
 310      *
 311      * @throws  IndexOutOfBoundsException
 312      *          If the {@code offset} or {@code count} argument is invalid
 313      *
 314      * @see  #String(byte[], int)
 315      * @see  #String(byte[], int, int, java.lang.String)
 316      * @see  #String(byte[], int, int, java.nio.charset.Charset)
 317      * @see  #String(byte[], int, int)
 318      * @see  #String(byte[], java.lang.String)
 319      * @see  #String(byte[], java.nio.charset.Charset)
 320      * @see  #String(byte[])
 321      */
 322     @Deprecated
 323     public String(byte ascii[], int hibyte, int offset, int count) {
 324         checkBounds(ascii, offset, count);
 325         char value[] = new char[count];
 326 
 327         if (hibyte == 0) {
 328             for (int i = count; i-- > 0;) {
 329                 value[i] = (char)(ascii[i + offset] & 0xff);
 330             }
 331         } else {
 332             hibyte <<= 8;
 333             for (int i = count; i-- > 0;) {
 334                 value[i] = (char)(hibyte | (ascii[i + offset] & 0xff));
 335             }
 336         }
 337         this.value = value;
 338     }
 339 
 340     /**
 341      * Allocates a new {@code String} containing characters constructed from
 342      * an array of 8-bit integer values. Each character <i>c</i>in the
 343      * resulting string is constructed from the corresponding component
 344      * <i>b</i> in the byte array such that:
 345      *
 346      * <blockquote><pre>
 347      *     <b><i>c</i></b> == (char)(((hibyte &amp; 0xff) &lt;&lt; 8)
 348      *                         | (<b><i>b</i></b> &amp; 0xff))
 349      * </pre></blockquote>
 350      *
 351      * @deprecated  This method does not properly convert bytes into
 352      * characters.  As of JDK&nbsp;1.1, the preferred way to do this is via the
 353      * {@code String} constructors that take a {@link
 354      * java.nio.charset.Charset}, charset name, or that use the platform's
 355      * default charset.
 356      *
 357      * @param  ascii
 358      *         The bytes to be converted to characters
 359      *
 360      * @param  hibyte
 361      *         The top 8 bits of each 16-bit Unicode code unit
 362      *
 363      * @see  #String(byte[], int, int, java.lang.String)
 364      * @see  #String(byte[], int, int, java.nio.charset.Charset)
 365      * @see  #String(byte[], int, int)
 366      * @see  #String(byte[], java.lang.String)
 367      * @see  #String(byte[], java.nio.charset.Charset)
 368      * @see  #String(byte[])
 369      */
 370     @Deprecated
 371     public String(byte ascii[], int hibyte) {
 372         this(ascii, hibyte, 0, ascii.length);
 373     }
 374 
 375     /* Common private utility method used to bounds check the byte array
 376      * and requested offset & length values used by the String(byte[],..)
 377      * constructors.
 378      */
 379     private static void checkBounds(byte[] bytes, int offset, int length) {
 380         if (length < 0)
 381             throw new StringIndexOutOfBoundsException(length);
 382         if (offset < 0)
 383             throw new StringIndexOutOfBoundsException(offset);
 384         if (offset > bytes.length - length)
 385             throw new StringIndexOutOfBoundsException(offset + length);
 386     }
 387 
 388     /**
 389      * Constructs a new {@code String} by decoding the specified subarray of
 390      * bytes using the specified charset.  The length of the new {@code String}
 391      * is a function of the charset, and hence may not be equal to the length
 392      * of the subarray.
 393      *
 394      * <p> The behavior of this constructor when the given bytes are not valid
 395      * in the given charset is unspecified.  The {@link
 396      * java.nio.charset.CharsetDecoder} class should be used when more control
 397      * over the decoding process is required.
 398      *
 399      * @param  bytes
 400      *         The bytes to be decoded into characters
 401      *
 402      * @param  offset
 403      *         The index of the first byte to decode
 404      *
 405      * @param  length
 406      *         The number of bytes to decode
 407 
 408      * @param  charsetName
 409      *         The name of a supported {@linkplain java.nio.charset.Charset
 410      *         charset}
 411      *
 412      * @throws  UnsupportedEncodingException
 413      *          If the named charset is not supported
 414      *
 415      * @throws  IndexOutOfBoundsException
 416      *          If the {@code offset} and {@code length} arguments index
 417      *          characters outside the bounds of the {@code bytes} array
 418      *
 419      * @since  JDK1.1
 420      */
 421     public String(byte bytes[], int offset, int length, String charsetName)
 422             throws UnsupportedEncodingException {
 423         if (charsetName == null)
 424             throw new NullPointerException("charsetName");
 425         checkBounds(bytes, offset, length);
 426         this.value = StringCoding.decode(charsetName, bytes, offset, length);
 427     }
 428 
 429     /**
 430      * Constructs a new {@code String} by decoding the specified subarray of
 431      * bytes using the specified {@linkplain java.nio.charset.Charset charset}.
 432      * The length of the new {@code String} is a function of the charset, and
 433      * hence may not be equal to the length of the subarray.
 434      *
 435      * <p> This method always replaces malformed-input and unmappable-character
 436      * sequences with this charset's default replacement string.  The {@link
 437      * java.nio.charset.CharsetDecoder} class should be used when more control
 438      * over the decoding process is required.
 439      *
 440      * @param  bytes
 441      *         The bytes to be decoded into characters
 442      *
 443      * @param  offset
 444      *         The index of the first byte to decode
 445      *
 446      * @param  length
 447      *         The number of bytes to decode
 448      *
 449      * @param  charset
 450      *         The {@linkplain java.nio.charset.Charset charset} to be used to
 451      *         decode the {@code bytes}
 452      *
 453      * @throws  IndexOutOfBoundsException
 454      *          If the {@code offset} and {@code length} arguments index
 455      *          characters outside the bounds of the {@code bytes} array
 456      *
 457      * @since  1.6
 458      */
 459     public String(byte bytes[], int offset, int length, Charset charset) {
 460         if (charset == null)
 461             throw new NullPointerException("charset");
 462         checkBounds(bytes, offset, length);
 463         this.value =  StringCoding.decode(charset, bytes, offset, length);
 464     }
 465 
 466     /**
 467      * Constructs a new {@code String} by decoding the specified array of bytes
 468      * using the specified {@linkplain java.nio.charset.Charset charset}.  The
 469      * length of the new {@code String} is a function of the charset, and hence
 470      * may not be equal to the length of the byte array.
 471      *
 472      * <p> The behavior of this constructor when the given bytes are not valid
 473      * in the given charset is unspecified.  The {@link
 474      * java.nio.charset.CharsetDecoder} class should be used when more control
 475      * over the decoding process is required.
 476      *
 477      * @param  bytes
 478      *         The bytes to be decoded into characters
 479      *
 480      * @param  charsetName
 481      *         The name of a supported {@linkplain java.nio.charset.Charset
 482      *         charset}
 483      *
 484      * @throws  UnsupportedEncodingException
 485      *          If the named charset is not supported
 486      *
 487      * @since  JDK1.1
 488      */
 489     public String(byte bytes[], String charsetName)
 490             throws UnsupportedEncodingException {
 491         this(bytes, 0, bytes.length, charsetName);
 492     }
 493 
 494     /**
 495      * Constructs a new {@code String} by decoding the specified array of
 496      * bytes using the specified {@linkplain java.nio.charset.Charset charset}.
 497      * The length of the new {@code String} is a function of the charset, and
 498      * hence may not be equal to the length of the byte array.
 499      *
 500      * <p> This method always replaces malformed-input and unmappable-character
 501      * sequences with this charset's default replacement string.  The {@link
 502      * java.nio.charset.CharsetDecoder} class should be used when more control
 503      * over the decoding process is required.
 504      *
 505      * @param  bytes
 506      *         The bytes to be decoded into characters
 507      *
 508      * @param  charset
 509      *         The {@linkplain java.nio.charset.Charset charset} to be used to
 510      *         decode the {@code bytes}
 511      *
 512      * @since  1.6
 513      */
 514     public String(byte bytes[], Charset charset) {
 515         this(bytes, 0, bytes.length, charset);
 516     }
 517 
 518     /**
 519      * Constructs a new {@code String} by decoding the specified subarray of
 520      * bytes using the platform's default charset.  The length of the new
 521      * {@code String} is a function of the charset, and hence may not be equal
 522      * to the length of the subarray.
 523      *
 524      * <p> The behavior of this constructor when the given bytes are not valid
 525      * in the default charset is unspecified.  The {@link
 526      * java.nio.charset.CharsetDecoder} class should be used when more control
 527      * over the decoding process is required.
 528      *
 529      * @param  bytes
 530      *         The bytes to be decoded into characters
 531      *
 532      * @param  offset
 533      *         The index of the first byte to decode
 534      *
 535      * @param  length
 536      *         The number of bytes to decode
 537      *
 538      * @throws  IndexOutOfBoundsException
 539      *          If the {@code offset} and the {@code length} arguments index
 540      *          characters outside the bounds of the {@code bytes} array
 541      *
 542      * @since  JDK1.1
 543      */
 544     public String(byte bytes[], int offset, int length) {
 545         checkBounds(bytes, offset, length);
 546         this.value = StringCoding.decode(bytes, offset, length);
 547     }
 548 
 549     /**
 550      * Constructs a new {@code String} by decoding the specified array of bytes
 551      * using the platform's default charset.  The length of the new {@code
 552      * String} is a function of the charset, and hence may not be equal to the
 553      * length of the byte array.
 554      *
 555      * <p> The behavior of this constructor when the given bytes are not valid
 556      * in the default charset is unspecified.  The {@link
 557      * java.nio.charset.CharsetDecoder} class should be used when more control
 558      * over the decoding process is required.
 559      *
 560      * @param  bytes
 561      *         The bytes to be decoded into characters
 562      *
 563      * @since  JDK1.1
 564      */
 565     public String(byte bytes[]) {
 566         this(bytes, 0, bytes.length);
 567     }
 568 
 569     /**
 570      * Allocates a new string that contains the sequence of characters
 571      * currently contained in the string buffer argument. The contents of the
 572      * string buffer are copied; subsequent modification of the string buffer
 573      * does not affect the newly created string.
 574      *
 575      * @param  buffer
 576      *         A {@code StringBuffer}
 577      */
 578     public String(StringBuffer buffer) {
 579         synchronized(buffer) {
 580             this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
 581         }
 582     }
 583 
 584     /**
 585      * Allocates a new string that contains the sequence of characters
 586      * currently contained in the string builder argument. The contents of the
 587      * string builder are copied; subsequent modification of the string builder
 588      * does not affect the newly created string.
 589      *
 590      * <p> This constructor is provided to ease migration to {@code
 591      * StringBuilder}. Obtaining a string from a string builder via the {@code
 592      * toString} method is likely to run faster and is generally preferred.
 593      *
 594      * @param   builder
 595      *          A {@code StringBuilder}
 596      *
 597      * @since  1.5
 598      */
 599     public String(StringBuilder builder) {
 600         this.value = Arrays.copyOf(builder.getValue(), builder.length());
 601     }
 602 
 603     /*
 604     * Package private constructor which shares value array for speed.
 605     * this constructor is always expected to be called with share==true.
 606     * a separate constructor is needed because we already have a public
 607     * String(char[]) constructor that makes a copy of the given char[].
 608     */
 609     String(char[] value, boolean share) {
 610         // assert share : "unshared not supported";
 611         this.value = value;
 612     }
 613 
 614     /**
 615      * Returns the length of this string.
 616      * The length is equal to the number of <a href="Character.html#unicode">Unicode
 617      * code units</a> in the string.
 618      *
 619      * @return  the length of the sequence of characters represented by this
 620      *          object.
 621      */
 622     public int length() {
 623         return value.length;
 624     }
 625 
 626     /**
 627      * Returns {@code true} if, and only if, {@link #length()} is {@code 0}.
 628      *
 629      * @return {@code true} if {@link #length()} is {@code 0}, otherwise
 630      * {@code false}
 631      *
 632      * @since 1.6
 633      */
 634     public boolean isEmpty() {
 635         return value.length == 0;
 636     }
 637 
 638     /**
 639      * Returns the {@code char} value at the
 640      * specified index. An index ranges from {@code 0} to
 641      * {@code length() - 1}. The first {@code char} value of the sequence
 642      * is at index {@code 0}, the next at index {@code 1},
 643      * and so on, as for array indexing.
 644      *
 645      * <p>If the {@code char} value specified by the index is a
 646      * <a href="Character.html#unicode">surrogate</a>, the surrogate
 647      * value is returned.
 648      *
 649      * @param      index   the index of the {@code char} value.
 650      * @return     the {@code char} value at the specified index of this string.
 651      *             The first {@code char} value is at index {@code 0}.
 652      * @exception  IndexOutOfBoundsException  if the {@code index}
 653      *             argument is negative or not less than the length of this
 654      *             string.
 655      */
 656     public char charAt(int index) {
 657         if ((index < 0) || (index >= value.length)) {
 658             throw new StringIndexOutOfBoundsException(index);
 659         }
 660         return value[index];
 661     }
 662 
 663     /**
 664      * Returns the character (Unicode code point) at the specified
 665      * index. The index refers to {@code char} values
 666      * (Unicode code units) and ranges from {@code 0} to
 667      * {@link #length()}{@code  - 1}.
 668      *
 669      * <p> If the {@code char} value specified at the given index
 670      * is in the high-surrogate range, the following index is less
 671      * than the length of this {@code String}, and the
 672      * {@code char} value at the following index is in the
 673      * low-surrogate range, then the supplementary code point
 674      * corresponding to this surrogate pair is returned. Otherwise,
 675      * the {@code char} value at the given index is returned.
 676      *
 677      * @param      index the index to the {@code char} values
 678      * @return     the code point value of the character at the
 679      *             {@code index}
 680      * @exception  IndexOutOfBoundsException  if the {@code index}
 681      *             argument is negative or not less than the length of this
 682      *             string.
 683      * @since      1.5
 684      */
 685     public int codePointAt(int index) {
 686         if ((index < 0) || (index >= value.length)) {
 687             throw new StringIndexOutOfBoundsException(index);
 688         }
 689         return Character.codePointAtImpl(value, index, value.length);
 690     }
 691 
 692     /**
 693      * Returns the character (Unicode code point) before the specified
 694      * index. The index refers to {@code char} values
 695      * (Unicode code units) and ranges from {@code 1} to {@link
 696      * CharSequence#length() length}.
 697      *
 698      * <p> If the {@code char} value at {@code (index - 1)}
 699      * is in the low-surrogate range, {@code (index - 2)} is not
 700      * negative, and the {@code char} value at {@code (index -
 701      * 2)} is in the high-surrogate range, then the
 702      * supplementary code point value of the surrogate pair is
 703      * returned. If the {@code char} value at {@code index -
 704      * 1} is an unpaired low-surrogate or a high-surrogate, the
 705      * surrogate value is returned.
 706      *
 707      * @param     index the index following the code point that should be returned
 708      * @return    the Unicode code point value before the given index.
 709      * @exception IndexOutOfBoundsException if the {@code index}
 710      *            argument is less than 1 or greater than the length
 711      *            of this string.
 712      * @since     1.5
 713      */
 714     public int codePointBefore(int index) {
 715         int i = index - 1;
 716         if ((i < 0) || (i >= value.length)) {
 717             throw new StringIndexOutOfBoundsException(index);
 718         }
 719         return Character.codePointBeforeImpl(value, index, 0);
 720     }
 721 
 722     /**
 723      * Returns the number of Unicode code points in the specified text
 724      * range of this {@code String}. The text range begins at the
 725      * specified {@code beginIndex} and extends to the
 726      * {@code char} at index {@code endIndex - 1}. Thus the
 727      * length (in {@code char}s) of the text range is
 728      * {@code endIndex-beginIndex}. Unpaired surrogates within
 729      * the text range count as one code point each.
 730      *
 731      * @param beginIndex the index to the first {@code char} of
 732      * the text range.
 733      * @param endIndex the index after the last {@code char} of
 734      * the text range.
 735      * @return the number of Unicode code points in the specified text
 736      * range
 737      * @exception IndexOutOfBoundsException if the
 738      * {@code beginIndex} is negative, or {@code endIndex}
 739      * is larger than the length of this {@code String}, or
 740      * {@code beginIndex} is larger than {@code endIndex}.
 741      * @since  1.5
 742      */
 743     public int codePointCount(int beginIndex, int endIndex) {
 744         if (beginIndex < 0 || endIndex > value.length || beginIndex > endIndex) {
 745             throw new IndexOutOfBoundsException();
 746         }
 747         return Character.codePointCountImpl(value, beginIndex, endIndex - beginIndex);
 748     }
 749 
 750     /**
 751      * Returns the index within this {@code String} that is
 752      * offset from the given {@code index} by
 753      * {@code codePointOffset} code points. Unpaired surrogates
 754      * within the text range given by {@code index} and
 755      * {@code codePointOffset} count as one code point each.
 756      *
 757      * @param index the index to be offset
 758      * @param codePointOffset the offset in code points
 759      * @return the index within this {@code String}
 760      * @exception IndexOutOfBoundsException if {@code index}
 761      *   is negative or larger then the length of this
 762      *   {@code String}, or if {@code codePointOffset} is positive
 763      *   and the substring starting with {@code index} has fewer
 764      *   than {@code codePointOffset} code points,
 765      *   or if {@code codePointOffset} is negative and the substring
 766      *   before {@code index} has fewer than the absolute value
 767      *   of {@code codePointOffset} code points.
 768      * @since 1.5
 769      */
 770     public int offsetByCodePoints(int index, int codePointOffset) {
 771         if (index < 0 || index > value.length) {
 772             throw new IndexOutOfBoundsException();
 773         }
 774         return Character.offsetByCodePointsImpl(value, 0, value.length,
 775                 index, codePointOffset);
 776     }
 777 
 778     /**
 779      * Copy characters from this string into dst starting at dstBegin.
 780      * This method doesn't perform any range checking.
 781      */
 782     void getChars(char dst[], int dstBegin) {
 783         System.arraycopy(value, 0, dst, dstBegin, value.length);
 784     }
 785 
 786     /**
 787      * Copies characters from this string into the destination character
 788      * array.
 789      * <p>
 790      * The first character to be copied is at index {@code srcBegin};
 791      * the last character to be copied is at index {@code srcEnd-1}
 792      * (thus the total number of characters to be copied is
 793      * {@code srcEnd-srcBegin}). The characters are copied into the
 794      * subarray of {@code dst} starting at index {@code dstBegin}
 795      * and ending at index:
 796      * <blockquote><pre>
 797      *     dstBegin + (srcEnd-srcBegin) - 1
 798      * </pre></blockquote>
 799      *
 800      * @param      srcBegin   index of the first character in the string
 801      *                        to copy.
 802      * @param      srcEnd     index after the last character in the string
 803      *                        to copy.
 804      * @param      dst        the destination array.
 805      * @param      dstBegin   the start offset in the destination array.
 806      * @exception IndexOutOfBoundsException If any of the following
 807      *            is true:
 808      *            <ul><li>{@code srcBegin} is negative.
 809      *            <li>{@code srcBegin} is greater than {@code srcEnd}
 810      *            <li>{@code srcEnd} is greater than the length of this
 811      *                string
 812      *            <li>{@code dstBegin} is negative
 813      *            <li>{@code dstBegin+(srcEnd-srcBegin)} is larger than
 814      *                {@code dst.length}</ul>
 815      */
 816     public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
 817         if (srcBegin < 0) {
 818             throw new StringIndexOutOfBoundsException(srcBegin);
 819         }
 820         if (srcEnd > value.length) {
 821             throw new StringIndexOutOfBoundsException(srcEnd);
 822         }
 823         if (srcBegin > srcEnd) {
 824             throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
 825         }
 826         System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
 827     }
 828 
 829     /**
 830      * Copies characters from this string into the destination byte array. Each
 831      * byte receives the 8 low-order bits of the corresponding character. The
 832      * eight high-order bits of each character are not copied and do not
 833      * participate in the transfer in any way.
 834      *
 835      * <p> The first character to be copied is at index {@code srcBegin}; the
 836      * last character to be copied is at index {@code srcEnd-1}.  The total
 837      * number of characters to be copied is {@code srcEnd-srcBegin}. The
 838      * characters, converted to bytes, are copied into the subarray of {@code
 839      * dst} starting at index {@code dstBegin} and ending at index:
 840      *
 841      * <blockquote><pre>
 842      *     dstBegin + (srcEnd-srcBegin) - 1
 843      * </pre></blockquote>
 844      *
 845      * @deprecated  This method does not properly convert characters into
 846      * bytes.  As of JDK&nbsp;1.1, the preferred way to do this is via the
 847      * {@link #getBytes()} method, which uses the platform's default charset.
 848      *
 849      * @param  srcBegin
 850      *         Index of the first character in the string to copy
 851      *
 852      * @param  srcEnd
 853      *         Index after the last character in the string to copy
 854      *
 855      * @param  dst
 856      *         The destination array
 857      *
 858      * @param  dstBegin
 859      *         The start offset in the destination array
 860      *
 861      * @throws  IndexOutOfBoundsException
 862      *          If any of the following is true:
 863      *          <ul>
 864      *            <li> {@code srcBegin} is negative
 865      *            <li> {@code srcBegin} is greater than {@code srcEnd}
 866      *            <li> {@code srcEnd} is greater than the length of this String
 867      *            <li> {@code dstBegin} is negative
 868      *            <li> {@code dstBegin+(srcEnd-srcBegin)} is larger than {@code
 869      *                 dst.length}
 870      *          </ul>
 871      */
 872     @Deprecated
 873     public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) {
 874         if (srcBegin < 0) {
 875             throw new StringIndexOutOfBoundsException(srcBegin);
 876         }
 877         if (srcEnd > value.length) {
 878             throw new StringIndexOutOfBoundsException(srcEnd);
 879         }
 880         if (srcBegin > srcEnd) {
 881             throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
 882         }
 883         Objects.requireNonNull(dst);
 884 
 885         int j = dstBegin;
 886         int n = srcEnd;
 887         int i = srcBegin;
 888         char[] val = value;   /* avoid getfield opcode */
 889 
 890         while (i < n) {
 891             dst[j++] = (byte)val[i++];
 892         }
 893     }
 894 
 895     /**
 896      * Encodes this {@code String} into a sequence of bytes using the named
 897      * charset, storing the result into a new byte array.
 898      *
 899      * <p> The behavior of this method when this string cannot be encoded in
 900      * the given charset is unspecified.  The {@link
 901      * java.nio.charset.CharsetEncoder} class should be used when more control
 902      * over the encoding process is required.
 903      *
 904      * @param  charsetName
 905      *         The name of a supported {@linkplain java.nio.charset.Charset
 906      *         charset}
 907      *
 908      * @return  The resultant byte array
 909      *
 910      * @throws  UnsupportedEncodingException
 911      *          If the named charset is not supported
 912      *
 913      * @since  JDK1.1
 914      */
 915     public byte[] getBytes(String charsetName)
 916             throws UnsupportedEncodingException {
 917         if (charsetName == null) throw new NullPointerException();
 918         return StringCoding.encode(charsetName, value, 0, value.length);
 919     }
 920 
 921     /**
 922      * Encodes this {@code String} into a sequence of bytes using the given
 923      * {@linkplain java.nio.charset.Charset charset}, storing the result into a
 924      * new byte array.
 925      *
 926      * <p> This method always replaces malformed-input and unmappable-character
 927      * sequences with this charset's default replacement byte array.  The
 928      * {@link java.nio.charset.CharsetEncoder} class should be used when more
 929      * control over the encoding process is required.
 930      *
 931      * @param  charset
 932      *         The {@linkplain java.nio.charset.Charset} to be used to encode
 933      *         the {@code String}
 934      *
 935      * @return  The resultant byte array
 936      *
 937      * @since  1.6
 938      */
 939     public byte[] getBytes(Charset charset) {
 940         if (charset == null) throw new NullPointerException();
 941         return StringCoding.encode(charset, value, 0, value.length);
 942     }
 943 
 944     /**
 945      * Encodes this {@code String} into a sequence of bytes using the
 946      * platform's default charset, storing the result into a new byte array.
 947      *
 948      * <p> The behavior of this method when this string cannot be encoded in
 949      * the default charset is unspecified.  The {@link
 950      * java.nio.charset.CharsetEncoder} class should be used when more control
 951      * over the encoding process is required.
 952      *
 953      * @return  The resultant byte array
 954      *
 955      * @since      JDK1.1
 956      */
 957     public byte[] getBytes() {
 958         return StringCoding.encode(value, 0, value.length);
 959     }
 960 
 961     /**
 962      * Compares this string to the specified object.  The result is {@code
 963      * true} if and only if the argument is not {@code null} and is a {@code
 964      * String} object that represents the same sequence of characters as this
 965      * object.
 966      *
 967      * @param  anObject
 968      *         The object to compare this {@code String} against
 969      *
 970      * @return  {@code true} if the given object represents a {@code String}
 971      *          equivalent to this string, {@code false} otherwise
 972      *
 973      * @see  #compareTo(String)
 974      * @see  #equalsIgnoreCase(String)
 975      */
 976     public boolean equals(Object anObject) {
 977         if (this == anObject) {
 978             return true;
 979         }
 980         if (anObject instanceof String) {
 981             String anotherString = (String)anObject;
 982             int n = value.length;
 983             if (n == anotherString.value.length) {
 984                 char v1[] = value;
 985                 char v2[] = anotherString.value;
 986                 int i = 0;
 987                 while (n-- != 0) {
 988                     if (v1[i] != v2[i])
 989                         return false;
 990                     i++;
 991                 }
 992                 return true;
 993             }
 994         }
 995         return false;
 996     }
 997 
 998     /**
 999      * Compares this string to the specified {@code StringBuffer}.  The result
1000      * is {@code true} if and only if this {@code String} represents the same
1001      * sequence of characters as the specified {@code StringBuffer}. This method
1002      * synchronizes on the {@code StringBuffer}.
1003      *
1004      * @param  sb
1005      *         The {@code StringBuffer} to compare this {@code String} against
1006      *
1007      * @return  {@code true} if this {@code String} represents the same
1008      *          sequence of characters as the specified {@code StringBuffer},
1009      *          {@code false} otherwise
1010      *
1011      * @since  1.4
1012      */
1013     public boolean contentEquals(StringBuffer sb) {
1014         return contentEquals((CharSequence)sb);
1015     }
1016 
1017     private boolean nonSyncContentEquals(AbstractStringBuilder sb) {
1018         char v1[] = value;
1019         char v2[] = sb.getValue();
1020         int n = v1.length;
1021         if (n != sb.length()) {
1022             return false;
1023         }
1024         for (int i = 0; i < n; i++) {
1025             if (v1[i] != v2[i]) {
1026                 return false;
1027             }
1028         }
1029         return true;
1030     }
1031 
1032     /**
1033      * Compares this string to the specified {@code CharSequence}.  The
1034      * result is {@code true} if and only if this {@code String} represents the
1035      * same sequence of char values as the specified sequence. Note that if the
1036      * {@code CharSequence} is a {@code StringBuffer} then the method
1037      * synchronizes on it.
1038      *
1039      * @param  cs
1040      *         The sequence to compare this {@code String} against
1041      *
1042      * @return  {@code true} if this {@code String} represents the same
1043      *          sequence of char values as the specified sequence, {@code
1044      *          false} otherwise
1045      *
1046      * @since  1.5
1047      */
1048     public boolean contentEquals(CharSequence cs) {
1049         // Argument is a StringBuffer, StringBuilder
1050         if (cs instanceof AbstractStringBuilder) {
1051             if (cs instanceof StringBuffer) {
1052                 synchronized(cs) {
1053                    return nonSyncContentEquals((AbstractStringBuilder)cs);
1054                 }
1055             } else {
1056                 return nonSyncContentEquals((AbstractStringBuilder)cs);
1057             }
1058         }
1059         // Argument is a String
1060         if (cs instanceof String) {
1061             return equals(cs);
1062         }
1063         // Argument is a generic CharSequence
1064         char v1[] = value;
1065         int n = v1.length;
1066         if (n != cs.length()) {
1067             return false;
1068         }
1069         for (int i = 0; i < n; i++) {
1070             if (v1[i] != cs.charAt(i)) {
1071                 return false;
1072             }
1073         }
1074         return true;
1075     }
1076 
1077     /**
1078      * Compares this {@code String} to another {@code String}, ignoring case
1079      * considerations.  Two strings are considered equal ignoring case if they
1080      * are of the same length and corresponding characters in the two strings
1081      * are equal ignoring case.
1082      *
1083      * <p> Two characters {@code c1} and {@code c2} are considered the same
1084      * ignoring case if at least one of the following is true:
1085      * <ul>
1086      *   <li> The two characters are the same (as compared by the
1087      *        {@code ==} operator)
1088      *   <li> Applying the method {@link
1089      *        java.lang.Character#toUpperCase(char)} to each character
1090      *        produces the same result
1091      *   <li> Applying the method {@link
1092      *        java.lang.Character#toLowerCase(char)} to each character
1093      *        produces the same result
1094      * </ul>
1095      *
1096      * @param  anotherString
1097      *         The {@code String} to compare this {@code String} against
1098      *
1099      * @return  {@code true} if the argument is not {@code null} and it
1100      *          represents an equivalent {@code String} ignoring case; {@code
1101      *          false} otherwise
1102      *
1103      * @see  #equals(Object)
1104      */
1105     public boolean equalsIgnoreCase(String anotherString) {
1106         return (this == anotherString) ? true
1107                 : (anotherString != null)
1108                 && (anotherString.value.length == value.length)
1109                 && regionMatches(true, 0, anotherString, 0, value.length);
1110     }
1111 
1112     /**
1113      * Compares two strings lexicographically.
1114      * The comparison is based on the Unicode value of each character in
1115      * the strings. The character sequence represented by this
1116      * {@code String} object is compared lexicographically to the
1117      * character sequence represented by the argument string. The result is
1118      * a negative integer if this {@code String} object
1119      * lexicographically precedes the argument string. The result is a
1120      * positive integer if this {@code String} object lexicographically
1121      * follows the argument string. The result is zero if the strings
1122      * are equal; {@code compareTo} returns {@code 0} exactly when
1123      * the {@link #equals(Object)} method would return {@code true}.
1124      * <p>
1125      * This is the definition of lexicographic ordering. If two strings are
1126      * different, then either they have different characters at some index
1127      * that is a valid index for both strings, or their lengths are different,
1128      * or both. If they have different characters at one or more index
1129      * positions, let <i>k</i> be the smallest such index; then the string
1130      * whose character at position <i>k</i> has the smaller value, as
1131      * determined by using the &lt; operator, lexicographically precedes the
1132      * other string. In this case, {@code compareTo} returns the
1133      * difference of the two character values at position {@code k} in
1134      * the two string -- that is, the value:
1135      * <blockquote><pre>
1136      * this.charAt(k)-anotherString.charAt(k)
1137      * </pre></blockquote>
1138      * If there is no index position at which they differ, then the shorter
1139      * string lexicographically precedes the longer string. In this case,
1140      * {@code compareTo} returns the difference of the lengths of the
1141      * strings -- that is, the value:
1142      * <blockquote><pre>
1143      * this.length()-anotherString.length()
1144      * </pre></blockquote>
1145      *
1146      * @param   anotherString   the {@code String} to be compared.
1147      * @return  the value {@code 0} if the argument string is equal to
1148      *          this string; a value less than {@code 0} if this string
1149      *          is lexicographically less than the string argument; and a
1150      *          value greater than {@code 0} if this string is
1151      *          lexicographically greater than the string argument.
1152      */
1153     public int compareTo(String anotherString) {
1154         int len1 = value.length;
1155         int len2 = anotherString.value.length;
1156         int lim = Math.min(len1, len2);
1157         char v1[] = value;
1158         char v2[] = anotherString.value;
1159 
1160         int k = 0;
1161         while (k < lim) {
1162             char c1 = v1[k];
1163             char c2 = v2[k];
1164             if (c1 != c2) {
1165                 return c1 - c2;
1166             }
1167             k++;
1168         }
1169         return len1 - len2;
1170     }
1171 
1172     /**
1173      * A Comparator that orders {@code String} objects as by
1174      * {@code compareToIgnoreCase}. This comparator is serializable.
1175      * <p>
1176      * Note that this Comparator does <em>not</em> take locale into account,
1177      * and will result in an unsatisfactory ordering for certain locales.
1178      * The java.text package provides <em>Collators</em> to allow
1179      * locale-sensitive ordering.
1180      *
1181      * @see     java.text.Collator#compare(String, String)
1182      * @since   1.2
1183      */
1184     public static final Comparator<String> CASE_INSENSITIVE_ORDER
1185                                          = new CaseInsensitiveComparator();
1186     private static class CaseInsensitiveComparator
1187             implements Comparator<String>, java.io.Serializable {
1188         // use serialVersionUID from JDK 1.2.2 for interoperability
1189         private static final long serialVersionUID = 8575799808933029326L;
1190 
1191         public int compare(String s1, String s2) {
1192             int n1 = s1.length();
1193             int n2 = s2.length();
1194             int min = Math.min(n1, n2);
1195             for (int i = 0; i < min; i++) {
1196                 char c1 = s1.charAt(i);
1197                 char c2 = s2.charAt(i);
1198                 if (c1 != c2) {
1199                     c1 = Character.toUpperCase(c1);
1200                     c2 = Character.toUpperCase(c2);
1201                     if (c1 != c2) {
1202                         c1 = Character.toLowerCase(c1);
1203                         c2 = Character.toLowerCase(c2);
1204                         if (c1 != c2) {
1205                             // No overflow because of numeric promotion
1206                             return c1 - c2;
1207                         }
1208                     }
1209                 }
1210             }
1211             return n1 - n2;
1212         }
1213 
1214         /** Replaces the de-serialized object. */
1215         private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
1216     }
1217 
1218     /**
1219      * Compares two strings lexicographically, ignoring case
1220      * differences. This method returns an integer whose sign is that of
1221      * calling {@code compareTo} with normalized versions of the strings
1222      * where case differences have been eliminated by calling
1223      * {@code Character.toLowerCase(Character.toUpperCase(character))} on
1224      * each character.
1225      * <p>
1226      * Note that this method does <em>not</em> take locale into account,
1227      * and will result in an unsatisfactory ordering for certain locales.
1228      * The java.text package provides <em>collators</em> to allow
1229      * locale-sensitive ordering.
1230      *
1231      * @param   str   the {@code String} to be compared.
1232      * @return  a negative integer, zero, or a positive integer as the
1233      *          specified String is greater than, equal to, or less
1234      *          than this String, ignoring case considerations.
1235      * @see     java.text.Collator#compare(String, String)
1236      * @since   1.2
1237      */
1238     public int compareToIgnoreCase(String str) {
1239         return CASE_INSENSITIVE_ORDER.compare(this, str);
1240     }
1241 
1242     /**
1243      * Tests if two string regions are equal.
1244      * <p>
1245      * A substring of this {@code String} object is compared to a substring
1246      * of the argument other. The result is true if these substrings
1247      * represent identical character sequences. The substring of this
1248      * {@code String} object to be compared begins at index {@code toffset}
1249      * and has length {@code len}. The substring of other to be compared
1250      * begins at index {@code ooffset} and has length {@code len}. The
1251      * result is {@code false} if and only if at least one of the following
1252      * is true:
1253      * <ul><li>{@code toffset} is negative.
1254      * <li>{@code ooffset} is negative.
1255      * <li>{@code toffset+len} is greater than the length of this
1256      * {@code String} object.
1257      * <li>{@code ooffset+len} is greater than the length of the other
1258      * argument.
1259      * <li>There is some nonnegative integer <i>k</i> less than {@code len}
1260      * such that:
1261      * {@code this.charAt(toffset + }<i>k</i>{@code ) != other.charAt(ooffset + }
1262      * <i>k</i>{@code )}
1263      * </ul>
1264      *
1265      * @param   toffset   the starting offset of the subregion in this string.
1266      * @param   other     the string argument.
1267      * @param   ooffset   the starting offset of the subregion in the string
1268      *                    argument.
1269      * @param   len       the number of characters to compare.
1270      * @return  {@code true} if the specified subregion of this string
1271      *          exactly matches the specified subregion of the string argument;
1272      *          {@code false} otherwise.
1273      */
1274     public boolean regionMatches(int toffset, String other, int ooffset,
1275             int len) {
1276         char ta[] = value;
1277         int to = toffset;
1278         char pa[] = other.value;
1279         int po = ooffset;
1280         // Note: toffset, ooffset, or len might be near -1>>>1.
1281         if ((ooffset < 0) || (toffset < 0)
1282                 || (toffset > (long)value.length - len)
1283                 || (ooffset > (long)other.value.length - len)) {
1284             return false;
1285         }
1286         while (len-- > 0) {
1287             if (ta[to++] != pa[po++]) {
1288                 return false;
1289             }
1290         }
1291         return true;
1292     }
1293 
1294     /**
1295      * Tests if two string regions are equal.
1296      * <p>
1297      * A substring of this {@code String} object is compared to a substring
1298      * of the argument {@code other}. The result is {@code true} if these
1299      * substrings represent character sequences that are the same, ignoring
1300      * case if and only if {@code ignoreCase} is true. The substring of
1301      * this {@code String} object to be compared begins at index
1302      * {@code toffset} and has length {@code len}. The substring of
1303      * {@code other} to be compared begins at index {@code ooffset} and
1304      * has length {@code len}. The result is {@code false} if and only if
1305      * at least one of the following is true:
1306      * <ul><li>{@code toffset} is negative.
1307      * <li>{@code ooffset} is negative.
1308      * <li>{@code toffset+len} is greater than the length of this
1309      * {@code String} object.
1310      * <li>{@code ooffset+len} is greater than the length of the other
1311      * argument.
1312      * <li>{@code ignoreCase} is {@code false} and there is some nonnegative
1313      * integer <i>k</i> less than {@code len} such that:
1314      * <blockquote><pre>
1315      * this.charAt(toffset+k) != other.charAt(ooffset+k)
1316      * </pre></blockquote>
1317      * <li>{@code ignoreCase} is {@code true} and there is some nonnegative
1318      * integer <i>k</i> less than {@code len} such that:
1319      * <blockquote><pre>
1320      * Character.toLowerCase(this.charAt(toffset+k)) !=
1321      Character.toLowerCase(other.charAt(ooffset+k))
1322      * </pre></blockquote>
1323      * and:
1324      * <blockquote><pre>
1325      * Character.toUpperCase(this.charAt(toffset+k)) !=
1326      *         Character.toUpperCase(other.charAt(ooffset+k))
1327      * </pre></blockquote>
1328      * </ul>
1329      *
1330      * @param   ignoreCase   if {@code true}, ignore case when comparing
1331      *                       characters.
1332      * @param   toffset      the starting offset of the subregion in this
1333      *                       string.
1334      * @param   other        the string argument.
1335      * @param   ooffset      the starting offset of the subregion in the string
1336      *                       argument.
1337      * @param   len          the number of characters to compare.
1338      * @return  {@code true} if the specified subregion of this string
1339      *          matches the specified subregion of the string argument;
1340      *          {@code false} otherwise. Whether the matching is exact
1341      *          or case insensitive depends on the {@code ignoreCase}
1342      *          argument.
1343      */
1344     public boolean regionMatches(boolean ignoreCase, int toffset,
1345             String other, int ooffset, int len) {
1346         char ta[] = value;
1347         int to = toffset;
1348         char pa[] = other.value;
1349         int po = ooffset;
1350         // Note: toffset, ooffset, or len might be near -1>>>1.
1351         if ((ooffset < 0) || (toffset < 0)
1352                 || (toffset > (long)value.length - len)
1353                 || (ooffset > (long)other.value.length - len)) {
1354             return false;
1355         }
1356         while (len-- > 0) {
1357             char c1 = ta[to++];
1358             char c2 = pa[po++];
1359             if (c1 == c2) {
1360                 continue;
1361             }
1362             if (ignoreCase) {
1363                 // If characters don't match but case may be ignored,
1364                 // try converting both characters to uppercase.
1365                 // If the results match, then the comparison scan should
1366                 // continue.
1367                 char u1 = Character.toUpperCase(c1);
1368                 char u2 = Character.toUpperCase(c2);
1369                 if (u1 == u2) {
1370                     continue;
1371                 }
1372                 // Unfortunately, conversion to uppercase does not work properly
1373                 // for the Georgian alphabet, which has strange rules about case
1374                 // conversion.  So we need to make one last check before
1375                 // exiting.
1376                 if (Character.toLowerCase(u1) == Character.toLowerCase(u2)) {
1377                     continue;
1378                 }
1379             }
1380             return false;
1381         }
1382         return true;
1383     }
1384 
1385     /**
1386      * Tests if the substring of this string beginning at the
1387      * specified index starts with the specified prefix.
1388      *
1389      * @param   prefix    the prefix.
1390      * @param   toffset   where to begin looking in this string.
1391      * @return  {@code true} if the character sequence represented by the
1392      *          argument is a prefix of the substring of this object starting
1393      *          at index {@code toffset}; {@code false} otherwise.
1394      *          The result is {@code false} if {@code toffset} is
1395      *          negative or greater than the length of this
1396      *          {@code String} object; otherwise the result is the same
1397      *          as the result of the expression
1398      *          <pre>
1399      *          this.substring(toffset).startsWith(prefix)
1400      *          </pre>
1401      */
1402     public boolean startsWith(String prefix, int toffset) {
1403         char ta[] = value;
1404         int to = toffset;
1405         char pa[] = prefix.value;
1406         int po = 0;
1407         int pc = prefix.value.length;
1408         // Note: toffset might be near -1>>>1.
1409         if ((toffset < 0) || (toffset > value.length - pc)) {
1410             return false;
1411         }
1412         while (--pc >= 0) {
1413             if (ta[to++] != pa[po++]) {
1414                 return false;
1415             }
1416         }
1417         return true;
1418     }
1419 
1420     /**
1421      * Tests if this string starts with the specified prefix.
1422      *
1423      * @param   prefix   the prefix.
1424      * @return  {@code true} if the character sequence represented by the
1425      *          argument is a prefix of the character sequence represented by
1426      *          this string; {@code false} otherwise.
1427      *          Note also that {@code true} will be returned if the
1428      *          argument is an empty string or is equal to this
1429      *          {@code String} object as determined by the
1430      *          {@link #equals(Object)} method.
1431      * @since   1. 0
1432      */
1433     public boolean startsWith(String prefix) {
1434         return startsWith(prefix, 0);
1435     }
1436 
1437     /**
1438      * Tests if this string ends with the specified suffix.
1439      *
1440      * @param   suffix   the suffix.
1441      * @return  {@code true} if the character sequence represented by the
1442      *          argument is a suffix of the character sequence represented by
1443      *          this object; {@code false} otherwise. Note that the
1444      *          result will be {@code true} if the argument is the
1445      *          empty string or is equal to this {@code String} object
1446      *          as determined by the {@link #equals(Object)} method.
1447      */
1448     public boolean endsWith(String suffix) {
1449         return startsWith(suffix, value.length - suffix.value.length);
1450     }
1451 
1452     /**
1453      * Returns a hash code for this string. The hash code for a
1454      * {@code String} object is computed as
1455      * <blockquote><pre>
1456      * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
1457      * </pre></blockquote>
1458      * using {@code int} arithmetic, where {@code s[i]} is the
1459      * <i>i</i>th character of the string, {@code n} is the length of
1460      * the string, and {@code ^} indicates exponentiation.
1461      * (The hash value of the empty string is zero.)
1462      *
1463      * @return  a hash code value for this object.
1464      */
1465     public int hashCode() {
1466         int h = hash;
1467         if (h == 0 && value.length > 0) {
1468             char val[] = value;
1469 
1470             for (int i = 0; i < value.length; i++) {
1471                 h = 31 * h + val[i];
1472             }
1473             hash = h;
1474         }
1475         return h;
1476     }
1477 
1478     /**
1479      * Returns the index within this string of the first occurrence of
1480      * the specified character. If a character with value
1481      * {@code ch} occurs in the character sequence represented by
1482      * this {@code String} object, then the index (in Unicode
1483      * code units) of the first such occurrence is returned. For
1484      * values of {@code ch} in the range from 0 to 0xFFFF
1485      * (inclusive), this is the smallest value <i>k</i> such that:
1486      * <blockquote><pre>
1487      * this.charAt(<i>k</i>) == ch
1488      * </pre></blockquote>
1489      * is true. For other values of {@code ch}, it is the
1490      * smallest value <i>k</i> such that:
1491      * <blockquote><pre>
1492      * this.codePointAt(<i>k</i>) == ch
1493      * </pre></blockquote>
1494      * is true. In either case, if no such character occurs in this
1495      * string, then {@code -1} is returned.
1496      *
1497      * @param   ch   a character (Unicode code point).
1498      * @return  the index of the first occurrence of the character in the
1499      *          character sequence represented by this object, or
1500      *          {@code -1} if the character does not occur.
1501      */
1502     public int indexOf(int ch) {
1503         return indexOf(ch, 0);
1504     }
1505 
1506     /**
1507      * Returns the index within this string of the first occurrence of the
1508      * specified character, starting the search at the specified index.
1509      * <p>
1510      * If a character with value {@code ch} occurs in the
1511      * character sequence represented by this {@code String}
1512      * object at an index no smaller than {@code fromIndex}, then
1513      * the index of the first such occurrence is returned. For values
1514      * of {@code ch} in the range from 0 to 0xFFFF (inclusive),
1515      * this is the smallest value <i>k</i> such that:
1516      * <blockquote><pre>
1517      * (this.charAt(<i>k</i>) == ch) {@code &&} (<i>k</i> &gt;= fromIndex)
1518      * </pre></blockquote>
1519      * is true. For other values of {@code ch}, it is the
1520      * smallest value <i>k</i> such that:
1521      * <blockquote><pre>
1522      * (this.codePointAt(<i>k</i>) == ch) {@code &&} (<i>k</i> &gt;= fromIndex)
1523      * </pre></blockquote>
1524      * is true. In either case, if no such character occurs in this
1525      * string at or after position {@code fromIndex}, then
1526      * {@code -1} is returned.
1527      *
1528      * <p>
1529      * There is no restriction on the value of {@code fromIndex}. If it
1530      * is negative, it has the same effect as if it were zero: this entire
1531      * string may be searched. If it is greater than the length of this
1532      * string, it has the same effect as if it were equal to the length of
1533      * this string: {@code -1} is returned.
1534      *
1535      * <p>All indices are specified in {@code char} values
1536      * (Unicode code units).
1537      *
1538      * @param   ch          a character (Unicode code point).
1539      * @param   fromIndex   the index to start the search from.
1540      * @return  the index of the first occurrence of the character in the
1541      *          character sequence represented by this object that is greater
1542      *          than or equal to {@code fromIndex}, or {@code -1}
1543      *          if the character does not occur.
1544      */
1545     public int indexOf(int ch, int fromIndex) {
1546         final int max = value.length;
1547         if (fromIndex < 0) {
1548             fromIndex = 0;
1549         } else if (fromIndex >= max) {
1550             // Note: fromIndex might be near -1>>>1.
1551             return -1;
1552         }
1553 
1554         if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
1555             // handle most cases here (ch is a BMP code point or a
1556             // negative value (invalid code point))
1557             final char[] value = this.value;
1558             for (int i = fromIndex; i < max; i++) {
1559                 if (value[i] == ch) {
1560                     return i;
1561                 }
1562             }
1563             return -1;
1564         } else {
1565             return indexOfSupplementary(ch, fromIndex);
1566         }
1567     }
1568 
1569     /**
1570      * Handles (rare) calls of indexOf with a supplementary character.
1571      */
1572     private int indexOfSupplementary(int ch, int fromIndex) {
1573         if (Character.isValidCodePoint(ch)) {
1574             final char[] value = this.value;
1575             final char hi = Character.highSurrogate(ch);
1576             final char lo = Character.lowSurrogate(ch);
1577             final int max = value.length - 1;
1578             for (int i = fromIndex; i < max; i++) {
1579                 if (value[i] == hi && value[i + 1] == lo) {
1580                     return i;
1581                 }
1582             }
1583         }
1584         return -1;
1585     }
1586 
1587     /**
1588      * Returns the index within this string of the last occurrence of
1589      * the specified character. For values of {@code ch} in the
1590      * range from 0 to 0xFFFF (inclusive), the index (in Unicode code
1591      * units) returned is the largest value <i>k</i> such that:
1592      * <blockquote><pre>
1593      * this.charAt(<i>k</i>) == ch
1594      * </pre></blockquote>
1595      * is true. For other values of {@code ch}, it is the
1596      * largest value <i>k</i> such that:
1597      * <blockquote><pre>
1598      * this.codePointAt(<i>k</i>) == ch
1599      * </pre></blockquote>
1600      * is true.  In either case, if no such character occurs in this
1601      * string, then {@code -1} is returned.  The
1602      * {@code String} is searched backwards starting at the last
1603      * character.
1604      *
1605      * @param   ch   a character (Unicode code point).
1606      * @return  the index of the last occurrence of the character in the
1607      *          character sequence represented by this object, or
1608      *          {@code -1} if the character does not occur.
1609      */
1610     public int lastIndexOf(int ch) {
1611         return lastIndexOf(ch, value.length - 1);
1612     }
1613 
1614     /**
1615      * Returns the index within this string of the last occurrence of
1616      * the specified character, searching backward starting at the
1617      * specified index. For values of {@code ch} in the range
1618      * from 0 to 0xFFFF (inclusive), the index returned is the largest
1619      * value <i>k</i> such that:
1620      * <blockquote><pre>
1621      * (this.charAt(<i>k</i>) == ch) {@code &&} (<i>k</i> &lt;= fromIndex)
1622      * </pre></blockquote>
1623      * is true. For other values of {@code ch}, it is the
1624      * largest value <i>k</i> such that:
1625      * <blockquote><pre>
1626      * (this.codePointAt(<i>k</i>) == ch) {@code &&} (<i>k</i> &lt;= fromIndex)
1627      * </pre></blockquote>
1628      * is true. In either case, if no such character occurs in this
1629      * string at or before position {@code fromIndex}, then
1630      * {@code -1} is returned.
1631      *
1632      * <p>All indices are specified in {@code char} values
1633      * (Unicode code units).
1634      *
1635      * @param   ch          a character (Unicode code point).
1636      * @param   fromIndex   the index to start the search from. There is no
1637      *          restriction on the value of {@code fromIndex}. If it is
1638      *          greater than or equal to the length of this string, it has
1639      *          the same effect as if it were equal to one less than the
1640      *          length of this string: this entire string may be searched.
1641      *          If it is negative, it has the same effect as if it were -1:
1642      *          -1 is returned.
1643      * @return  the index of the last occurrence of the character in the
1644      *          character sequence represented by this object that is less
1645      *          than or equal to {@code fromIndex}, or {@code -1}
1646      *          if the character does not occur before that point.
1647      */
1648     public int lastIndexOf(int ch, int fromIndex) {
1649         if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
1650             // handle most cases here (ch is a BMP code point or a
1651             // negative value (invalid code point))
1652             final char[] value = this.value;
1653             int i = Math.min(fromIndex, value.length - 1);
1654             for (; i >= 0; i--) {
1655                 if (value[i] == ch) {
1656                     return i;
1657                 }
1658             }
1659             return -1;
1660         } else {
1661             return lastIndexOfSupplementary(ch, fromIndex);
1662         }
1663     }
1664 
1665     /**
1666      * Handles (rare) calls of lastIndexOf with a supplementary character.
1667      */
1668     private int lastIndexOfSupplementary(int ch, int fromIndex) {
1669         if (Character.isValidCodePoint(ch)) {
1670             final char[] value = this.value;
1671             char hi = Character.highSurrogate(ch);
1672             char lo = Character.lowSurrogate(ch);
1673             int i = Math.min(fromIndex, value.length - 2);
1674             for (; i >= 0; i--) {
1675                 if (value[i] == hi && value[i + 1] == lo) {
1676                     return i;
1677                 }
1678             }
1679         }
1680         return -1;
1681     }
1682 
1683     /**
1684      * Returns the index within this string of the first occurrence of the
1685      * specified substring.
1686      *
1687      * <p>The returned index is the smallest value <i>k</i> for which:
1688      * <blockquote><pre>
1689      * this.startsWith(str, <i>k</i>)
1690      * </pre></blockquote>
1691      * If no such value of <i>k</i> exists, then {@code -1} is returned.
1692      *
1693      * @param   str   the substring to search for.
1694      * @return  the index of the first occurrence of the specified substring,
1695      *          or {@code -1} if there is no such occurrence.
1696      */
1697     public int indexOf(String str) {
1698         return indexOf(str, 0);
1699     }
1700 
1701     /**
1702      * Returns the index within this string of the first occurrence of the
1703      * specified substring, starting at the specified index.
1704      *
1705      * <p>The returned index is the smallest value <i>k</i> for which:
1706      * <blockquote><pre>
1707      * <i>k</i> &gt;= fromIndex {@code &&} this.startsWith(str, <i>k</i>)
1708      * </pre></blockquote>
1709      * If no such value of <i>k</i> exists, then {@code -1} is returned.
1710      *
1711      * @param   str         the substring to search for.
1712      * @param   fromIndex   the index from which to start the search.
1713      * @return  the index of the first occurrence of the specified substring,
1714      *          starting at the specified index,
1715      *          or {@code -1} if there is no such occurrence.
1716      */
1717     public int indexOf(String str, int fromIndex) {
1718         return indexOf(value, 0, value.length,
1719                 str.value, 0, str.value.length, fromIndex);
1720     }
1721 
1722     /**
1723      * Code shared by String and AbstractStringBuilder to do searches. The
1724      * source is the character array being searched, and the target
1725      * is the string being searched for.
1726      *
1727      * @param   source       the characters being searched.
1728      * @param   sourceOffset offset of the source string.
1729      * @param   sourceCount  count of the source string.
1730      * @param   target       the characters being searched for.
1731      * @param   fromIndex    the index to begin searching from.
1732      */
1733     static int indexOf(char[] source, int sourceOffset, int sourceCount,
1734             String target, int fromIndex) {
1735         return indexOf(source, sourceOffset, sourceCount,
1736                        target.value, 0, target.value.length,
1737                        fromIndex);
1738     }
1739 
1740     /**
1741      * Code shared by String and StringBuffer to do searches. The
1742      * source is the character array being searched, and the target
1743      * is the string being searched for.
1744      *
1745      * @param   source       the characters being searched.
1746      * @param   sourceOffset offset of the source string.
1747      * @param   sourceCount  count of the source string.
1748      * @param   target       the characters being searched for.
1749      * @param   targetOffset offset of the target string.
1750      * @param   targetCount  count of the target string.
1751      * @param   fromIndex    the index to begin searching from.
1752      */
1753     static int indexOf(char[] source, int sourceOffset, int sourceCount,
1754             char[] target, int targetOffset, int targetCount,
1755             int fromIndex) {
1756         if (fromIndex >= sourceCount) {
1757             return (targetCount == 0 ? sourceCount : -1);
1758         }
1759         if (fromIndex < 0) {
1760             fromIndex = 0;
1761         }
1762         if (targetCount == 0) {
1763             return fromIndex;
1764         }
1765 
1766         char first = target[targetOffset];
1767         int max = sourceOffset + (sourceCount - targetCount);
1768 
1769         for (int i = sourceOffset + fromIndex; i <= max; i++) {
1770             /* Look for first character. */
1771             if (source[i] != first) {
1772                 while (++i <= max && source[i] != first);
1773             }
1774 
1775             /* Found first character, now look at the rest of v2 */
1776             if (i <= max) {
1777                 int j = i + 1;
1778                 int end = j + targetCount - 1;
1779                 for (int k = targetOffset + 1; j < end && source[j]
1780                         == target[k]; j++, k++);
1781 
1782                 if (j == end) {
1783                     /* Found whole string. */
1784                     return i - sourceOffset;
1785                 }
1786             }
1787         }
1788         return -1;
1789     }
1790 
1791     /**
1792      * Returns the index within this string of the last occurrence of the
1793      * specified substring.  The last occurrence of the empty string ""
1794      * is considered to occur at the index value {@code this.length()}.
1795      *
1796      * <p>The returned index is the largest value <i>k</i> for which:
1797      * <blockquote><pre>
1798      * this.startsWith(str, <i>k</i>)
1799      * </pre></blockquote>
1800      * If no such value of <i>k</i> exists, then {@code -1} is returned.
1801      *
1802      * @param   str   the substring to search for.
1803      * @return  the index of the last occurrence of the specified substring,
1804      *          or {@code -1} if there is no such occurrence.
1805      */
1806     public int lastIndexOf(String str) {
1807         return lastIndexOf(str, value.length);
1808     }
1809 
1810     /**
1811      * Returns the index within this string of the last occurrence of the
1812      * specified substring, searching backward starting at the specified index.
1813      *
1814      * <p>The returned index is the largest value <i>k</i> for which:
1815      * <blockquote><pre>
1816      * <i>k</i> {@code <=} fromIndex {@code &&} this.startsWith(str, <i>k</i>)
1817      * </pre></blockquote>
1818      * If no such value of <i>k</i> exists, then {@code -1} is returned.
1819      *
1820      * @param   str         the substring to search for.
1821      * @param   fromIndex   the index to start the search from.
1822      * @return  the index of the last occurrence of the specified substring,
1823      *          searching backward from the specified index,
1824      *          or {@code -1} if there is no such occurrence.
1825      */
1826     public int lastIndexOf(String str, int fromIndex) {
1827         return lastIndexOf(value, 0, value.length,
1828                 str.value, 0, str.value.length, fromIndex);
1829     }
1830 
1831     /**
1832      * Code shared by String and AbstractStringBuilder to do searches. The
1833      * source is the character array being searched, and the target
1834      * is the string being searched for.
1835      *
1836      * @param   source       the characters being searched.
1837      * @param   sourceOffset offset of the source string.
1838      * @param   sourceCount  count of the source string.
1839      * @param   target       the characters being searched for.
1840      * @param   fromIndex    the index to begin searching from.
1841      */
1842     static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,
1843             String target, int fromIndex) {
1844         return lastIndexOf(source, sourceOffset, sourceCount,
1845                        target.value, 0, target.value.length,
1846                        fromIndex);
1847     }
1848 
1849     /**
1850      * Code shared by String and StringBuffer to do searches. The
1851      * source is the character array being searched, and the target
1852      * is the string being searched for.
1853      *
1854      * @param   source       the characters being searched.
1855      * @param   sourceOffset offset of the source string.
1856      * @param   sourceCount  count of the source string.
1857      * @param   target       the characters being searched for.
1858      * @param   targetOffset offset of the target string.
1859      * @param   targetCount  count of the target string.
1860      * @param   fromIndex    the index to begin searching from.
1861      */
1862     static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,
1863             char[] target, int targetOffset, int targetCount,
1864             int fromIndex) {
1865         /*
1866          * Check arguments; return immediately where possible. For
1867          * consistency, don't check for null str.
1868          */
1869         int rightIndex = sourceCount - targetCount;
1870         if (fromIndex < 0) {
1871             return -1;
1872         }
1873         if (fromIndex > rightIndex) {
1874             fromIndex = rightIndex;
1875         }
1876         /* Empty string always matches. */
1877         if (targetCount == 0) {
1878             return fromIndex;
1879         }
1880 
1881         int strLastIndex = targetOffset + targetCount - 1;
1882         char strLastChar = target[strLastIndex];
1883         int min = sourceOffset + targetCount - 1;
1884         int i = min + fromIndex;
1885 
1886     startSearchForLastChar:
1887         while (true) {
1888             while (i >= min && source[i] != strLastChar) {
1889                 i--;
1890             }
1891             if (i < min) {
1892                 return -1;
1893             }
1894             int j = i - 1;
1895             int start = j - (targetCount - 1);
1896             int k = strLastIndex - 1;
1897 
1898             while (j > start) {
1899                 if (source[j--] != target[k--]) {
1900                     i--;
1901                     continue startSearchForLastChar;
1902                 }
1903             }
1904             return start - sourceOffset + 1;
1905         }
1906     }
1907 
1908     /**
1909      * Returns a string that is a substring of this string. The
1910      * substring begins with the character at the specified index and
1911      * extends to the end of this string. <p>
1912      * Examples:
1913      * <blockquote><pre>
1914      * "unhappy".substring(2) returns "happy"
1915      * "Harbison".substring(3) returns "bison"
1916      * "emptiness".substring(9) returns "" (an empty string)
1917      * </pre></blockquote>
1918      *
1919      * @param      beginIndex   the beginning index, inclusive.
1920      * @return     the specified substring.
1921      * @exception  IndexOutOfBoundsException  if
1922      *             {@code beginIndex} is negative or larger than the
1923      *             length of this {@code String} object.
1924      */
1925     public String substring(int beginIndex) {
1926         if (beginIndex < 0) {
1927             throw new StringIndexOutOfBoundsException(beginIndex);
1928         }
1929         int subLen = value.length - beginIndex;
1930         if (subLen < 0) {
1931             throw new StringIndexOutOfBoundsException(subLen);
1932         }
1933         return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
1934     }
1935 
1936     /**
1937      * Returns a string that is a substring of this string. The
1938      * substring begins at the specified {@code beginIndex} and
1939      * extends to the character at index {@code endIndex - 1}.
1940      * Thus the length of the substring is {@code endIndex-beginIndex}.
1941      * <p>
1942      * Examples:
1943      * <blockquote><pre>
1944      * "hamburger".substring(4, 8) returns "urge"
1945      * "smiles".substring(1, 5) returns "mile"
1946      * </pre></blockquote>
1947      *
1948      * @param      beginIndex   the beginning index, inclusive.
1949      * @param      endIndex     the ending index, exclusive.
1950      * @return     the specified substring.
1951      * @exception  IndexOutOfBoundsException  if the
1952      *             {@code beginIndex} is negative, or
1953      *             {@code endIndex} is larger than the length of
1954      *             this {@code String} object, or
1955      *             {@code beginIndex} is larger than
1956      *             {@code endIndex}.
1957      */
1958     public String substring(int beginIndex, int endIndex) {
1959         if (beginIndex < 0) {
1960             throw new StringIndexOutOfBoundsException(beginIndex);
1961         }
1962         if (endIndex > value.length) {
1963             throw new StringIndexOutOfBoundsException(endIndex);
1964         }
1965         int subLen = endIndex - beginIndex;
1966         if (subLen < 0) {
1967             throw new StringIndexOutOfBoundsException(subLen);
1968         }
1969         return ((beginIndex == 0) && (endIndex == value.length)) ? this
1970                 : new String(value, beginIndex, subLen);
1971     }
1972 
1973     /**
1974      * Returns a character sequence that is a subsequence of this sequence.
1975      *
1976      * <p> An invocation of this method of the form
1977      *
1978      * <blockquote><pre>
1979      * str.subSequence(begin,&nbsp;end)</pre></blockquote>
1980      *
1981      * behaves in exactly the same way as the invocation
1982      *
1983      * <blockquote><pre>
1984      * str.substring(begin,&nbsp;end)</pre></blockquote>
1985      *
1986      * @apiNote
1987      * This method is defined so that the {@code String} class can implement
1988      * the {@link CharSequence} interface.
1989      *
1990      * @param   beginIndex   the begin index, inclusive.
1991      * @param   endIndex     the end index, exclusive.
1992      * @return  the specified subsequence.
1993      *
1994      * @throws  IndexOutOfBoundsException
1995      *          if {@code beginIndex} or {@code endIndex} is negative,
1996      *          if {@code endIndex} is greater than {@code length()},
1997      *          or if {@code beginIndex} is greater than {@code endIndex}
1998      *
1999      * @since 1.4
2000      * @spec JSR-51
2001      */
2002     public CharSequence subSequence(int beginIndex, int endIndex) {
2003         return this.substring(beginIndex, endIndex);
2004     }
2005 
2006     /**
2007      * Concatenates the specified string to the end of this string.
2008      * <p>
2009      * If the length of the argument string is {@code 0}, then this
2010      * {@code String} object is returned. Otherwise, a
2011      * {@code String} object is returned that represents a character
2012      * sequence that is the concatenation of the character sequence
2013      * represented by this {@code String} object and the character
2014      * sequence represented by the argument string.<p>
2015      * Examples:
2016      * <blockquote><pre>
2017      * "cares".concat("s") returns "caress"
2018      * "to".concat("get").concat("her") returns "together"
2019      * </pre></blockquote>
2020      *
2021      * @param   str   the {@code String} that is concatenated to the end
2022      *                of this {@code String}.
2023      * @return  a string that represents the concatenation of this object's
2024      *          characters followed by the string argument's characters.
2025      */
2026     public String concat(String str) {
2027         int otherLen = str.length();
2028         if (otherLen == 0) {
2029             return this;
2030         }
2031         int len = value.length;
2032         char buf[] = Arrays.copyOf(value, len + otherLen);
2033         str.getChars(buf, len);
2034         return new String(buf, true);
2035     }
2036 
2037     /**
2038      * Returns a string resulting from replacing all occurrences of
2039      * {@code oldChar} in this string with {@code newChar}.
2040      * <p>
2041      * If the character {@code oldChar} does not occur in the
2042      * character sequence represented by this {@code String} object,
2043      * then a reference to this {@code String} object is returned.
2044      * Otherwise, a {@code String} object is returned that
2045      * represents a character sequence identical to the character sequence
2046      * represented by this {@code String} object, except that every
2047      * occurrence of {@code oldChar} is replaced by an occurrence
2048      * of {@code newChar}.
2049      * <p>
2050      * Examples:
2051      * <blockquote><pre>
2052      * "mesquite in your cellar".replace('e', 'o')
2053      *         returns "mosquito in your collar"
2054      * "the war of baronets".replace('r', 'y')
2055      *         returns "the way of bayonets"
2056      * "sparring with a purple porpoise".replace('p', 't')
2057      *         returns "starring with a turtle tortoise"
2058      * "JonL".replace('q', 'x') returns "JonL" (no change)
2059      * </pre></blockquote>
2060      *
2061      * @param   oldChar   the old character.
2062      * @param   newChar   the new character.
2063      * @return  a string derived from this string by replacing every
2064      *          occurrence of {@code oldChar} with {@code newChar}.
2065      */
2066     public String replace(char oldChar, char newChar) {
2067         if (oldChar != newChar) {
2068             int len = value.length;
2069             int i = -1;
2070             char[] val = value; /* avoid getfield opcode */
2071 
2072             while (++i < len) {
2073                 if (val[i] == oldChar) {
2074                     break;
2075                 }
2076             }
2077             if (i < len) {
2078                 char buf[] = new char[len];
2079                 for (int j = 0; j < i; j++) {
2080                     buf[j] = val[j];
2081                 }
2082                 while (i < len) {
2083                     char c = val[i];
2084                     buf[i] = (c == oldChar) ? newChar : c;
2085                     i++;
2086                 }
2087                 return new String(buf, true);
2088             }
2089         }
2090         return this;
2091     }
2092 
2093     /**
2094      * Tells whether or not this string matches the given <a
2095      * href="../util/regex/Pattern.html#sum">regular expression</a>.
2096      *
2097      * <p> An invocation of this method of the form
2098      * <i>str</i>{@code .matches(}<i>regex</i>{@code )} yields exactly the
2099      * same result as the expression
2100      *
2101      * <blockquote>
2102      * {@link java.util.regex.Pattern}.{@link java.util.regex.Pattern#matches(String,CharSequence)
2103      * matches(<i>regex</i>, <i>str</i>)}
2104      * </blockquote>
2105      *
2106      * @param   regex
2107      *          the regular expression to which this string is to be matched
2108      *
2109      * @return  {@code true} if, and only if, this string matches the
2110      *          given regular expression
2111      *
2112      * @throws  PatternSyntaxException
2113      *          if the regular expression's syntax is invalid
2114      *
2115      * @see java.util.regex.Pattern
2116      *
2117      * @since 1.4
2118      * @spec JSR-51
2119      */
2120     public boolean matches(String regex) {
2121         return Pattern.matches(regex, this);
2122     }
2123 
2124     /**
2125      * Returns true if and only if this string contains the specified
2126      * sequence of char values.
2127      *
2128      * @param s the sequence to search for
2129      * @return true if this string contains {@code s}, false otherwise
2130      * @since 1.5
2131      */
2132     public boolean contains(CharSequence s) {
2133         return indexOf(s.toString()) > -1;
2134     }
2135 
2136     /**
2137      * Replaces the first substring of this string that matches the given <a
2138      * href="../util/regex/Pattern.html#sum">regular expression</a> with the
2139      * given replacement.
2140      *
2141      * <p> An invocation of this method of the form
2142      * <i>str</i>{@code .replaceFirst(}<i>regex</i>{@code ,} <i>repl</i>{@code )}
2143      * yields exactly the same result as the expression
2144      *
2145      * <blockquote>
2146      * <code>
2147      * {@link java.util.regex.Pattern}.{@link
2148      * java.util.regex.Pattern#compile compile}(<i>regex</i>).{@link
2149      * java.util.regex.Pattern#matcher(java.lang.CharSequence) matcher}(<i>str</i>).{@link
2150      * java.util.regex.Matcher#replaceFirst replaceFirst}(<i>repl</i>)
2151      * </code>
2152      * </blockquote>
2153      *
2154      *<p>
2155      * Note that backslashes ({@code \}) and dollar signs ({@code $}) in the
2156      * replacement string may cause the results to be different than if it were
2157      * being treated as a literal replacement string; see
2158      * {@link java.util.regex.Matcher#replaceFirst}.
2159      * Use {@link java.util.regex.Matcher#quoteReplacement} to suppress the special
2160      * meaning of these characters, if desired.
2161      *
2162      * @param   regex
2163      *          the regular expression to which this string is to be matched
2164      * @param   replacement
2165      *          the string to be substituted for the first match
2166      *
2167      * @return  The resulting {@code String}
2168      *
2169      * @throws  PatternSyntaxException
2170      *          if the regular expression's syntax is invalid
2171      *
2172      * @see java.util.regex.Pattern
2173      *
2174      * @since 1.4
2175      * @spec JSR-51
2176      */
2177     public String replaceFirst(String regex, String replacement) {
2178         return Pattern.compile(regex).matcher(this).replaceFirst(replacement);
2179     }
2180 
2181     /**
2182      * Replaces each substring of this string that matches the given <a
2183      * href="../util/regex/Pattern.html#sum">regular expression</a> with the
2184      * given replacement.
2185      *
2186      * <p> An invocation of this method of the form
2187      * <i>str</i>{@code .replaceAll(}<i>regex</i>{@code ,} <i>repl</i>{@code )}
2188      * yields exactly the same result as the expression
2189      *
2190      * <blockquote>
2191      * <code>
2192      * {@link java.util.regex.Pattern}.{@link
2193      * java.util.regex.Pattern#compile compile}(<i>regex</i>).{@link
2194      * java.util.regex.Pattern#matcher(java.lang.CharSequence) matcher}(<i>str</i>).{@link
2195      * java.util.regex.Matcher#replaceAll replaceAll}(<i>repl</i>)
2196      * </code>
2197      * </blockquote>
2198      *
2199      *<p>
2200      * Note that backslashes ({@code \}) and dollar signs ({@code $}) in the
2201      * replacement string may cause the results to be different than if it were
2202      * being treated as a literal replacement string; see
2203      * {@link java.util.regex.Matcher#replaceAll Matcher.replaceAll}.
2204      * Use {@link java.util.regex.Matcher#quoteReplacement} to suppress the special
2205      * meaning of these characters, if desired.
2206      *
2207      * @param   regex
2208      *          the regular expression to which this string is to be matched
2209      * @param   replacement
2210      *          the string to be substituted for each match
2211      *
2212      * @return  The resulting {@code String}
2213      *
2214      * @throws  PatternSyntaxException
2215      *          if the regular expression's syntax is invalid
2216      *
2217      * @see java.util.regex.Pattern
2218      *
2219      * @since 1.4
2220      * @spec JSR-51
2221      */
2222     public String replaceAll(String regex, String replacement) {
2223         return Pattern.compile(regex).matcher(this).replaceAll(replacement);
2224     }
2225 
2226     /**
2227      * Replaces each substring of this string that matches the literal target
2228      * sequence with the specified literal replacement sequence. The
2229      * replacement proceeds from the beginning of the string to the end, for
2230      * example, replacing "aa" with "b" in the string "aaa" will result in
2231      * "ba" rather than "ab".
2232      *
2233      * @param  target The sequence of char values to be replaced
2234      * @param  replacement The replacement sequence of char values
2235      * @return  The resulting string
2236      * @since 1.5
2237      */
2238     public String replace(CharSequence target, CharSequence replacement) {
2239         return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
2240                 this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
2241     }
2242 
2243     /**
2244      * Splits this string around matches of the given
2245      * <a href="../util/regex/Pattern.html#sum">regular expression</a>.
2246      *
2247      * <p> The array returned by this method contains each substring of this
2248      * string that is terminated by another substring that matches the given
2249      * expression or is terminated by the end of the string.  The substrings in
2250      * the array are in the order in which they occur in this string.  If the
2251      * expression does not match any part of the input then the resulting array
2252      * has just one element, namely this string.
2253      *
2254      * <p> When there is a positive-width match at the beginning of this
2255      * string then an empty leading substring is included at the beginning
2256      * of the resulting array. A zero-width match at the beginning however
2257      * never produces such empty leading substring.
2258      *
2259      * <p> The {@code limit} parameter controls the number of times the
2260      * pattern is applied and therefore affects the length of the resulting
2261      * array.  If the limit <i>n</i> is greater than zero then the pattern
2262      * will be applied at most <i>n</i>&nbsp;-&nbsp;1 times, the array's
2263      * length will be no greater than <i>n</i>, and the array's last entry
2264      * will contain all input beyond the last matched delimiter.  If <i>n</i>
2265      * is non-positive then the pattern will be applied as many times as
2266      * possible and the array can have any length.  If <i>n</i> is zero then
2267      * the pattern will be applied as many times as possible, the array can
2268      * have any length, and trailing empty strings will be discarded.
2269      *
2270      * <p> The string {@code "boo:and:foo"}, for example, yields the
2271      * following results with these parameters:
2272      *
2273      * <blockquote><table cellpadding=1 cellspacing=0 summary="Split example showing regex, limit, and result">
2274      * <tr>
2275      *     <th>Regex</th>
2276      *     <th>Limit</th>
2277      *     <th>Result</th>
2278      * </tr>
2279      * <tr><td align=center>:</td>
2280      *     <td align=center>2</td>
2281      *     <td>{@code { "boo", "and:foo" }}</td></tr>
2282      * <tr><td align=center>:</td>
2283      *     <td align=center>5</td>
2284      *     <td>{@code { "boo", "and", "foo" }}</td></tr>
2285      * <tr><td align=center>:</td>
2286      *     <td align=center>-2</td>
2287      *     <td>{@code { "boo", "and", "foo" }}</td></tr>
2288      * <tr><td align=center>o</td>
2289      *     <td align=center>5</td>
2290      *     <td>{@code { "b", "", ":and:f", "", "" }}</td></tr>
2291      * <tr><td align=center>o</td>
2292      *     <td align=center>-2</td>
2293      *     <td>{@code { "b", "", ":and:f", "", "" }}</td></tr>
2294      * <tr><td align=center>o</td>
2295      *     <td align=center>0</td>
2296      *     <td>{@code { "b", "", ":and:f" }}</td></tr>
2297      * </table></blockquote>
2298      *
2299      * <p> An invocation of this method of the form
2300      * <i>str.</i>{@code split(}<i>regex</i>{@code ,}&nbsp;<i>n</i>{@code )}
2301      * yields the same result as the expression
2302      *
2303      * <blockquote>
2304      * <code>
2305      * {@link java.util.regex.Pattern}.{@link
2306      * java.util.regex.Pattern#compile compile}(<i>regex</i>).{@link
2307      * java.util.regex.Pattern#split(java.lang.CharSequence,int) split}(<i>str</i>,&nbsp;<i>n</i>)
2308      * </code>
2309      * </blockquote>
2310      *
2311      *
2312      * @param  regex
2313      *         the delimiting regular expression
2314      *
2315      * @param  limit
2316      *         the result threshold, as described above
2317      *
2318      * @return  the array of strings computed by splitting this string
2319      *          around matches of the given regular expression
2320      *
2321      * @throws  PatternSyntaxException
2322      *          if the regular expression's syntax is invalid
2323      *
2324      * @see java.util.regex.Pattern
2325      *
2326      * @since 1.4
2327      * @spec JSR-51
2328      */
2329     public String[] split(String regex, int limit) {
2330         /* fastpath if the regex is a
2331          (1)one-char String and this character is not one of the
2332             RegEx's meta characters ".$|()[{^?*+\\", or
2333          (2)two-char String and the first char is the backslash and
2334             the second is not the ascii digit or ascii letter.
2335          */
2336         char ch = 0;
2337         if (((regex.value.length == 1 &&
2338              ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||
2339              (regex.length() == 2 &&
2340               regex.charAt(0) == '\\' &&
2341               (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
2342               ((ch-'a')|('z'-ch)) < 0 &&
2343               ((ch-'A')|('Z'-ch)) < 0)) &&
2344             (ch < Character.MIN_HIGH_SURROGATE ||
2345              ch > Character.MAX_LOW_SURROGATE))
2346         {
2347             int off = 0;
2348             int next = 0;
2349             boolean limited = limit > 0;
2350             ArrayList<String> list = new ArrayList<>();
2351             while ((next = indexOf(ch, off)) != -1) {
2352                 if (!limited || list.size() < limit - 1) {
2353                     list.add(substring(off, next));
2354                     off = next + 1;
2355                 } else {    // last one
2356                     //assert (list.size() == limit - 1);
2357                     list.add(substring(off, value.length));
2358                     off = value.length;
2359                     break;
2360                 }
2361             }
2362             // If no match was found, return this
2363             if (off == 0)
2364                 return new String[]{this};
2365 
2366             // Add remaining segment
2367             if (!limited || list.size() < limit)
2368                 list.add(substring(off, value.length));
2369 
2370             // Construct result
2371             int resultSize = list.size();
2372             if (limit == 0) {
2373                 while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {
2374                     resultSize--;
2375                 }
2376             }
2377             String[] result = new String[resultSize];
2378             return list.subList(0, resultSize).toArray(result);
2379         }
2380         return Pattern.compile(regex).split(this, limit);
2381     }
2382 
2383     /**
2384      * Splits this string around matches of the given <a
2385      * href="../util/regex/Pattern.html#sum">regular expression</a>.
2386      *
2387      * <p> This method works as if by invoking the two-argument {@link
2388      * #split(String, int) split} method with the given expression and a limit
2389      * argument of zero.  Trailing empty strings are therefore not included in
2390      * the resulting array.
2391      *
2392      * <p> The string {@code "boo:and:foo"}, for example, yields the following
2393      * results with these expressions:
2394      *
2395      * <blockquote><table cellpadding=1 cellspacing=0 summary="Split examples showing regex and result">
2396      * <tr>
2397      *  <th>Regex</th>
2398      *  <th>Result</th>
2399      * </tr>
2400      * <tr><td align=center>:</td>
2401      *     <td>{@code { "boo", "and", "foo" }}</td></tr>
2402      * <tr><td align=center>o</td>
2403      *     <td>{@code { "b", "", ":and:f" }}</td></tr>
2404      * </table></blockquote>
2405      *
2406      *
2407      * @param  regex
2408      *         the delimiting regular expression
2409      *
2410      * @return  the array of strings computed by splitting this string
2411      *          around matches of the given regular expression
2412      *
2413      * @throws  PatternSyntaxException
2414      *          if the regular expression's syntax is invalid
2415      *
2416      * @see java.util.regex.Pattern
2417      *
2418      * @since 1.4
2419      * @spec JSR-51
2420      */
2421     public String[] split(String regex) {
2422         return split(regex, 0);
2423     }
2424 
2425     /**
2426      * Returns a new String composed of copies of the
2427      * {@code CharSequence elements} joined together with a copy of
2428      * the specified {@code delimiter}.
2429      *
2430      * <blockquote>For example,
2431      * <pre>{@code
2432      *     String message = String.join("-", "Java", "is", "cool");
2433      *     // message returned is: "Java-is-cool"
2434      * }</pre></blockquote>
2435      *
2436      * Note that if an element is null, then {@code "null"} is added.
2437      *
2438      * @param  delimiter the delimiter that separates each element
2439      * @param  elements the elements to join together.
2440      *
2441      * @return a new {@code String} that is composed of the {@code elements}
2442      *         separated by the {@code delimiter}
2443      *
2444      * @throws NullPointerException If {@code delimiter} or {@code elements}
2445      *         is {@code null}
2446      *
2447      * @see java.util.StringJoiner
2448      * @since 1.8
2449      */
2450     public static String join(CharSequence delimiter, CharSequence... elements) {
2451         Objects.requireNonNull(delimiter);
2452         Objects.requireNonNull(elements);
2453         // Number of elements not likely worth Arrays.stream overhead.
2454         StringJoiner joiner = new StringJoiner(delimiter);
2455         for (CharSequence cs: elements) {
2456             joiner.add(cs);
2457         }
2458         return joiner.toString();
2459     }
2460 
2461     /**
2462      * Returns a new {@code String} composed of copies of the
2463      * {@code CharSequence elements} joined together with a copy of the
2464      * specified {@code delimiter}.
2465      *
2466      * <blockquote>For example,
2467      * <pre>{@code
2468      *     List<String> strings = new LinkedList<>();
2469      *     strings.add("Java");strings.add("is");
2470      *     strings.add("cool");
2471      *     String message = String.join(" ", strings);
2472      *     //message returned is: "Java is cool"
2473      *
2474      *     Set<String> strings = new LinkedHashSet<>();
2475      *     strings.add("Java"); strings.add("is");
2476      *     strings.add("very"); strings.add("cool");
2477      *     String message = String.join("-", strings);
2478      *     //message returned is: "Java-is-very-cool"
2479      * }</pre></blockquote>
2480      *
2481      * Note that if an individual element is {@code null}, then {@code "null"} is added.
2482      *
2483      * @param  delimiter a sequence of characters that is used to separate each
2484      *         of the {@code elements} in the resulting {@code String}
2485      * @param  elements an {@code Iterable} that will have its {@code elements}
2486      *         joined together.
2487      *
2488      * @return a new {@code String} that is composed from the {@code elements}
2489      *         argument
2490      *
2491      * @throws NullPointerException If {@code delimiter} or {@code elements}
2492      *         is {@code null}
2493      *
2494      * @see    #join(CharSequence,CharSequence...)
2495      * @see    java.util.StringJoiner
2496      * @since 1.8
2497      */
2498     public static String join(CharSequence delimiter,
2499             Iterable<? extends CharSequence> elements) {
2500         Objects.requireNonNull(delimiter);
2501         Objects.requireNonNull(elements);
2502         StringJoiner joiner = new StringJoiner(delimiter);
2503         for (CharSequence cs: elements) {
2504             joiner.add(cs);
2505         }
2506         return joiner.toString();
2507     }
2508 
2509     /**
2510      * Converts all of the characters in this {@code String} to lower
2511      * case using the rules of the given {@code Locale}.  Case mapping is based
2512      * on the Unicode Standard version specified by the {@link java.lang.Character Character}
2513      * class. Since case mappings are not always 1:1 char mappings, the resulting
2514      * {@code String} may be a different length than the original {@code String}.
2515      * <p>
2516      * Examples of lowercase  mappings are in the following table:
2517      * <table border="1" summary="Lowercase mapping examples showing language code of locale, upper case, lower case, and description">
2518      * <tr>
2519      *   <th>Language Code of Locale</th>
2520      *   <th>Upper Case</th>
2521      *   <th>Lower Case</th>
2522      *   <th>Description</th>
2523      * </tr>
2524      * <tr>
2525      *   <td>tr (Turkish)</td>
2526      *   <td>&#92;u0130</td>
2527      *   <td>&#92;u0069</td>
2528      *   <td>capital letter I with dot above -&gt; small letter i</td>
2529      * </tr>
2530      * <tr>
2531      *   <td>tr (Turkish)</td>
2532      *   <td>&#92;u0049</td>
2533      *   <td>&#92;u0131</td>
2534      *   <td>capital letter I -&gt; small letter dotless i </td>
2535      * </tr>
2536      * <tr>
2537      *   <td>(all)</td>
2538      *   <td>French Fries</td>
2539      *   <td>french fries</td>
2540      *   <td>lowercased all chars in String</td>
2541      * </tr>
2542      * <tr>
2543      *   <td>(all)</td>
2544      *   <td><img src="doc-files/capiota.gif" alt="capiota"><img src="doc-files/capchi.gif" alt="capchi">
2545      *       <img src="doc-files/captheta.gif" alt="captheta"><img src="doc-files/capupsil.gif" alt="capupsil">
2546      *       <img src="doc-files/capsigma.gif" alt="capsigma"></td>
2547      *   <td><img src="doc-files/iota.gif" alt="iota"><img src="doc-files/chi.gif" alt="chi">
2548      *       <img src="doc-files/theta.gif" alt="theta"><img src="doc-files/upsilon.gif" alt="upsilon">
2549      *       <img src="doc-files/sigma1.gif" alt="sigma"></td>
2550      *   <td>lowercased all chars in String</td>
2551      * </tr>
2552      * </table>
2553      *
2554      * @param locale use the case transformation rules for this locale
2555      * @return the {@code String}, converted to lowercase.
2556      * @see     java.lang.String#toLowerCase()
2557      * @see     java.lang.String#toUpperCase()
2558      * @see     java.lang.String#toUpperCase(Locale)
2559      * @since   1.1
2560      */
2561     public String toLowerCase(Locale locale) {
2562         if (locale == null) {
2563             throw new NullPointerException();
2564         }
2565 
2566         int firstUpper;
2567         final int len = value.length;
2568 
2569         /* Now check if there are any characters that need to be changed. */
2570         scan: {
2571             for (firstUpper = 0 ; firstUpper < len; ) {
2572                 char c = value[firstUpper];
2573                 if ((c >= Character.MIN_HIGH_SURROGATE)
2574                         && (c <= Character.MAX_HIGH_SURROGATE)) {
2575                     int supplChar = codePointAt(firstUpper);
2576                     if (supplChar != Character.toLowerCase(supplChar)) {
2577                         break scan;
2578                     }
2579                     firstUpper += Character.charCount(supplChar);
2580                 } else {
2581                     if (c != Character.toLowerCase(c)) {
2582                         break scan;
2583                     }
2584                     firstUpper++;
2585                 }
2586             }
2587             return this;
2588         }
2589 
2590         char[] result = new char[len];
2591         int resultOffset = 0;  /* result may grow, so i+resultOffset
2592                                 * is the write location in result */
2593 
2594         /* Just copy the first few lowerCase characters. */
2595         System.arraycopy(value, 0, result, 0, firstUpper);
2596 
2597         String lang = locale.getLanguage();
2598         boolean localeDependent =
2599                 (lang == "tr" || lang == "az" || lang == "lt");
2600         char[] lowerCharArray;
2601         int lowerChar;
2602         int srcChar;
2603         int srcCount;
2604         for (int i = firstUpper; i < len; i += srcCount) {
2605             srcChar = (int)value[i];
2606             if ((char)srcChar >= Character.MIN_HIGH_SURROGATE
2607                     && (char)srcChar <= Character.MAX_HIGH_SURROGATE) {
2608                 srcChar = codePointAt(i);
2609                 srcCount = Character.charCount(srcChar);
2610             } else {
2611                 srcCount = 1;
2612             }
2613             if (localeDependent ||
2614                 srcChar == '\u03A3' || // GREEK CAPITAL LETTER SIGMA
2615                 srcChar == '\u0130') { // LATIN CAPITAL LETTER I WITH DOT ABOVE
2616                 lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale);
2617             } else {
2618                 lowerChar = Character.toLowerCase(srcChar);
2619             }
2620             if ((lowerChar == Character.ERROR)
2621                     || (lowerChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
2622                 if (lowerChar == Character.ERROR) {
2623                     lowerCharArray =
2624                             ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale);
2625                 } else if (srcCount == 2) {
2626                     resultOffset += Character.toChars(lowerChar, result, i + resultOffset) - srcCount;
2627                     continue;
2628                 } else {
2629                     lowerCharArray = Character.toChars(lowerChar);
2630                 }
2631 
2632                 /* Grow result if needed */
2633                 int mapLen = lowerCharArray.length;
2634                 if (mapLen > srcCount) {
2635                     char[] result2 = new char[result.length + mapLen - srcCount];
2636                     System.arraycopy(result, 0, result2, 0, i + resultOffset);
2637                     result = result2;
2638                 }
2639                 for (int x = 0; x < mapLen; ++x) {
2640                     result[i + resultOffset + x] = lowerCharArray[x];
2641                 }
2642                 resultOffset += (mapLen - srcCount);
2643             } else {
2644                 result[i + resultOffset] = (char)lowerChar;
2645             }
2646         }
2647         return new String(result, 0, len + resultOffset);
2648     }
2649 
2650     /**
2651      * Converts all of the characters in this {@code String} to lower
2652      * case using the rules of the default locale. This is equivalent to calling
2653      * {@code toLowerCase(Locale.getDefault())}.
2654      * <p>
2655      * <b>Note:</b> This method is locale sensitive, and may produce unexpected
2656      * results if used for strings that are intended to be interpreted locale
2657      * independently.
2658      * Examples are programming language identifiers, protocol keys, and HTML
2659      * tags.
2660      * For instance, {@code "TITLE".toLowerCase()} in a Turkish locale
2661      * returns {@code "t\u005Cu0131tle"}, where '\u005Cu0131' is the
2662      * LATIN SMALL LETTER DOTLESS I character.
2663      * To obtain correct results for locale insensitive strings, use
2664      * {@code toLowerCase(Locale.ROOT)}.
2665      * <p>
2666      * @return  the {@code String}, converted to lowercase.
2667      * @see     java.lang.String#toLowerCase(Locale)
2668      */
2669     public String toLowerCase() {
2670         return toLowerCase(Locale.getDefault());
2671     }
2672 
2673     /**
2674      * Converts all of the characters in this {@code String} to upper
2675      * case using the rules of the given {@code Locale}. Case mapping is based
2676      * on the Unicode Standard version specified by the {@link java.lang.Character Character}
2677      * class. Since case mappings are not always 1:1 char mappings, the resulting
2678      * {@code String} may be a different length than the original {@code String}.
2679      * <p>
2680      * Examples of locale-sensitive and 1:M case mappings are in the following table.
2681      *
2682      * <table border="1" summary="Examples of locale-sensitive and 1:M case mappings. Shows Language code of locale, lower case, upper case, and description.">
2683      * <tr>
2684      *   <th>Language Code of Locale</th>
2685      *   <th>Lower Case</th>
2686      *   <th>Upper Case</th>
2687      *   <th>Description</th>
2688      * </tr>
2689      * <tr>
2690      *   <td>tr (Turkish)</td>
2691      *   <td>&#92;u0069</td>
2692      *   <td>&#92;u0130</td>
2693      *   <td>small letter i -&gt; capital letter I with dot above</td>
2694      * </tr>
2695      * <tr>
2696      *   <td>tr (Turkish)</td>
2697      *   <td>&#92;u0131</td>
2698      *   <td>&#92;u0049</td>
2699      *   <td>small letter dotless i -&gt; capital letter I</td>
2700      * </tr>
2701      * <tr>
2702      *   <td>(all)</td>
2703      *   <td>&#92;u00df</td>
2704      *   <td>&#92;u0053 &#92;u0053</td>
2705      *   <td>small letter sharp s -&gt; two letters: SS</td>
2706      * </tr>
2707      * <tr>
2708      *   <td>(all)</td>
2709      *   <td>Fahrvergn&uuml;gen</td>
2710      *   <td>FAHRVERGN&Uuml;GEN</td>
2711      *   <td></td>
2712      * </tr>
2713      * </table>
2714      * @param locale use the case transformation rules for this locale
2715      * @return the {@code String}, converted to uppercase.
2716      * @see     java.lang.String#toUpperCase()
2717      * @see     java.lang.String#toLowerCase()
2718      * @see     java.lang.String#toLowerCase(Locale)
2719      * @since   1.1
2720      */
2721     public String toUpperCase(Locale locale) {
2722         if (locale == null) {
2723             throw new NullPointerException();
2724         }
2725 
2726         int firstLower;
2727         final int len = value.length;
2728 
2729         /* Now check if there are any characters that need to be changed. */
2730         scan: {
2731             for (firstLower = 0 ; firstLower < len; ) {
2732                 int c = (int)value[firstLower];
2733                 int srcCount;
2734                 if ((c >= Character.MIN_HIGH_SURROGATE)
2735                         && (c <= Character.MAX_HIGH_SURROGATE)) {
2736                     c = codePointAt(firstLower);
2737                     srcCount = Character.charCount(c);
2738                 } else {
2739                     srcCount = 1;
2740                 }
2741                 int upperCaseChar = Character.toUpperCaseEx(c);
2742                 if ((upperCaseChar == Character.ERROR)
2743                         || (c != upperCaseChar)) {
2744                     break scan;
2745                 }
2746                 firstLower += srcCount;
2747             }
2748             return this;
2749         }
2750 
2751         /* result may grow, so i+resultOffset is the write location in result */
2752         int resultOffset = 0;
2753         char[] result = new char[len]; /* may grow */
2754 
2755         /* Just copy the first few upperCase characters. */
2756         System.arraycopy(value, 0, result, 0, firstLower);
2757 
2758         String lang = locale.getLanguage();
2759         boolean localeDependent =
2760                 (lang == "tr" || lang == "az" || lang == "lt");
2761         char[] upperCharArray;
2762         int upperChar;
2763         int srcChar;
2764         int srcCount;
2765         for (int i = firstLower; i < len; i += srcCount) {
2766             srcChar = (int)value[i];
2767             if ((char)srcChar >= Character.MIN_HIGH_SURROGATE &&
2768                 (char)srcChar <= Character.MAX_HIGH_SURROGATE) {
2769                 srcChar = codePointAt(i);
2770                 srcCount = Character.charCount(srcChar);
2771             } else {
2772                 srcCount = 1;
2773             }
2774             if (localeDependent) {
2775                 upperChar = ConditionalSpecialCasing.toUpperCaseEx(this, i, locale);
2776             } else {
2777                 upperChar = Character.toUpperCaseEx(srcChar);
2778             }
2779             if ((upperChar == Character.ERROR)
2780                     || (upperChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
2781                 if (upperChar == Character.ERROR) {
2782                     if (localeDependent) {
2783                         upperCharArray =
2784                                 ConditionalSpecialCasing.toUpperCaseCharArray(this, i, locale);
2785                     } else {
2786                         upperCharArray = Character.toUpperCaseCharArray(srcChar);
2787                     }
2788                 } else if (srcCount == 2) {
2789                     resultOffset += Character.toChars(upperChar, result, i + resultOffset) - srcCount;
2790                     continue;
2791                 } else {
2792                     upperCharArray = Character.toChars(upperChar);
2793                 }
2794 
2795                 /* Grow result if needed */
2796                 int mapLen = upperCharArray.length;
2797                 if (mapLen > srcCount) {
2798                     char[] result2 = new char[result.length + mapLen - srcCount];
2799                     System.arraycopy(result, 0, result2, 0, i + resultOffset);
2800                     result = result2;
2801                 }
2802                 for (int x = 0; x < mapLen; ++x) {
2803                     result[i + resultOffset + x] = upperCharArray[x];
2804                 }
2805                 resultOffset += (mapLen - srcCount);
2806             } else {
2807                 result[i + resultOffset] = (char)upperChar;
2808             }
2809         }
2810         return new String(result, 0, len + resultOffset);
2811     }
2812 
2813     /**
2814      * Converts all of the characters in this {@code String} to upper
2815      * case using the rules of the default locale. This method is equivalent to
2816      * {@code toUpperCase(Locale.getDefault())}.
2817      * <p>
2818      * <b>Note:</b> This method is locale sensitive, and may produce unexpected
2819      * results if used for strings that are intended to be interpreted locale
2820      * independently.
2821      * Examples are programming language identifiers, protocol keys, and HTML
2822      * tags.
2823      * For instance, {@code "title".toUpperCase()} in a Turkish locale
2824      * returns {@code "T\u005Cu0130TLE"}, where '\u005Cu0130' is the
2825      * LATIN CAPITAL LETTER I WITH DOT ABOVE character.
2826      * To obtain correct results for locale insensitive strings, use
2827      * {@code toUpperCase(Locale.ROOT)}.
2828      * <p>
2829      * @return  the {@code String}, converted to uppercase.
2830      * @see     java.lang.String#toUpperCase(Locale)
2831      */
2832     public String toUpperCase() {
2833         return toUpperCase(Locale.getDefault());
2834     }
2835 
2836     /**
2837      * Returns a string whose value is this string, with any leading and trailing
2838      * whitespace removed.
2839      * <p>
2840      * If this {@code String} object represents an empty character
2841      * sequence, or the first and last characters of character sequence
2842      * represented by this {@code String} object both have codes
2843      * greater than {@code '\u005Cu0020'} (the space character), then a
2844      * reference to this {@code String} object is returned.
2845      * <p>
2846      * Otherwise, if there is no character with a code greater than
2847      * {@code '\u005Cu0020'} in the string, then a
2848      * {@code String} object representing an empty string is
2849      * returned.
2850      * <p>
2851      * Otherwise, let <i>k</i> be the index of the first character in the
2852      * string whose code is greater than {@code '\u005Cu0020'}, and let
2853      * <i>m</i> be the index of the last character in the string whose code
2854      * is greater than {@code '\u005Cu0020'}. A {@code String}
2855      * object is returned, representing the substring of this string that
2856      * begins with the character at index <i>k</i> and ends with the
2857      * character at index <i>m</i>-that is, the result of
2858      * {@code this.substring(k, m + 1)}.
2859      * <p>
2860      * This method may be used to trim whitespace (as defined above) from
2861      * the beginning and end of a string.
2862      *
2863      * @return  A string whose value is this string, with any leading and trailing white
2864      *          space removed, or this string if it has no leading or
2865      *          trailing white space.
2866      */
2867     public String trim() {
2868         int len = value.length;
2869         int st = 0;
2870         char[] val = value;    /* avoid getfield opcode */
2871 
2872         while ((st < len) && (val[st] <= ' ')) {
2873             st++;
2874         }
2875         while ((st < len) && (val[len - 1] <= ' ')) {
2876             len--;
2877         }
2878         return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
2879     }
2880 
2881     /**
2882      * This object (which is already a string!) is itself returned.
2883      *
2884      * @return  the string itself.
2885      */
2886     public String toString() {
2887         return this;
2888     }
2889 
2890     /**
2891      * Converts this string to a new character array.
2892      *
2893      * @return  a newly allocated character array whose length is the length
2894      *          of this string and whose contents are initialized to contain
2895      *          the character sequence represented by this string.
2896      */
2897     public char[] toCharArray() {
2898         // Cannot use Arrays.copyOf because of class initialization order issues
2899         char result[] = new char[value.length];
2900         System.arraycopy(value, 0, result, 0, value.length);
2901         return result;
2902     }
2903 
2904     /**
2905      * Returns a formatted string using the specified format string and
2906      * arguments.
2907      *
2908      * <p> The locale always used is the one returned by {@link
2909      * java.util.Locale#getDefault() Locale.getDefault()}.
2910      *
2911      * @param  format
2912      *         A <a href="../util/Formatter.html#syntax">format string</a>
2913      *
2914      * @param  args
2915      *         Arguments referenced by the format specifiers in the format
2916      *         string.  If there are more arguments than format specifiers, the
2917      *         extra arguments are ignored.  The number of arguments is
2918      *         variable and may be zero.  The maximum number of arguments is
2919      *         limited by the maximum dimension of a Java array as defined by
2920      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
2921      *         The behaviour on a
2922      *         {@code null} argument depends on the <a
2923      *         href="../util/Formatter.html#syntax">conversion</a>.
2924      *
2925      * @throws  java.util.IllegalFormatException
2926      *          If a format string contains an illegal syntax, a format
2927      *          specifier that is incompatible with the given arguments,
2928      *          insufficient arguments given the format string, or other
2929      *          illegal conditions.  For specification of all possible
2930      *          formatting errors, see the <a
2931      *          href="../util/Formatter.html#detail">Details</a> section of the
2932      *          formatter class specification.
2933      *
2934      * @return  A formatted string
2935      *
2936      * @see  java.util.Formatter
2937      * @since  1.5
2938      */
2939     public static String format(String format, Object... args) {
2940         return new Formatter().format(format, args).toString();
2941     }
2942 
2943     /**
2944      * Returns a formatted string using the specified locale, format string,
2945      * and arguments.
2946      *
2947      * @param  l
2948      *         The {@linkplain java.util.Locale locale} to apply during
2949      *         formatting.  If {@code l} is {@code null} then no localization
2950      *         is applied.
2951      *
2952      * @param  format
2953      *         A <a href="../util/Formatter.html#syntax">format string</a>
2954      *
2955      * @param  args
2956      *         Arguments referenced by the format specifiers in the format
2957      *         string.  If there are more arguments than format specifiers, the
2958      *         extra arguments are ignored.  The number of arguments is
2959      *         variable and may be zero.  The maximum number of arguments is
2960      *         limited by the maximum dimension of a Java array as defined by
2961      *         <cite>The Java&trade; Virtual Machine Specification</cite>.
2962      *         The behaviour on a
2963      *         {@code null} argument depends on the
2964      *         <a href="../util/Formatter.html#syntax">conversion</a>.
2965      *
2966      * @throws  java.util.IllegalFormatException
2967      *          If a format string contains an illegal syntax, a format
2968      *          specifier that is incompatible with the given arguments,
2969      *          insufficient arguments given the format string, or other
2970      *          illegal conditions.  For specification of all possible
2971      *          formatting errors, see the <a
2972      *          href="../util/Formatter.html#detail">Details</a> section of the
2973      *          formatter class specification
2974      *
2975      * @return  A formatted string
2976      *
2977      * @see  java.util.Formatter
2978      * @since  1.5
2979      */
2980     public static String format(Locale l, String format, Object... args) {
2981         return new Formatter(l).format(format, args).toString();
2982     }
2983 
2984     /**
2985      * Returns the string representation of the {@code Object} argument.
2986      *
2987      * @param   obj   an {@code Object}.
2988      * @return  if the argument is {@code null}, then a string equal to
2989      *          {@code "null"}; otherwise, the value of
2990      *          {@code obj.toString()} is returned.
2991      * @see     java.lang.Object#toString()
2992      */
2993     public static String valueOf(Object obj) {
2994         return (obj == null) ? "null" : obj.toString();
2995     }
2996 
2997     /**
2998      * Returns the string representation of the {@code char} array
2999      * argument. The contents of the character array are copied; subsequent
3000      * modification of the character array does not affect the returned
3001      * string.
3002      *
3003      * @param   data     the character array.
3004      * @return  a {@code String} that contains the characters of the
3005      *          character array.
3006      */
3007     public static String valueOf(char data[]) {
3008         return new String(data);
3009     }
3010 
3011     /**
3012      * Returns the string representation of a specific subarray of the
3013      * {@code char} array argument.
3014      * <p>
3015      * The {@code offset} argument is the index of the first
3016      * character of the subarray. The {@code count} argument
3017      * specifies the length of the subarray. The contents of the subarray
3018      * are copied; subsequent modification of the character array does not
3019      * affect the returned string.
3020      *
3021      * @param   data     the character array.
3022      * @param   offset   initial offset of the subarray.
3023      * @param   count    length of the subarray.
3024      * @return  a {@code String} that contains the characters of the
3025      *          specified subarray of the character array.
3026      * @exception IndexOutOfBoundsException if {@code offset} is
3027      *          negative, or {@code count} is negative, or
3028      *          {@code offset+count} is larger than
3029      *          {@code data.length}.
3030      */
3031     public static String valueOf(char data[], int offset, int count) {
3032         return new String(data, offset, count);
3033     }
3034 
3035     /**
3036      * Equivalent to {@link #valueOf(char[], int, int)}.
3037      *
3038      * @param   data     the character array.
3039      * @param   offset   initial offset of the subarray.
3040      * @param   count    length of the subarray.
3041      * @return  a {@code String} that contains the characters of the
3042      *          specified subarray of the character array.
3043      * @exception IndexOutOfBoundsException if {@code offset} is
3044      *          negative, or {@code count} is negative, or
3045      *          {@code offset+count} is larger than
3046      *          {@code data.length}.
3047      */
3048     public static String copyValueOf(char data[], int offset, int count) {
3049         return new String(data, offset, count);
3050     }
3051 
3052     /**
3053      * Equivalent to {@link #valueOf(char[])}.
3054      *
3055      * @param   data   the character array.
3056      * @return  a {@code String} that contains the characters of the
3057      *          character array.
3058      */
3059     public static String copyValueOf(char data[]) {
3060         return new String(data);
3061     }
3062 
3063     /**
3064      * Returns the string representation of the {@code boolean} argument.
3065      *
3066      * @param   b   a {@code boolean}.
3067      * @return  if the argument is {@code true}, a string equal to
3068      *          {@code "true"} is returned; otherwise, a string equal to
3069      *          {@code "false"} is returned.
3070      */
3071     public static String valueOf(boolean b) {
3072         return b ? "true" : "false";
3073     }
3074 
3075     /**
3076      * Returns the string representation of the {@code char}
3077      * argument.
3078      *
3079      * @param   c   a {@code char}.
3080      * @return  a string of length {@code 1} containing
3081      *          as its single character the argument {@code c}.
3082      */
3083     public static String valueOf(char c) {
3084         char data[] = {c};
3085         return new String(data, true);
3086     }
3087 
3088     /**
3089      * Returns the string representation of the {@code int} argument.
3090      * <p>
3091      * The representation is exactly the one returned by the
3092      * {@code Integer.toString} method of one argument.
3093      *
3094      * @param   i   an {@code int}.
3095      * @return  a string representation of the {@code int} argument.
3096      * @see     java.lang.Integer#toString(int, int)
3097      */
3098     public static String valueOf(int i) {
3099         return Integer.toString(i);
3100     }
3101 
3102     /**
3103      * Returns the string representation of the {@code long} argument.
3104      * <p>
3105      * The representation is exactly the one returned by the
3106      * {@code Long.toString} method of one argument.
3107      *
3108      * @param   l   a {@code long}.
3109      * @return  a string representation of the {@code long} argument.
3110      * @see     java.lang.Long#toString(long)
3111      */
3112     public static String valueOf(long l) {
3113         return Long.toString(l);
3114     }
3115 
3116     /**
3117      * Returns the string representation of the {@code float} argument.
3118      * <p>
3119      * The representation is exactly the one returned by the
3120      * {@code Float.toString} method of one argument.
3121      *
3122      * @param   f   a {@code float}.
3123      * @return  a string representation of the {@code float} argument.
3124      * @see     java.lang.Float#toString(float)
3125      */
3126     public static String valueOf(float f) {
3127         return Float.toString(f);
3128     }
3129 
3130     /**
3131      * Returns the string representation of the {@code double} argument.
3132      * <p>
3133      * The representation is exactly the one returned by the
3134      * {@code Double.toString} method of one argument.
3135      *
3136      * @param   d   a {@code double}.
3137      * @return  a  string representation of the {@code double} argument.
3138      * @see     java.lang.Double#toString(double)
3139      */
3140     public static String valueOf(double d) {
3141         return Double.toString(d);
3142     }
3143 
3144     /**
3145      * Returns a canonical representation for the string object.
3146      * <p>
3147      * A pool of strings, initially empty, is maintained privately by the
3148      * class {@code String}.
3149      * <p>
3150      * When the intern method is invoked, if the pool already contains a
3151      * string equal to this {@code String} object as determined by
3152      * the {@link #equals(Object)} method, then the string from the pool is
3153      * returned. Otherwise, this {@code String} object is added to the
3154      * pool and a reference to this {@code String} object is returned.
3155      * <p>
3156      * It follows that for any two strings {@code s} and {@code t},
3157      * {@code s.intern() == t.intern()} is {@code true}
3158      * if and only if {@code s.equals(t)} is {@code true}.
3159      * <p>
3160      * All literal strings and string-valued constant expressions are
3161      * interned. String literals are defined in section 3.10.5 of the
3162      * <cite>The Java&trade; Language Specification</cite>.
3163      *
3164      * @return  a string that has the same contents as this string, but is
3165      *          guaranteed to be from a pool of unique strings.
3166      */
3167     public native String intern();
3168 }
String的代码

    再看一下其中的equals(),我们发现首先是看看是不是同一个对象,这个是和Object中的equals()一样的,否则如果是String类型或者继承该类型(不可能,因为String是final修饰的)的我们就比较,看看这两个字符串中的每一个字符是否相等,如果完全相等,则也返回true,这样就弥补了Object的缺点。

 1     public boolean equals(Object anObject) {
 2         if (this == anObject) {
 3             return true;
 4         }
 5         if (anObject instanceof String) {
 6             String anotherString = (String)anObject;
 7             int n = value.length;
 8             if (n == anotherString.value.length) {
 9                 char v1[] = value;
10                 char v2[] = anotherString.value;
11                 int i = 0;
12                 while (n-- != 0) {
13                     if (v1[i] != v2[i])
14                         return false;
15                     i++;
16                 }
17                 return true;
18             }
19         }
20         return false;
21     }

    下面是一个比较的例子,对于不使用new来产生的对象,其实存在方法区,作为静态常量处理,只有一个,因此比较起来就相等了;对于new创建出来的就直接放到了堆栈区了,创建了两个对象,因此引用不相等,但是值相等

 1 package com.consumer.test;
 2 
 3 public class StringTest {
 4     public static void main(String[] args) {
 5         String i1="这是字符串";
 6         String i2="这是字符串";
 7         String i3=new String("这是字符串");
 8         String i4=new String("这是字符串");
 9 
10         System.out.println("测试:"+(i1==i2));
11         System.out.println("测试:"+(i3==i4));
12         
13         System.out.println("测试"+ (i1.equals(i2)));
14         System.out.println("测试"+ (i3.equals(i4)));
15     }
16 }

   String的valueOf():

1     public static String valueOf(Object obj) {
2         return (obj == null) ? "null" : obj.toString();
3     }
1     public String toString() {
2         return getClass().getName() + "@" + Integer.toHexString(hashCode());
3     }

 2.3、Integer中的equals()

   最后让我们看看Integer中的equals方法,这里就更加的特殊了。

   1 /*
   2  * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
   4  *
   5  *
   6  *
   7  *
   8  *
   9  *
  10  *
  11  *
  12  *
  13  *
  14  *
  15  *
  16  *
  17  *
  18  *
  19  *
  20  *
  21  *
  22  *
  23  *
  24  */
  25 
  26 package java.lang;
  27 
  28 import java.lang.annotation.Native;
  29 
  30 /**
  31  * The {@code Integer} class wraps a value of the primitive type
  32  * {@code int} in an object. An object of type {@code Integer}
  33  * contains a single field whose type is {@code int}.
  34  *
  35  * <p>In addition, this class provides several methods for converting
  36  * an {@code int} to a {@code String} and a {@code String} to an
  37  * {@code int}, as well as other constants and methods useful when
  38  * dealing with an {@code int}.
  39  *
  40  * <p>Implementation note: The implementations of the "bit twiddling"
  41  * methods (such as {@link #highestOneBit(int) highestOneBit} and
  42  * {@link #numberOfTrailingZeros(int) numberOfTrailingZeros}) are
  43  * based on material from Henry S. Warren, Jr.'s <i>Hacker's
  44  * Delight</i>, (Addison Wesley, 2002).
  45  *
  46  * @author  Lee Boynton
  47  * @author  Arthur van Hoff
  48  * @author  Josh Bloch
  49  * @author  Joseph D. Darcy
  50  * @since JDK1.0
  51  */
  52 public final class Integer extends Number implements Comparable<Integer> {
  53     /**
  54      * A constant holding the minimum value an {@code int} can
  55      * have, -2<sup>31</sup>.
  56      */
  57     @Native public static final int   MIN_VALUE = 0x80000000;
  58 
  59     /**
  60      * A constant holding the maximum value an {@code int} can
  61      * have, 2<sup>31</sup>-1.
  62      */
  63     @Native public static final int   MAX_VALUE = 0x7fffffff;
  64 
  65     /**
  66      * The {@code Class} instance representing the primitive type
  67      * {@code int}.
  68      *
  69      * @since   JDK1.1
  70      */
  71     @SuppressWarnings("unchecked")
  72     public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
  73 
  74     /**
  75      * All possible chars for representing a number as a String
  76      */
  77     final static char[] digits = {
  78         '0' , '1' , '2' , '3' , '4' , '5' ,
  79         '6' , '7' , '8' , '9' , 'a' , 'b' ,
  80         'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
  81         'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
  82         'o' , 'p' , 'q' , 'r' , 's' , 't' ,
  83         'u' , 'v' , 'w' , 'x' , 'y' , 'z'
  84     };
  85 
  86     /**
  87      * Returns a string representation of the first argument in the
  88      * radix specified by the second argument.
  89      *
  90      * <p>If the radix is smaller than {@code Character.MIN_RADIX}
  91      * or larger than {@code Character.MAX_RADIX}, then the radix
  92      * {@code 10} is used instead.
  93      *
  94      * <p>If the first argument is negative, the first element of the
  95      * result is the ASCII minus character {@code '-'}
  96      * ({@code '\u005Cu002D'}). If the first argument is not
  97      * negative, no sign character appears in the result.
  98      *
  99      * <p>The remaining characters of the result represent the magnitude
 100      * of the first argument. If the magnitude is zero, it is
 101      * represented by a single zero character {@code '0'}
 102      * ({@code '\u005Cu0030'}); otherwise, the first character of
 103      * the representation of the magnitude will not be the zero
 104      * character.  The following ASCII characters are used as digits:
 105      *
 106      * <blockquote>
 107      *   {@code 0123456789abcdefghijklmnopqrstuvwxyz}
 108      * </blockquote>
 109      *
 110      * These are {@code '\u005Cu0030'} through
 111      * {@code '\u005Cu0039'} and {@code '\u005Cu0061'} through
 112      * {@code '\u005Cu007A'}. If {@code radix} is
 113      * <var>N</var>, then the first <var>N</var> of these characters
 114      * are used as radix-<var>N</var> digits in the order shown. Thus,
 115      * the digits for hexadecimal (radix 16) are
 116      * {@code 0123456789abcdef}. If uppercase letters are
 117      * desired, the {@link java.lang.String#toUpperCase()} method may
 118      * be called on the result:
 119      *
 120      * <blockquote>
 121      *  {@code Integer.toString(n, 16).toUpperCase()}
 122      * </blockquote>
 123      *
 124      * @param   i       an integer to be converted to a string.
 125      * @param   radix   the radix to use in the string representation.
 126      * @return  a string representation of the argument in the specified radix.
 127      * @see     java.lang.Character#MAX_RADIX
 128      * @see     java.lang.Character#MIN_RADIX
 129      */
 130     public static String toString(int i, int radix) {
 131         if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
 132             radix = 10;
 133 
 134         /* Use the faster version */
 135         if (radix == 10) {
 136             return toString(i);
 137         }
 138 
 139         char buf[] = new char[33];
 140         boolean negative = (i < 0);
 141         int charPos = 32;
 142 
 143         if (!negative) {
 144             i = -i;
 145         }
 146 
 147         while (i <= -radix) {
 148             buf[charPos--] = digits[-(i % radix)];
 149             i = i / radix;
 150         }
 151         buf[charPos] = digits[-i];
 152 
 153         if (negative) {
 154             buf[--charPos] = '-';
 155         }
 156 
 157         return new String(buf, charPos, (33 - charPos));
 158     }
 159 
 160     /**
 161      * Returns a string representation of the first argument as an
 162      * unsigned integer value in the radix specified by the second
 163      * argument.
 164      *
 165      * <p>If the radix is smaller than {@code Character.MIN_RADIX}
 166      * or larger than {@code Character.MAX_RADIX}, then the radix
 167      * {@code 10} is used instead.
 168      *
 169      * <p>Note that since the first argument is treated as an unsigned
 170      * value, no leading sign character is printed.
 171      *
 172      * <p>If the magnitude is zero, it is represented by a single zero
 173      * character {@code '0'} ({@code '\u005Cu0030'}); otherwise,
 174      * the first character of the representation of the magnitude will
 175      * not be the zero character.
 176      *
 177      * <p>The behavior of radixes and the characters used as digits
 178      * are the same as {@link #toString(int, int) toString}.
 179      *
 180      * @param   i       an integer to be converted to an unsigned string.
 181      * @param   radix   the radix to use in the string representation.
 182      * @return  an unsigned string representation of the argument in the specified radix.
 183      * @see     #toString(int, int)
 184      * @since 1.8
 185      */
 186     public static String toUnsignedString(int i, int radix) {
 187         return Long.toUnsignedString(toUnsignedLong(i), radix);
 188     }
 189 
 190     /**
 191      * Returns a string representation of the integer argument as an
 192      * unsigned integer in base&nbsp;16.
 193      *
 194      * <p>The unsigned integer value is the argument plus 2<sup>32</sup>
 195      * if the argument is negative; otherwise, it is equal to the
 196      * argument.  This value is converted to a string of ASCII digits
 197      * in hexadecimal (base&nbsp;16) with no extra leading
 198      * {@code 0}s.
 199      *
 200      * <p>The value of the argument can be recovered from the returned
 201      * string {@code s} by calling {@link
 202      * Integer#parseUnsignedInt(String, int)
 203      * Integer.parseUnsignedInt(s, 16)}.
 204      *
 205      * <p>If the unsigned magnitude is zero, it is represented by a
 206      * single zero character {@code '0'} ({@code '\u005Cu0030'});
 207      * otherwise, the first character of the representation of the
 208      * unsigned magnitude will not be the zero character. The
 209      * following characters are used as hexadecimal digits:
 210      *
 211      * <blockquote>
 212      *  {@code 0123456789abcdef}
 213      * </blockquote>
 214      *
 215      * These are the characters {@code '\u005Cu0030'} through
 216      * {@code '\u005Cu0039'} and {@code '\u005Cu0061'} through
 217      * {@code '\u005Cu0066'}. If uppercase letters are
 218      * desired, the {@link java.lang.String#toUpperCase()} method may
 219      * be called on the result:
 220      *
 221      * <blockquote>
 222      *  {@code Integer.toHexString(n).toUpperCase()}
 223      * </blockquote>
 224      *
 225      * @param   i   an integer to be converted to a string.
 226      * @return  the string representation of the unsigned integer value
 227      *          represented by the argument in hexadecimal (base&nbsp;16).
 228      * @see #parseUnsignedInt(String, int)
 229      * @see #toUnsignedString(int, int)
 230      * @since   JDK1.0.2
 231      */
 232     public static String toHexString(int i) {
 233         return toUnsignedString0(i, 4);
 234     }
 235 
 236     /**
 237      * Returns a string representation of the integer argument as an
 238      * unsigned integer in base&nbsp;8.
 239      *
 240      * <p>The unsigned integer value is the argument plus 2<sup>32</sup>
 241      * if the argument is negative; otherwise, it is equal to the
 242      * argument.  This value is converted to a string of ASCII digits
 243      * in octal (base&nbsp;8) with no extra leading {@code 0}s.
 244      *
 245      * <p>The value of the argument can be recovered from the returned
 246      * string {@code s} by calling {@link
 247      * Integer#parseUnsignedInt(String, int)
 248      * Integer.parseUnsignedInt(s, 8)}.
 249      *
 250      * <p>If the unsigned magnitude is zero, it is represented by a
 251      * single zero character {@code '0'} ({@code '\u005Cu0030'});
 252      * otherwise, the first character of the representation of the
 253      * unsigned magnitude will not be the zero character. The
 254      * following characters are used as octal digits:
 255      *
 256      * <blockquote>
 257      * {@code 01234567}
 258      * </blockquote>
 259      *
 260      * These are the characters {@code '\u005Cu0030'} through
 261      * {@code '\u005Cu0037'}.
 262      *
 263      * @param   i   an integer to be converted to a string.
 264      * @return  the string representation of the unsigned integer value
 265      *          represented by the argument in octal (base&nbsp;8).
 266      * @see #parseUnsignedInt(String, int)
 267      * @see #toUnsignedString(int, int)
 268      * @since   JDK1.0.2
 269      */
 270     public static String toOctalString(int i) {
 271         return toUnsignedString0(i, 3);
 272     }
 273 
 274     /**
 275      * Returns a string representation of the integer argument as an
 276      * unsigned integer in base&nbsp;2.
 277      *
 278      * <p>The unsigned integer value is the argument plus 2<sup>32</sup>
 279      * if the argument is negative; otherwise it is equal to the
 280      * argument.  This value is converted to a string of ASCII digits
 281      * in binary (base&nbsp;2) with no extra leading {@code 0}s.
 282      *
 283      * <p>The value of the argument can be recovered from the returned
 284      * string {@code s} by calling {@link
 285      * Integer#parseUnsignedInt(String, int)
 286      * Integer.parseUnsignedInt(s, 2)}.
 287      *
 288      * <p>If the unsigned magnitude is zero, it is represented by a
 289      * single zero character {@code '0'} ({@code '\u005Cu0030'});
 290      * otherwise, the first character of the representation of the
 291      * unsigned magnitude will not be the zero character. The
 292      * characters {@code '0'} ({@code '\u005Cu0030'}) and {@code
 293      * '1'} ({@code '\u005Cu0031'}) are used as binary digits.
 294      *
 295      * @param   i   an integer to be converted to a string.
 296      * @return  the string representation of the unsigned integer value
 297      *          represented by the argument in binary (base&nbsp;2).
 298      * @see #parseUnsignedInt(String, int)
 299      * @see #toUnsignedString(int, int)
 300      * @since   JDK1.0.2
 301      */
 302     public static String toBinaryString(int i) {
 303         return toUnsignedString0(i, 1);
 304     }
 305 
 306     /**
 307      * Convert the integer to an unsigned number.
 308      */
 309     private static String toUnsignedString0(int val, int shift) {
 310         // assert shift > 0 && shift <=5 : "Illegal shift value";
 311         int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
 312         int chars = Math.max(((mag + (shift - 1)) / shift), 1);
 313         char[] buf = new char[chars];
 314 
 315         formatUnsignedInt(val, shift, buf, 0, chars);
 316 
 317         // Use special constructor which takes over "buf".
 318         return new String(buf, true);
 319     }
 320 
 321     /**
 322      * Format a long (treated as unsigned) into a character buffer.
 323      * @param val the unsigned int to format
 324      * @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary)
 325      * @param buf the character buffer to write to
 326      * @param offset the offset in the destination buffer to start at
 327      * @param len the number of characters to write
 328      * @return the lowest character  location used
 329      */
 330      static int formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) {
 331         int charPos = len;
 332         int radix = 1 << shift;
 333         int mask = radix - 1;
 334         do {
 335             buf[offset + --charPos] = Integer.digits[val & mask];
 336             val >>>= shift;
 337         } while (val != 0 && charPos > 0);
 338 
 339         return charPos;
 340     }
 341 
 342     final static char [] DigitTens = {
 343         '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
 344         '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
 345         '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
 346         '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
 347         '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
 348         '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
 349         '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
 350         '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
 351         '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
 352         '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
 353         } ;
 354 
 355     final static char [] DigitOnes = {
 356         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 357         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 358         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 359         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 360         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 361         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 362         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 363         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 364         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 365         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
 366         } ;
 367 
 368         // I use the "invariant division by multiplication" trick to
 369         // accelerate Integer.toString.  In particular we want to
 370         // avoid division by 10.
 371         //
 372         // The "trick" has roughly the same performance characteristics
 373         // as the "classic" Integer.toString code on a non-JIT VM.
 374         // The trick avoids .rem and .div calls but has a longer code
 375         // path and is thus dominated by dispatch overhead.  In the
 376         // JIT case the dispatch overhead doesn't exist and the
 377         // "trick" is considerably faster than the classic code.
 378         //
 379         // TODO-FIXME: convert (x * 52429) into the equiv shift-add
 380         // sequence.
 381         //
 382         // RE:  Division by Invariant Integers using Multiplication
 383         //      T Gralund, P Montgomery
 384         //      ACM PLDI 1994
 385         //
 386 
 387     /**
 388      * Returns a {@code String} object representing the
 389      * specified integer. The argument is converted to signed decimal
 390      * representation and returned as a string, exactly as if the
 391      * argument and radix 10 were given as arguments to the {@link
 392      * #toString(int, int)} method.
 393      *
 394      * @param   i   an integer to be converted.
 395      * @return  a string representation of the argument in base&nbsp;10.
 396      */
 397     public static String toString(int i) {
 398         if (i == Integer.MIN_VALUE)
 399             return "-2147483648";
 400         int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
 401         char[] buf = new char[size];
 402         getChars(i, size, buf);
 403         return new String(buf, true);
 404     }
 405 
 406     /**
 407      * Returns a string representation of the argument as an unsigned
 408      * decimal value.
 409      *
 410      * The argument is converted to unsigned decimal representation
 411      * and returned as a string exactly as if the argument and radix
 412      * 10 were given as arguments to the {@link #toUnsignedString(int,
 413      * int)} method.
 414      *
 415      * @param   i  an integer to be converted to an unsigned string.
 416      * @return  an unsigned string representation of the argument.
 417      * @see     #toUnsignedString(int, int)
 418      * @since 1.8
 419      */
 420     public static String toUnsignedString(int i) {
 421         return Long.toString(toUnsignedLong(i));
 422     }
 423 
 424     /**
 425      * Places characters representing the integer i into the
 426      * character array buf. The characters are placed into
 427      * the buffer backwards starting with the least significant
 428      * digit at the specified index (exclusive), and working
 429      * backwards from there.
 430      *
 431      * Will fail if i == Integer.MIN_VALUE
 432      */
 433     static void getChars(int i, int index, char[] buf) {
 434         int q, r;
 435         int charPos = index;
 436         char sign = 0;
 437 
 438         if (i < 0) {
 439             sign = '-';
 440             i = -i;
 441         }
 442 
 443         // Generate two digits per iteration
 444         while (i >= 65536) {
 445             q = i / 100;
 446         // really: r = i - (q * 100);
 447             r = i - ((q << 6) + (q << 5) + (q << 2));
 448             i = q;
 449             buf [--charPos] = DigitOnes[r];
 450             buf [--charPos] = DigitTens[r];
 451         }
 452 
 453         // Fall thru to fast mode for smaller numbers
 454         // assert(i <= 65536, i);
 455         for (;;) {
 456             q = (i * 52429) >>> (16+3);
 457             r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...
 458             buf [--charPos] = digits [r];
 459             i = q;
 460             if (i == 0) break;
 461         }
 462         if (sign != 0) {
 463             buf [--charPos] = sign;
 464         }
 465     }
 466 
 467     final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
 468                                       99999999, 999999999, Integer.MAX_VALUE };
 469 
 470     // Requires positive x
 471     static int stringSize(int x) {
 472         for (int i=0; ; i++)
 473             if (x <= sizeTable[i])
 474                 return i+1;
 475     }
 476 
 477     /**
 478      * Parses the string argument as a signed integer in the radix
 479      * specified by the second argument. The characters in the string
 480      * must all be digits of the specified radix (as determined by
 481      * whether {@link java.lang.Character#digit(char, int)} returns a
 482      * nonnegative value), except that the first character may be an
 483      * ASCII minus sign {@code '-'} ({@code '\u005Cu002D'}) to
 484      * indicate a negative value or an ASCII plus sign {@code '+'}
 485      * ({@code '\u005Cu002B'}) to indicate a positive value. The
 486      * resulting integer value is returned.
 487      *
 488      * <p>An exception of type {@code NumberFormatException} is
 489      * thrown if any of the following situations occurs:
 490      * <ul>
 491      * <li>The first argument is {@code null} or is a string of
 492      * length zero.
 493      *
 494      * <li>The radix is either smaller than
 495      * {@link java.lang.Character#MIN_RADIX} or
 496      * larger than {@link java.lang.Character#MAX_RADIX}.
 497      *
 498      * <li>Any character of the string is not a digit of the specified
 499      * radix, except that the first character may be a minus sign
 500      * {@code '-'} ({@code '\u005Cu002D'}) or plus sign
 501      * {@code '+'} ({@code '\u005Cu002B'}) provided that the
 502      * string is longer than length 1.
 503      *
 504      * <li>The value represented by the string is not a value of type
 505      * {@code int}.
 506      * </ul>
 507      *
 508      * <p>Examples:
 509      * <blockquote><pre>
 510      * parseInt("0", 10) returns 0
 511      * parseInt("473", 10) returns 473
 512      * parseInt("+42", 10) returns 42
 513      * parseInt("-0", 10) returns 0
 514      * parseInt("-FF", 16) returns -255
 515      * parseInt("1100110", 2) returns 102
 516      * parseInt("2147483647", 10) returns 2147483647
 517      * parseInt("-2147483648", 10) returns -2147483648
 518      * parseInt("2147483648", 10) throws a NumberFormatException
 519      * parseInt("99", 8) throws a NumberFormatException
 520      * parseInt("Kona", 10) throws a NumberFormatException
 521      * parseInt("Kona", 27) returns 411787
 522      * </pre></blockquote>
 523      *
 524      * @param      s   the {@code String} containing the integer
 525      *                  representation to be parsed
 526      * @param      radix   the radix to be used while parsing {@code s}.
 527      * @return     the integer represented by the string argument in the
 528      *             specified radix.
 529      * @exception  NumberFormatException if the {@code String}
 530      *             does not contain a parsable {@code int}.
 531      */
 532     public static int parseInt(String s, int radix)
 533                 throws NumberFormatException
 534     {
 535         /*
 536          * WARNING: This method may be invoked early during VM initialization
 537          * before IntegerCache is initialized. Care must be taken to not use
 538          * the valueOf method.
 539          */
 540 
 541         if (s == null) {
 542             throw new NumberFormatException("null");
 543         }
 544 
 545         if (radix < Character.MIN_RADIX) {
 546             throw new NumberFormatException("radix " + radix +
 547                                             " less than Character.MIN_RADIX");
 548         }
 549 
 550         if (radix > Character.MAX_RADIX) {
 551             throw new NumberFormatException("radix " + radix +
 552                                             " greater than Character.MAX_RADIX");
 553         }
 554 
 555         int result = 0;
 556         boolean negative = false;
 557         int i = 0, len = s.length();
 558         int limit = -Integer.MAX_VALUE;
 559         int multmin;
 560         int digit;
 561 
 562         if (len > 0) {
 563             char firstChar = s.charAt(0);
 564             if (firstChar < '0') { // Possible leading "+" or "-"
 565                 if (firstChar == '-') {
 566                     negative = true;
 567                     limit = Integer.MIN_VALUE;
 568                 } else if (firstChar != '+')
 569                     throw NumberFormatException.forInputString(s);
 570 
 571                 if (len == 1) // Cannot have lone "+" or "-"
 572                     throw NumberFormatException.forInputString(s);
 573                 i++;
 574             }
 575             multmin = limit / radix;
 576             while (i < len) {
 577                 // Accumulating negatively avoids surprises near MAX_VALUE
 578                 digit = Character.digit(s.charAt(i++),radix);
 579                 if (digit < 0) {
 580                     throw NumberFormatException.forInputString(s);
 581                 }
 582                 if (result < multmin) {
 583                     throw NumberFormatException.forInputString(s);
 584                 }
 585                 result *= radix;
 586                 if (result < limit + digit) {
 587                     throw NumberFormatException.forInputString(s);
 588                 }
 589                 result -= digit;
 590             }
 591         } else {
 592             throw NumberFormatException.forInputString(s);
 593         }
 594         return negative ? result : -result;
 595     }
 596 
 597     /**
 598      * Parses the string argument as a signed decimal integer. The
 599      * characters in the string must all be decimal digits, except
 600      * that the first character may be an ASCII minus sign {@code '-'}
 601      * ({@code '\u005Cu002D'}) to indicate a negative value or an
 602      * ASCII plus sign {@code '+'} ({@code '\u005Cu002B'}) to
 603      * indicate a positive value. The resulting integer value is
 604      * returned, exactly as if the argument and the radix 10 were
 605      * given as arguments to the {@link #parseInt(java.lang.String,
 606      * int)} method.
 607      *
 608      * @param s    a {@code String} containing the {@code int}
 609      *             representation to be parsed
 610      * @return     the integer value represented by the argument in decimal.
 611      * @exception  NumberFormatException  if the string does not contain a
 612      *               parsable integer.
 613      */
 614     public static int parseInt(String s) throws NumberFormatException {
 615         return parseInt(s,10);
 616     }
 617 
 618     /**
 619      * Parses the string argument as an unsigned integer in the radix
 620      * specified by the second argument.  An unsigned integer maps the
 621      * values usually associated with negative numbers to positive
 622      * numbers larger than {@code MAX_VALUE}.
 623      *
 624      * The characters in the string must all be digits of the
 625      * specified radix (as determined by whether {@link
 626      * java.lang.Character#digit(char, int)} returns a nonnegative
 627      * value), except that the first character may be an ASCII plus
 628      * sign {@code '+'} ({@code '\u005Cu002B'}). The resulting
 629      * integer value is returned.
 630      *
 631      * <p>An exception of type {@code NumberFormatException} is
 632      * thrown if any of the following situations occurs:
 633      * <ul>
 634      * <li>The first argument is {@code null} or is a string of
 635      * length zero.
 636      *
 637      * <li>The radix is either smaller than
 638      * {@link java.lang.Character#MIN_RADIX} or
 639      * larger than {@link java.lang.Character#MAX_RADIX}.
 640      *
 641      * <li>Any character of the string is not a digit of the specified
 642      * radix, except that the first character may be a plus sign
 643      * {@code '+'} ({@code '\u005Cu002B'}) provided that the
 644      * string is longer than length 1.
 645      *
 646      * <li>The value represented by the string is larger than the
 647      * largest unsigned {@code int}, 2<sup>32</sup>-1.
 648      *
 649      * </ul>
 650      *
 651      *
 652      * @param      s   the {@code String} containing the unsigned integer
 653      *                  representation to be parsed
 654      * @param      radix   the radix to be used while parsing {@code s}.
 655      * @return     the integer represented by the string argument in the
 656      *             specified radix.
 657      * @throws     NumberFormatException if the {@code String}
 658      *             does not contain a parsable {@code int}.
 659      * @since 1.8
 660      */
 661     public static int parseUnsignedInt(String s, int radix)
 662                 throws NumberFormatException {
 663         if (s == null)  {
 664             throw new NumberFormatException("null");
 665         }
 666 
 667         int len = s.length();
 668         if (len > 0) {
 669             char firstChar = s.charAt(0);
 670             if (firstChar == '-') {
 671                 throw new
 672                     NumberFormatException(String.format("Illegal leading minus sign " +
 673                                                        "on unsigned string %s.", s));
 674             } else {
 675                 if (len <= 5 || // Integer.MAX_VALUE in Character.MAX_RADIX is 6 digits
 676                     (radix == 10 && len <= 9) ) { // Integer.MAX_VALUE in base 10 is 10 digits
 677                     return parseInt(s, radix);
 678                 } else {
 679                     long ell = Long.parseLong(s, radix);
 680                     if ((ell & 0xffff_ffff_0000_0000L) == 0) {
 681                         return (int) ell;
 682                     } else {
 683                         throw new
 684                             NumberFormatException(String.format("String value %s exceeds " +
 685                                                                 "range of unsigned int.", s));
 686                     }
 687                 }
 688             }
 689         } else {
 690             throw NumberFormatException.forInputString(s);
 691         }
 692     }
 693 
 694     /**
 695      * Parses the string argument as an unsigned decimal integer. The
 696      * characters in the string must all be decimal digits, except
 697      * that the first character may be an an ASCII plus sign {@code
 698      * '+'} ({@code '\u005Cu002B'}). The resulting integer value
 699      * is returned, exactly as if the argument and the radix 10 were
 700      * given as arguments to the {@link
 701      * #parseUnsignedInt(java.lang.String, int)} method.
 702      *
 703      * @param s   a {@code String} containing the unsigned {@code int}
 704      *            representation to be parsed
 705      * @return    the unsigned integer value represented by the argument in decimal.
 706      * @throws    NumberFormatException  if the string does not contain a
 707      *            parsable unsigned integer.
 708      * @since 1.8
 709      */
 710     public static int parseUnsignedInt(String s) throws NumberFormatException {
 711         return parseUnsignedInt(s, 10);
 712     }
 713 
 714     /**
 715      * Returns an {@code Integer} object holding the value
 716      * extracted from the specified {@code String} when parsed
 717      * with the radix given by the second argument. The first argument
 718      * is interpreted as representing a signed integer in the radix
 719      * specified by the second argument, exactly as if the arguments
 720      * were given to the {@link #parseInt(java.lang.String, int)}
 721      * method. The result is an {@code Integer} object that
 722      * represents the integer value specified by the string.
 723      *
 724      * <p>In other words, this method returns an {@code Integer}
 725      * object equal to the value of:
 726      *
 727      * <blockquote>
 728      *  {@code new Integer(Integer.parseInt(s, radix))}
 729      * </blockquote>
 730      *
 731      * @param      s   the string to be parsed.
 732      * @param      radix the radix to be used in interpreting {@code s}
 733      * @return     an {@code Integer} object holding the value
 734      *             represented by the string argument in the specified
 735      *             radix.
 736      * @exception NumberFormatException if the {@code String}
 737      *            does not contain a parsable {@code int}.
 738      */
 739     public static Integer valueOf(String s, int radix) throws NumberFormatException {
 740         return Integer.valueOf(parseInt(s,radix));
 741     }
 742 
 743     /**
 744      * Returns an {@code Integer} object holding the
 745      * value of the specified {@code String}. The argument is
 746      * interpreted as representing a signed decimal integer, exactly
 747      * as if the argument were given to the {@link
 748      * #parseInt(java.lang.String)} method. The result is an
 749      * {@code Integer} object that represents the integer value
 750      * specified by the string.
 751      *
 752      * <p>In other words, this method returns an {@code Integer}
 753      * object equal to the value of:
 754      *
 755      * <blockquote>
 756      *  {@code new Integer(Integer.parseInt(s))}
 757      * </blockquote>
 758      *
 759      * @param      s   the string to be parsed.
 760      * @return     an {@code Integer} object holding the value
 761      *             represented by the string argument.
 762      * @exception  NumberFormatException  if the string cannot be parsed
 763      *             as an integer.
 764      */
 765     public static Integer valueOf(String s) throws NumberFormatException {
 766         return Integer.valueOf(parseInt(s, 10));
 767     }
 768 
 769     /**
 770      * Cache to support the object identity semantics of autoboxing for values between
 771      * -128 and 127 (inclusive) as required by JLS.
 772      *
 773      * The cache is initialized on first usage.  The size of the cache
 774      * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
 775      * During VM initialization, java.lang.Integer.IntegerCache.high property
 776      * may be set and saved in the private system properties in the
 777      * sun.misc.VM class.
 778      */
 779 
 780     private static class IntegerCache {
 781         static final int low = -128;
 782         static final int high;
 783         static final Integer cache[];
 784 
 785         static {
 786             // high value may be configured by property
 787             int h = 127;
 788             String integerCacheHighPropValue =
 789                 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
 790             if (integerCacheHighPropValue != null) {
 791                 try {
 792                     int i = parseInt(integerCacheHighPropValue);
 793                     i = Math.max(i, 127);
 794                     // Maximum array size is Integer.MAX_VALUE
 795                     h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
 796                 } catch( NumberFormatException nfe) {
 797                     // If the property cannot be parsed into an int, ignore it.
 798                 }
 799             }
 800             high = h;
 801 
 802             cache = new Integer[(high - low) + 1];
 803             int j = low;
 804             for(int k = 0; k < cache.length; k++)
 805                 cache[k] = new Integer(j++);
 806 
 807             // range [-128, 127] must be interned (JLS7 5.1.7)
 808             assert IntegerCache.high >= 127;
 809         }
 810 
 811         private IntegerCache() {}
 812     }
 813 
 814     /**
 815      * Returns an {@code Integer} instance representing the specified
 816      * {@code int} value.  If a new {@code Integer} instance is not
 817      * required, this method should generally be used in preference to
 818      * the constructor {@link #Integer(int)}, as this method is likely
 819      * to yield significantly better space and time performance by
 820      * caching frequently requested values.
 821      *
 822      * This method will always cache values in the range -128 to 127,
 823      * inclusive, and may cache other values outside of this range.
 824      *
 825      * @param  i an {@code int} value.
 826      * @return an {@code Integer} instance representing {@code i}.
 827      * @since  1.5
 828      */
 829     public static Integer valueOf(int i) {
 830         if (i >= IntegerCache.low && i <= IntegerCache.high)
 831             return IntegerCache.cache[i + (-IntegerCache.low)];
 832         return new Integer(i);
 833     }
 834 
 835     /**
 836      * The value of the {@code Integer}.
 837      *
 838      * @serial
 839      */
 840     private final int value;
 841 
 842     /**
 843      * Constructs a newly allocated {@code Integer} object that
 844      * represents the specified {@code int} value.
 845      *
 846      * @param   value   the value to be represented by the
 847      *                  {@code Integer} object.
 848      */
 849     public Integer(int value) {
 850         this.value = value;
 851     }
 852 
 853     /**
 854      * Constructs a newly allocated {@code Integer} object that
 855      * represents the {@code int} value indicated by the
 856      * {@code String} parameter. The string is converted to an
 857      * {@code int} value in exactly the manner used by the
 858      * {@code parseInt} method for radix 10.
 859      *
 860      * @param      s   the {@code String} to be converted to an
 861      *                 {@code Integer}.
 862      * @exception  NumberFormatException  if the {@code String} does not
 863      *               contain a parsable integer.
 864      * @see        java.lang.Integer#parseInt(java.lang.String, int)
 865      */
 866     public Integer(String s) throws NumberFormatException {
 867         this.value = parseInt(s, 10);
 868     }
 869 
 870     /**
 871      * Returns the value of this {@code Integer} as a {@code byte}
 872      * after a narrowing primitive conversion.
 873      * @jls 5.1.3 Narrowing Primitive Conversions
 874      */
 875     public byte byteValue() {
 876         return (byte)value;
 877     }
 878 
 879     /**
 880      * Returns the value of this {@code Integer} as a {@code short}
 881      * after a narrowing primitive conversion.
 882      * @jls 5.1.3 Narrowing Primitive Conversions
 883      */
 884     public short shortValue() {
 885         return (short)value;
 886     }
 887 
 888     /**
 889      * Returns the value of this {@code Integer} as an
 890      * {@code int}.
 891      */
 892     public int intValue() {
 893         return value;
 894     }
 895 
 896     /**
 897      * Returns the value of this {@code Integer} as a {@code long}
 898      * after a widening primitive conversion.
 899      * @jls 5.1.2 Widening Primitive Conversions
 900      * @see Integer#toUnsignedLong(int)
 901      */
 902     public long longValue() {
 903         return (long)value;
 904     }
 905 
 906     /**
 907      * Returns the value of this {@code Integer} as a {@code float}
 908      * after a widening primitive conversion.
 909      * @jls 5.1.2 Widening Primitive Conversions
 910      */
 911     public float floatValue() {
 912         return (float)value;
 913     }
 914 
 915     /**
 916      * Returns the value of this {@code Integer} as a {@code double}
 917      * after a widening primitive conversion.
 918      * @jls 5.1.2 Widening Primitive Conversions
 919      */
 920     public double doubleValue() {
 921         return (double)value;
 922     }
 923 
 924     /**
 925      * Returns a {@code String} object representing this
 926      * {@code Integer}'s value. The value is converted to signed
 927      * decimal representation and returned as a string, exactly as if
 928      * the integer value were given as an argument to the {@link
 929      * java.lang.Integer#toString(int)} method.
 930      *
 931      * @return  a string representation of the value of this object in
 932      *          base&nbsp;10.
 933      */
 934     public String toString() {
 935         return toString(value);
 936     }
 937 
 938     /**
 939      * Returns a hash code for this {@code Integer}.
 940      *
 941      * @return  a hash code value for this object, equal to the
 942      *          primitive {@code int} value represented by this
 943      *          {@code Integer} object.
 944      */
 945     @Override
 946     public int hashCode() {
 947         return Integer.hashCode(value);
 948     }
 949 
 950     /**
 951      * Returns a hash code for a {@code int} value; compatible with
 952      * {@code Integer.hashCode()}.
 953      *
 954      * @param value the value to hash
 955      * @since 1.8
 956      *
 957      * @return a hash code value for a {@code int} value.
 958      */
 959     public static int hashCode(int value) {
 960         return value;
 961     }
 962 
 963     /**
 964      * Compares this object to the specified object.  The result is
 965      * {@code true} if and only if the argument is not
 966      * {@code null} and is an {@code Integer} object that
 967      * contains the same {@code int} value as this object.
 968      *
 969      * @param   obj   the object to compare with.
 970      * @return  {@code true} if the objects are the same;
 971      *          {@code false} otherwise.
 972      */
 973     public boolean equals(Object obj) {
 974         if (obj instanceof Integer) {
 975             return value == ((Integer)obj).intValue();
 976         }
 977         return false;
 978     }
 979 
 980     /**
 981      * Determines the integer value of the system property with the
 982      * specified name.
 983      *
 984      * <p>The first argument is treated as the name of a system
 985      * property.  System properties are accessible through the {@link
 986      * java.lang.System#getProperty(java.lang.String)} method. The
 987      * string value of this property is then interpreted as an integer
 988      * value using the grammar supported by {@link Integer#decode decode} and
 989      * an {@code Integer} object representing this value is returned.
 990      *
 991      * <p>If there is no property with the specified name, if the
 992      * specified name is empty or {@code null}, or if the property
 993      * does not have the correct numeric format, then {@code null} is
 994      * returned.
 995      *
 996      * <p>In other words, this method returns an {@code Integer}
 997      * object equal to the value of:
 998      *
 999      * <blockquote>
1000      *  {@code getInteger(nm, null)}
1001      * </blockquote>
1002      *
1003      * @param   nm   property name.
1004      * @return  the {@code Integer} value of the property.
1005      * @throws  SecurityException for the same reasons as
1006      *          {@link System#getProperty(String) System.getProperty}
1007      * @see     java.lang.System#getProperty(java.lang.String)
1008      * @see     java.lang.System#getProperty(java.lang.String, java.lang.String)
1009      */
1010     public static Integer getInteger(String nm) {
1011         return getInteger(nm, null);
1012     }
1013 
1014     /**
1015      * Determines the integer value of the system property with the
1016      * specified name.
1017      *
1018      * <p>The first argument is treated as the name of a system
1019      * property.  System properties are accessible through the {@link
1020      * java.lang.System#getProperty(java.lang.String)} method. The
1021      * string value of this property is then interpreted as an integer
1022      * value using the grammar supported by {@link Integer#decode decode} and
1023      * an {@code Integer} object representing this value is returned.
1024      *
1025      * <p>The second argument is the default value. An {@code Integer} object
1026      * that represents the value of the second argument is returned if there
1027      * is no property of the specified name, if the property does not have
1028      * the correct numeric format, or if the specified name is empty or
1029      * {@code null}.
1030      *
1031      * <p>In other words, this method returns an {@code Integer} object
1032      * equal to the value of:
1033      *
1034      * <blockquote>
1035      *  {@code getInteger(nm, new Integer(val))}
1036      * </blockquote>
1037      *
1038      * but in practice it may be implemented in a manner such as:
1039      *
1040      * <blockquote><pre>
1041      * Integer result = getInteger(nm, null);
1042      * return (result == null) ? new Integer(val) : result;
1043      * </pre></blockquote>
1044      *
1045      * to avoid the unnecessary allocation of an {@code Integer}
1046      * object when the default value is not needed.
1047      *
1048      * @param   nm   property name.
1049      * @param   val   default value.
1050      * @return  the {@code Integer} value of the property.
1051      * @throws  SecurityException for the same reasons as
1052      *          {@link System#getProperty(String) System.getProperty}
1053      * @see     java.lang.System#getProperty(java.lang.String)
1054      * @see     java.lang.System#getProperty(java.lang.String, java.lang.String)
1055      */
1056     public static Integer getInteger(String nm, int val) {
1057         Integer result = getInteger(nm, null);
1058         return (result == null) ? Integer.valueOf(val) : result;
1059     }
1060 
1061     /**
1062      * Returns the integer value of the system property with the
1063      * specified name.  The first argument is treated as the name of a
1064      * system property.  System properties are accessible through the
1065      * {@link java.lang.System#getProperty(java.lang.String)} method.
1066      * The string value of this property is then interpreted as an
1067      * integer value, as per the {@link Integer#decode decode} method,
1068      * and an {@code Integer} object representing this value is
1069      * returned; in summary:
1070      *
1071      * <ul><li>If the property value begins with the two ASCII characters
1072      *         {@code 0x} or the ASCII character {@code #}, not
1073      *      followed by a minus sign, then the rest of it is parsed as a
1074      *      hexadecimal integer exactly as by the method
1075      *      {@link #valueOf(java.lang.String, int)} with radix 16.
1076      * <li>If the property value begins with the ASCII character
1077      *     {@code 0} followed by another character, it is parsed as an
1078      *     octal integer exactly as by the method
1079      *     {@link #valueOf(java.lang.String, int)} with radix 8.
1080      * <li>Otherwise, the property value is parsed as a decimal integer
1081      * exactly as by the method {@link #valueOf(java.lang.String, int)}
1082      * with radix 10.
1083      * </ul>
1084      *
1085      * <p>The second argument is the default value. The default value is
1086      * returned if there is no property of the specified name, if the
1087      * property does not have the correct numeric format, or if the
1088      * specified name is empty or {@code null}.
1089      *
1090      * @param   nm   property name.
1091      * @param   val   default value.
1092      * @return  the {@code Integer} value of the property.
1093      * @throws  SecurityException for the same reasons as
1094      *          {@link System#getProperty(String) System.getProperty}
1095      * @see     System#getProperty(java.lang.String)
1096      * @see     System#getProperty(java.lang.String, java.lang.String)
1097      */
1098     public static Integer getInteger(String nm, Integer val) {
1099         String v = null;
1100         try {
1101             v = System.getProperty(nm);
1102         } catch (IllegalArgumentException | NullPointerException e) {
1103         }
1104         if (v != null) {
1105             try {
1106                 return Integer.decode(v);
1107             } catch (NumberFormatException e) {
1108             }
1109         }
1110         return val;
1111     }
1112 
1113     /**
1114      * Decodes a {@code String} into an {@code Integer}.
1115      * Accepts decimal, hexadecimal, and octal numbers given
1116      * by the following grammar:
1117      *
1118      * <blockquote>
1119      * <dl>
1120      * <dt><i>DecodableString:</i>
1121      * <dd><i>Sign<sub>opt</sub> DecimalNumeral</i>
1122      * <dd><i>Sign<sub>opt</sub></i> {@code 0x} <i>HexDigits</i>
1123      * <dd><i>Sign<sub>opt</sub></i> {@code 0X} <i>HexDigits</i>
1124      * <dd><i>Sign<sub>opt</sub></i> {@code #} <i>HexDigits</i>
1125      * <dd><i>Sign<sub>opt</sub></i> {@code 0} <i>OctalDigits</i>
1126      *
1127      * <dt><i>Sign:</i>
1128      * <dd>{@code -}
1129      * <dd>{@code +}
1130      * </dl>
1131      * </blockquote>
1132      *
1133      * <i>DecimalNumeral</i>, <i>HexDigits</i>, and <i>OctalDigits</i>
1134      * are as defined in section 3.10.1 of
1135      * <cite>The Java&trade; Language Specification</cite>,
1136      * except that underscores are not accepted between digits.
1137      *
1138      * <p>The sequence of characters following an optional
1139      * sign and/or radix specifier ("{@code 0x}", "{@code 0X}",
1140      * "{@code #}", or leading zero) is parsed as by the {@code
1141      * Integer.parseInt} method with the indicated radix (10, 16, or
1142      * 8).  This sequence of characters must represent a positive
1143      * value or a {@link NumberFormatException} will be thrown.  The
1144      * result is negated if first character of the specified {@code
1145      * String} is the minus sign.  No whitespace characters are
1146      * permitted in the {@code String}.
1147      *
1148      * @param     nm the {@code String} to decode.
1149      * @return    an {@code Integer} object holding the {@code int}
1150      *             value represented by {@code nm}
1151      * @exception NumberFormatException  if the {@code String} does not
1152      *            contain a parsable integer.
1153      * @see java.lang.Integer#parseInt(java.lang.String, int)
1154      */
1155     public static Integer decode(String nm) throws NumberFormatException {
1156         int radix = 10;
1157         int index = 0;
1158         boolean negative = false;
1159         Integer result;
1160 
1161         if (nm.length() == 0)
1162             throw new NumberFormatException("Zero length string");
1163         char firstChar = nm.charAt(0);
1164         // Handle sign, if present
1165         if (firstChar == '-') {
1166             negative = true;
1167             index++;
1168         } else if (firstChar == '+')
1169             index++;
1170 
1171         // Handle radix specifier, if present
1172         if (nm.startsWith("0x", index) || nm.startsWith("0X", index)) {
1173             index += 2;
1174             radix = 16;
1175         }
1176         else if (nm.startsWith("#", index)) {
1177             index ++;
1178             radix = 16;
1179         }
1180         else if (nm.startsWith("0", index) && nm.length() > 1 + index) {
1181             index ++;
1182             radix = 8;
1183         }
1184 
1185         if (nm.startsWith("-", index) || nm.startsWith("+", index))
1186             throw new NumberFormatException("Sign character in wrong position");
1187 
1188         try {
1189             result = Integer.valueOf(nm.substring(index), radix);
1190             result = negative ? Integer.valueOf(-result.intValue()) : result;
1191         } catch (NumberFormatException e) {
1192             // If number is Integer.MIN_VALUE, we'll end up here. The next line
1193             // handles this case, and causes any genuine format error to be
1194             // rethrown.
1195             String constant = negative ? ("-" + nm.substring(index))
1196                                        : nm.substring(index);
1197             result = Integer.valueOf(constant, radix);
1198         }
1199         return result;
1200     }
1201 
1202     /**
1203      * Compares two {@code Integer} objects numerically.
1204      *
1205      * @param   anotherInteger   the {@code Integer} to be compared.
1206      * @return  the value {@code 0} if this {@code Integer} is
1207      *          equal to the argument {@code Integer}; a value less than
1208      *          {@code 0} if this {@code Integer} is numerically less
1209      *          than the argument {@code Integer}; and a value greater
1210      *          than {@code 0} if this {@code Integer} is numerically
1211      *           greater than the argument {@code Integer} (signed
1212      *           comparison).
1213      * @since   1.2
1214      */
1215     public int compareTo(Integer anotherInteger) {
1216         return compare(this.value, anotherInteger.value);
1217     }
1218 
1219     /**
1220      * Compares two {@code int} values numerically.
1221      * The value returned is identical to what would be returned by:
1222      * <pre>
1223      *    Integer.valueOf(x).compareTo(Integer.valueOf(y))
1224      * </pre>
1225      *
1226      * @param  x the first {@code int} to compare
1227      * @param  y the second {@code int} to compare
1228      * @return the value {@code 0} if {@code x == y};
1229      *         a value less than {@code 0} if {@code x < y}; and
1230      *         a value greater than {@code 0} if {@code x > y}
1231      * @since 1.7
1232      */
1233     public static int compare(int x, int y) {
1234         return (x < y) ? -1 : ((x == y) ? 0 : 1);
1235     }
1236 
1237     /**
1238      * Compares two {@code int} values numerically treating the values
1239      * as unsigned.
1240      *
1241      * @param  x the first {@code int} to compare
1242      * @param  y the second {@code int} to compare
1243      * @return the value {@code 0} if {@code x == y}; a value less
1244      *         than {@code 0} if {@code x < y} as unsigned values; and
1245      *         a value greater than {@code 0} if {@code x > y} as
1246      *         unsigned values
1247      * @since 1.8
1248      */
1249     public static int compareUnsigned(int x, int y) {
1250         return compare(x + MIN_VALUE, y + MIN_VALUE);
1251     }
1252 
1253     /**
1254      * Converts the argument to a {@code long} by an unsigned
1255      * conversion.  In an unsigned conversion to a {@code long}, the
1256      * high-order 32 bits of the {@code long} are zero and the
1257      * low-order 32 bits are equal to the bits of the integer
1258      * argument.
1259      *
1260      * Consequently, zero and positive {@code int} values are mapped
1261      * to a numerically equal {@code long} value and negative {@code
1262      * int} values are mapped to a {@code long} value equal to the
1263      * input plus 2<sup>32</sup>.
1264      *
1265      * @param  x the value to convert to an unsigned {@code long}
1266      * @return the argument converted to {@code long} by an unsigned
1267      *         conversion
1268      * @since 1.8
1269      */
1270     public static long toUnsignedLong(int x) {
1271         return ((long) x) & 0xffffffffL;
1272     }
1273 
1274     /**
1275      * Returns the unsigned quotient of dividing the first argument by
1276      * the second where each argument and the result is interpreted as
1277      * an unsigned value.
1278      *
1279      * <p>Note that in two's complement arithmetic, the three other
1280      * basic arithmetic operations of add, subtract, and multiply are
1281      * bit-wise identical if the two operands are regarded as both
1282      * being signed or both being unsigned.  Therefore separate {@code
1283      * addUnsigned}, etc. methods are not provided.
1284      *
1285      * @param dividend the value to be divided
1286      * @param divisor the value doing the dividing
1287      * @return the unsigned quotient of the first argument divided by
1288      * the second argument
1289      * @see #remainderUnsigned
1290      * @since 1.8
1291      */
1292     public static int divideUnsigned(int dividend, int divisor) {
1293         // In lieu of tricky code, for now just use long arithmetic.
1294         return (int)(toUnsignedLong(dividend) / toUnsignedLong(divisor));
1295     }
1296 
1297     /**
1298      * Returns the unsigned remainder from dividing the first argument
1299      * by the second where each argument and the result is interpreted
1300      * as an unsigned value.
1301      *
1302      * @param dividend the value to be divided
1303      * @param divisor the value doing the dividing
1304      * @return the unsigned remainder of the first argument divided by
1305      * the second argument
1306      * @see #divideUnsigned
1307      * @since 1.8
1308      */
1309     public static int remainderUnsigned(int dividend, int divisor) {
1310         // In lieu of tricky code, for now just use long arithmetic.
1311         return (int)(toUnsignedLong(dividend) % toUnsignedLong(divisor));
1312     }
1313 
1314 
1315     // Bit twiddling
1316 
1317     /**
1318      * The number of bits used to represent an {@code int} value in two's
1319      * complement binary form.
1320      *
1321      * @since 1.5
1322      */
1323     @Native public static final int SIZE = 32;
1324 
1325     /**
1326      * The number of bytes used to represent a {@code int} value in two's
1327      * complement binary form.
1328      *
1329      * @since 1.8
1330      */
1331     public static final int BYTES = SIZE / Byte.SIZE;
1332 
1333     /**
1334      * Returns an {@code int} value with at most a single one-bit, in the
1335      * position of the highest-order ("leftmost") one-bit in the specified
1336      * {@code int} value.  Returns zero if the specified value has no
1337      * one-bits in its two's complement binary representation, that is, if it
1338      * is equal to zero.
1339      *
1340      * @param i the value whose highest one bit is to be computed
1341      * @return an {@code int} value with a single one-bit, in the position
1342      *     of the highest-order one-bit in the specified value, or zero if
1343      *     the specified value is itself equal to zero.
1344      * @since 1.5
1345      */
1346     public static int highestOneBit(int i) {
1347         // HD, Figure 3-1
1348         i |= (i >>  1);
1349         i |= (i >>  2);
1350         i |= (i >>  4);
1351         i |= (i >>  8);
1352         i |= (i >> 16);
1353         return i - (i >>> 1);
1354     }
1355 
1356     /**
1357      * Returns an {@code int} value with at most a single one-bit, in the
1358      * position of the lowest-order ("rightmost") one-bit in the specified
1359      * {@code int} value.  Returns zero if the specified value has no
1360      * one-bits in its two's complement binary representation, that is, if it
1361      * is equal to zero.
1362      *
1363      * @param i the value whose lowest one bit is to be computed
1364      * @return an {@code int} value with a single one-bit, in the position
1365      *     of the lowest-order one-bit in the specified value, or zero if
1366      *     the specified value is itself equal to zero.
1367      * @since 1.5
1368      */
1369     public static int lowestOneBit(int i) {
1370         // HD, Section 2-1
1371         return i & -i;
1372     }
1373 
1374     /**
1375      * Returns the number of zero bits preceding the highest-order
1376      * ("leftmost") one-bit in the two's complement binary representation
1377      * of the specified {@code int} value.  Returns 32 if the
1378      * specified value has no one-bits in its two's complement representation,
1379      * in other words if it is equal to zero.
1380      *
1381      * <p>Note that this method is closely related to the logarithm base 2.
1382      * For all positive {@code int} values x:
1383      * <ul>
1384      * <li>floor(log<sub>2</sub>(x)) = {@code 31 - numberOfLeadingZeros(x)}
1385      * <li>ceil(log<sub>2</sub>(x)) = {@code 32 - numberOfLeadingZeros(x - 1)}
1386      * </ul>
1387      *
1388      * @param i the value whose number of leading zeros is to be computed
1389      * @return the number of zero bits preceding the highest-order
1390      *     ("leftmost") one-bit in the two's complement binary representation
1391      *     of the specified {@code int} value, or 32 if the value
1392      *     is equal to zero.
1393      * @since 1.5
1394      */
1395     public static int numberOfLeadingZeros(int i) {
1396         // HD, Figure 5-6
1397         if (i == 0)
1398             return 32;
1399         int n = 1;
1400         if (i >>> 16 == 0) { n += 16; i <<= 16; }
1401         if (i >>> 24 == 0) { n +=  8; i <<=  8; }
1402         if (i >>> 28 == 0) { n +=  4; i <<=  4; }
1403         if (i >>> 30 == 0) { n +=  2; i <<=  2; }
1404         n -= i >>> 31;
1405         return n;
1406     }
1407 
1408     /**
1409      * Returns the number of zero bits following the lowest-order ("rightmost")
1410      * one-bit in the two's complement binary representation of the specified
1411      * {@code int} value.  Returns 32 if the specified value has no
1412      * one-bits in its two's complement representation, in other words if it is
1413      * equal to zero.
1414      *
1415      * @param i the value whose number of trailing zeros is to be computed
1416      * @return the number of zero bits following the lowest-order ("rightmost")
1417      *     one-bit in the two's complement binary representation of the
1418      *     specified {@code int} value, or 32 if the value is equal
1419      *     to zero.
1420      * @since 1.5
1421      */
1422     public static int numberOfTrailingZeros(int i) {
1423         // HD, Figure 5-14
1424         int y;
1425         if (i == 0) return 32;
1426         int n = 31;
1427         y = i <<16; if (y != 0) { n = n -16; i = y; }
1428         y = i << 8; if (y != 0) { n = n - 8; i = y; }
1429         y = i << 4; if (y != 0) { n = n - 4; i = y; }
1430         y = i << 2; if (y != 0) { n = n - 2; i = y; }
1431         return n - ((i << 1) >>> 31);
1432     }
1433 
1434     /**
1435      * Returns the number of one-bits in the two's complement binary
1436      * representation of the specified {@code int} value.  This function is
1437      * sometimes referred to as the <i>population count</i>.
1438      *
1439      * @param i the value whose bits are to be counted
1440      * @return the number of one-bits in the two's complement binary
1441      *     representation of the specified {@code int} value.
1442      * @since 1.5
1443      */
1444     public static int bitCount(int i) {
1445         // HD, Figure 5-2
1446         i = i - ((i >>> 1) & 0x55555555);
1447         i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
1448         i = (i + (i >>> 4)) & 0x0f0f0f0f;
1449         i = i + (i >>> 8);
1450         i = i + (i >>> 16);
1451         return i & 0x3f;
1452     }
1453 
1454     /**
1455      * Returns the value obtained by rotating the two's complement binary
1456      * representation of the specified {@code int} value left by the
1457      * specified number of bits.  (Bits shifted out of the left hand, or
1458      * high-order, side reenter on the right, or low-order.)
1459      *
1460      * <p>Note that left rotation with a negative distance is equivalent to
1461      * right rotation: {@code rotateLeft(val, -distance) == rotateRight(val,
1462      * distance)}.  Note also that rotation by any multiple of 32 is a
1463      * no-op, so all but the last five bits of the rotation distance can be
1464      * ignored, even if the distance is negative: {@code rotateLeft(val,
1465      * distance) == rotateLeft(val, distance & 0x1F)}.
1466      *
1467      * @param i the value whose bits are to be rotated left
1468      * @param distance the number of bit positions to rotate left
1469      * @return the value obtained by rotating the two's complement binary
1470      *     representation of the specified {@code int} value left by the
1471      *     specified number of bits.
1472      * @since 1.5
1473      */
1474     public static int rotateLeft(int i, int distance) {
1475         return (i << distance) | (i >>> -distance);
1476     }
1477 
1478     /**
1479      * Returns the value obtained by rotating the two's complement binary
1480      * representation of the specified {@code int} value right by the
1481      * specified number of bits.  (Bits shifted out of the right hand, or
1482      * low-order, side reenter on the left, or high-order.)
1483      *
1484      * <p>Note that right rotation with a negative distance is equivalent to
1485      * left rotation: {@code rotateRight(val, -distance) == rotateLeft(val,
1486      * distance)}.  Note also that rotation by any multiple of 32 is a
1487      * no-op, so all but the last five bits of the rotation distance can be
1488      * ignored, even if the distance is negative: {@code rotateRight(val,
1489      * distance) == rotateRight(val, distance & 0x1F)}.
1490      *
1491      * @param i the value whose bits are to be rotated right
1492      * @param distance the number of bit positions to rotate right
1493      * @return the value obtained by rotating the two's complement binary
1494      *     representation of the specified {@code int} value right by the
1495      *     specified number of bits.
1496      * @since 1.5
1497      */
1498     public static int rotateRight(int i, int distance) {
1499         return (i >>> distance) | (i << -distance);
1500     }
1501 
1502     /**
1503      * Returns the value obtained by reversing the order of the bits in the
1504      * two's complement binary representation of the specified {@code int}
1505      * value.
1506      *
1507      * @param i the value to be reversed
1508      * @return the value obtained by reversing order of the bits in the
1509      *     specified {@code int} value.
1510      * @since 1.5
1511      */
1512     public static int reverse(int i) {
1513         // HD, Figure 7-1
1514         i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
1515         i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;
1516         i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;
1517         i = (i << 24) | ((i & 0xff00) << 8) |
1518             ((i >>> 8) & 0xff00) | (i >>> 24);
1519         return i;
1520     }
1521 
1522     /**
1523      * Returns the signum function of the specified {@code int} value.  (The
1524      * return value is -1 if the specified value is negative; 0 if the
1525      * specified value is zero; and 1 if the specified value is positive.)
1526      *
1527      * @param i the value whose signum is to be computed
1528      * @return the signum function of the specified {@code int} value.
1529      * @since 1.5
1530      */
1531     public static int signum(int i) {
1532         // HD, Section 2-7
1533         return (i >> 31) | (-i >>> 31);
1534     }
1535 
1536     /**
1537      * Returns the value obtained by reversing the order of the bytes in the
1538      * two's complement representation of the specified {@code int} value.
1539      *
1540      * @param i the value whose bytes are to be reversed
1541      * @return the value obtained by reversing the bytes in the specified
1542      *     {@code int} value.
1543      * @since 1.5
1544      */
1545     public static int reverseBytes(int i) {
1546         return ((i >>> 24)           ) |
1547                ((i >>   8) &   0xFF00) |
1548                ((i <<   8) & 0xFF0000) |
1549                ((i << 24));
1550     }
1551 
1552     /**
1553      * Adds two integers together as per the + operator.
1554      *
1555      * @param a the first operand
1556      * @param b the second operand
1557      * @return the sum of {@code a} and {@code b}
1558      * @see java.util.function.BinaryOperator
1559      * @since 1.8
1560      */
1561     public static int sum(int a, int b) {
1562         return a + b;
1563     }
1564 
1565     /**
1566      * Returns the greater of two {@code int} values
1567      * as if by calling {@link Math#max(int, int) Math.max}.
1568      *
1569      * @param a the first operand
1570      * @param b the second operand
1571      * @return the greater of {@code a} and {@code b}
1572      * @see java.util.function.BinaryOperator
1573      * @since 1.8
1574      */
1575     public static int max(int a, int b) {
1576         return Math.max(a, b);
1577     }
1578 
1579     /**
1580      * Returns the smaller of two {@code int} values
1581      * as if by calling {@link Math#min(int, int) Math.min}.
1582      *
1583      * @param a the first operand
1584      * @param b the second operand
1585      * @return the smaller of {@code a} and {@code b}
1586      * @see java.util.function.BinaryOperator
1587      * @since 1.8
1588      */
1589     public static int min(int a, int b) {
1590         return Math.min(a, b);
1591     }
1592 
1593     /** use serialVersionUID from JDK 1.0.2 for interoperability */
1594     @Native private static final long serialVersionUID = 1360826667806852920L;
1595 }
Integer的代码

1     public boolean equals(Object obj) {
2         if (obj instanceof Integer) {
3             return value == ((Integer)obj).intValue();
4         }
5         return false;
6     }

   首先看看这个对象是不是Integer的类型的,如果是的话,我们比较一下两个对象的int类型的value是否相等。这样似乎和String的比较方法差不多了,但是如果是使用“==”来比较的时候就差得多了,因为这里的Integer使用了缓存,将[-128,127]的数字都缓存了一下,导致了两者相同,否则就创建出一个新的对象。

 1 package com.consumer.test;
 2 
 3 public class IntegerTest {
 4     public static void main(String[] args) {
 5         Integer i1=1;
 6         Integer i2=1;
 7         
 8         Integer i3=128;
 9         Integer i4=128;
10 
11         Integer i5=-128;
12         Integer i6=-128;
13 
14         Integer i7=1000;
15         Integer i8=1000;
16 
17         System.out.println("测试:"+(i1==i2));
18         System.out.println("测试:"+(i3==i4));
19         System.out.println("测试:"+(i5==i6));
20         System.out.println("测试:"+(i7==i8));
21 
22         System.out.println("====================");
23 
24         System.out.println("测试"+ (i1.equals(i2)));
25         System.out.println("测试"+ (i3.equals(i4)));
26         System.out.println("测试"+ (i5.equals(i6)));
27         System.out.println("测试"+ (i7.equals(i8)));
28     }
29 }

   让我们来看看这个缓存的定义,我们可以看到自动为我们创建了[-128,127]这么大的缓存空间。

 1   private static class IntegerCache {
 2         static final int low = -128;
 3         static final int high;
 4         static final Integer cache[];
 5 
 6         static {
 7             // high value may be configured by property
 8             int h = 127;
 9             String integerCacheHighPropValue =
10                 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
11             if (integerCacheHighPropValue != null) {
12                 try {
13                     int i = parseInt(integerCacheHighPropValue);
14                     i = Math.max(i, 127);
15                     // Maximum array size is Integer.MAX_VALUE
16                     h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
17                 } catch( NumberFormatException nfe) {
18                     // If the property cannot be parsed into an int, ignore it.
19                 }
20             }
21             high = h;
22 
23             cache = new Integer[(high - low) + 1];
24             int j = low;
25             for(int k = 0; k < cache.length; k++)
26                 cache[k] = new Integer(j++);
27 
28             // range [-128, 127] must be interned (JLS7 5.1.7)
29             assert IntegerCache.high >= 127;
30         }
31 
32         private IntegerCache() {}
33     }

   再看一下valueOf方法,可以看到当我们传递的数字如果在这个期间的话直接就发挥缓存的值,这样空间得到了节省,否则我们在新建一个Integer对象返回,这就是其中的奥秘。

    由此可以看到String和Integer都采用了优化方法,对于String,如果是str="..."这样定义的对象,就会将这些东西放到一个String池之中,只保留一份备份,因此,无论String的字符串是什么都可以这样来做==是true的;但是对于Integer就采用了另一种缓存的方式,只缓存了[-128,127]这些数值,超出了就直接创建新的对象,这样的设计和两者的应用场合是相关的,我们应该有清晰的了解。

三、总结

   通过源码和一些例子,我们更加清晰地了解了equals和“==”的作用,以及在不同地方的区别,对我们编写程序有着深刻的意义。

猜你喜欢

转载自www.cnblogs.com/zyrblog/p/10001304.html