沉淀再出发: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™ 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 (<condition does not hold>) 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 (<condition does not hold>) 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 (<condition does not hold>) 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™ 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中的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 ( + ), 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 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 & 0xff) << 8) 348 * | (<b><i>b</i></b> & 0xff)) 349 * </pre></blockquote> 350 * 351 * @deprecated This method does not properly convert bytes into 352 * characters. As of JDK 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 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 < 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> >= 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> >= 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> <= 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> <= 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> >= 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, end)</pre></blockquote> 1980 * 1981 * behaves in exactly the same way as the invocation 1982 * 1983 * <blockquote><pre> 1984 * str.substring(begin, 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> - 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 ,} <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>, <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>\u0130</td> 2527 * <td>\u0069</td> 2528 * <td>capital letter I with dot above -> small letter i</td> 2529 * </tr> 2530 * <tr> 2531 * <td>tr (Turkish)</td> 2532 * <td>\u0049</td> 2533 * <td>\u0131</td> 2534 * <td>capital letter I -> 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>\u0069</td> 2692 * <td>\u0130</td> 2693 * <td>small letter i -> capital letter I with dot above</td> 2694 * </tr> 2695 * <tr> 2696 * <td>tr (Turkish)</td> 2697 * <td>\u0131</td> 2698 * <td>\u0049</td> 2699 * <td>small letter dotless i -> capital letter I</td> 2700 * </tr> 2701 * <tr> 2702 * <td>(all)</td> 2703 * <td>\u00df</td> 2704 * <td>\u0053 \u0053</td> 2705 * <td>small letter sharp s -> two letters: SS</td> 2706 * </tr> 2707 * <tr> 2708 * <td>(all)</td> 2709 * <td>Fahrvergnügen</td> 2710 * <td>FAHRVERGNÜ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™ 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™ 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™ 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 }
再看一下其中的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 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 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 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 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 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 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 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 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 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 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 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™ 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 }
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和“==”的作用,以及在不同地方的区别,对我们编写程序有着深刻的意义。