--- old/src/java.base/share/classes/java/lang/Long.java 2016-02-03 21:20:30.399715043 +0300 +++ new/src/java.base/share/classes/java/lang/Long.java 2016-02-03 21:20:30.311715478 +0300 @@ -401,18 +401,6 @@ * @param offset the offset in the destination buffer to start at * @param len the number of characters to write */ - static void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) { - // assert shift > 0 && shift <=5 : "Illegal shift value"; - // assert offset >= 0 && offset < buf.length : "illegal offset"; - // assert len > 0 && (offset + len) <= buf.length : "illegal length"; - int charPos = offset + len; - int radix = 1 << shift; - int mask = radix - 1; - do { - buf[--charPos] = Integer.digits[((int) val) & mask]; - val >>>= shift; - } while (charPos > offset); - } /** byte[]/LATIN1 version */ static void formatUnsignedLong0(long val, int shift, byte[] buf, int offset, int len) { @@ -436,6 +424,39 @@ } while (charPos > offset); } + static String fastUUID(long lsb, long msb) { + if (COMPACT_STRINGS) { + byte[] buf = new byte[36]; + formatUnsignedLong0(lsb, 4, buf, 24, 12); + formatUnsignedLong0(lsb >> 48, 4, buf, 19, 4); + formatUnsignedLong0(msb, 4, buf, 14, 4); + formatUnsignedLong0(msb >> 16, 4, buf, 9, 4); + formatUnsignedLong0(msb >> 32, 4, buf, 0, 8); + + buf[23] = '-'; + buf[18] = '-'; + buf[13] = '-'; + buf[8] = '-'; + + return new String(buf, LATIN1); + } else { + byte[] buf = new byte[72]; + + formatUnsignedLong0UTF16(lsb, 4, buf, 24, 12); + formatUnsignedLong0UTF16(lsb >> 48, 4, buf, 19, 4); + formatUnsignedLong0UTF16(msb, 4, buf, 14, 4); + formatUnsignedLong0UTF16(msb >> 16, 4, buf, 9, 4); + formatUnsignedLong0UTF16(msb >> 32, 4, buf, 0, 8); + + StringUTF16.putChar(buf, 23, '-'); + StringUTF16.putChar(buf, 18, '-'); + StringUTF16.putChar(buf, 13, '-'); + StringUTF16.putChar(buf, 8, '-'); + + return new String(buf, UTF16); + } + } + /** * Returns a {@code String} object representing the specified * {@code long}. The argument is converted to signed decimal --- old/src/java.base/share/classes/java/lang/System.java 2016-02-03 21:20:30.639713857 +0300 +++ new/src/java.base/share/classes/java/lang/System.java 2016-02-03 21:20:30.551714292 +0300 @@ -1911,11 +1911,8 @@ public void invokeFinalize(Object o) throws Throwable { o.finalize(); } - public void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) { - Long.formatUnsignedLong(val, shift, buf, offset, len); - } - public void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) { - Integer.formatUnsignedInt(val, shift, buf, offset, len); + public String fastUUID(long lsb, long msb) { + return Long.fastUUID(lsb, msb); } }); } --- old/src/java.base/share/classes/java/util/UUID.java 2016-02-03 21:20:30.879712669 +0300 +++ new/src/java.base/share/classes/java/util/UUID.java 2016-02-03 21:20:30.791713104 +0300 @@ -392,17 +392,7 @@ * @return A string representation of this {@code UUID} */ public String toString() { - char[] chars = new char[36]; - jla.formatUnsignedLong(mostSigBits >> 32, 4, chars, 0, 8); - chars[8] = '-'; - jla.formatUnsignedLong(mostSigBits >> 16, 4, chars, 9, 4); - chars[13] = '-'; - jla.formatUnsignedLong(mostSigBits, 4, chars, 14, 4); - chars[18] = '-'; - jla.formatUnsignedLong(leastSigBits >> 48, 4, chars, 19, 4); - chars[23] = '-'; - jla.formatUnsignedLong(leastSigBits, 4, chars, 24, 12); - return jla.newStringUnsafe(chars); + return jla.fastUUID(leastSigBits, mostSigBits); } /** --- old/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java 2016-02-03 21:20:31.103711561 +0300 +++ new/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java 2016-02-03 21:20:31.015711996 +0300 @@ -124,12 +124,7 @@ void invokeFinalize(Object o) throws Throwable; /** - * Invokes Long.formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) + * Invokes Long.fastUUID */ - void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len); - - /** - * Invokes Integer.formatUnsignedInt(long val, int shift, char[] buf, int offset, int len) - */ - void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len); + String fastUUID(long lsb, long msb); } --- old/test/java/util/UUID/UUIDTest.java 2016-02-03 21:20:31.339710390 +0300 +++ new/test/java/util/UUID/UUIDTest.java 2016-02-03 21:20:31.243710866 +0300 @@ -25,6 +25,8 @@ * @bug 4173528 5068772 * @summary Unit tests for java.util.UUID * @key randomness + * @run main/othervm -XX:+CompactStrings UUIDTest + * @run main/othervm -XX:-CompactStrings UUIDTest */ import java.util.*;