8370503: Use String.newStringWithLatin1Bytes to simplify Integer/Long toString method

Reviewed-by: rgiulietti, rriggs
This commit is contained in:
Shaojin Wen 2025-10-24 16:43:57 +00:00
parent cc9483b4da
commit fd23a61cd4
2 changed files with 12 additions and 77 deletions

View File

@ -363,15 +363,9 @@ public final class Integer extends Number
// assert shift > 0 && shift <=5 : "Illegal shift value";
int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
int chars = Math.max(((mag + (shift - 1)) / shift), 1);
if (COMPACT_STRINGS) {
byte[] buf = new byte[chars];
formatUnsignedInt(val, shift, buf, chars);
return new String(buf, LATIN1);
} else {
byte[] buf = new byte[chars * 2];
formatUnsignedIntUTF16(val, shift, buf, chars);
return new String(buf, UTF16);
}
byte[] buf = new byte[chars];
formatUnsignedInt(val, shift, buf, chars);
return String.newStringWithLatin1Bytes(buf);
}
/**
@ -394,26 +388,6 @@ public final class Integer extends Number
} while (charPos > 0);
}
/**
* Format an {@code int} (treated as unsigned) into a byte buffer (UTF16 version). If
* {@code len} exceeds the formatted ASCII representation of {@code val},
* {@code buf} will be padded with leading zeroes.
*
* @param val the unsigned int to format
* @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary)
* @param buf the byte buffer to write to
* @param len the number of characters to write
*/
private static void formatUnsignedIntUTF16(int val, int shift, byte[] buf, int len) {
int charPos = len;
int radix = 1 << shift;
int mask = radix - 1;
do {
StringUTF16.putChar(buf, --charPos, Integer.digits[val & mask]);
val >>>= shift;
} while (charPos > 0);
}
/**
* Returns a {@code String} object representing the
* specified integer. The argument is converted to signed decimal
@ -427,15 +401,9 @@ public final class Integer extends Number
@IntrinsicCandidate
public static String toString(int i) {
int size = DecimalDigits.stringSize(i);
if (COMPACT_STRINGS) {
byte[] buf = new byte[size];
DecimalDigits.uncheckedGetCharsLatin1(i, size, buf);
return new String(buf, LATIN1);
} else {
byte[] buf = new byte[size * 2];
DecimalDigits.uncheckedGetCharsUTF16(i, size, buf);
return new String(buf, UTF16);
}
byte[] buf = new byte[size];
DecimalDigits.uncheckedGetCharsLatin1(i, size, buf);
return String.newStringWithLatin1Bytes(buf);
}
/**

View File

@ -391,15 +391,9 @@ public final class Long extends Number
// assert shift > 0 && shift <=5 : "Illegal shift value";
int mag = Long.SIZE - Long.numberOfLeadingZeros(val);
int chars = Math.max(((mag + (shift - 1)) / shift), 1);
if (COMPACT_STRINGS) {
byte[] buf = new byte[chars];
formatUnsignedLong0(val, shift, buf, 0, chars);
return new String(buf, LATIN1);
} else {
byte[] buf = new byte[chars * 2];
formatUnsignedLong0UTF16(val, shift, buf, 0, chars);
return new String(buf, UTF16);
}
byte[] buf = new byte[chars];
formatUnsignedLong0(val, shift, buf, 0, chars);
return String.newStringWithLatin1Bytes(buf);
}
/**
@ -423,27 +417,6 @@ public final class Long extends Number
} while (charPos > offset);
}
/**
* Format a long (treated as unsigned) into a byte buffer (UTF16 version). If
* {@code len} exceeds the formatted ASCII representation of {@code val},
* {@code buf} will be padded with leading zeroes.
*
* @param val the unsigned long to format
* @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary)
* @param buf the byte buffer to write to
* @param offset the offset in the destination buffer to start at
* @param len the number of characters to write
*/
private static void formatUnsignedLong0UTF16(long val, int shift, byte[] buf, int offset, int len) {
int charPos = offset + len;
int radix = 1 << shift;
int mask = radix - 1;
do {
StringUTF16.putChar(buf, --charPos, Integer.digits[((int) val) & mask]);
val >>>= shift;
} while (charPos > offset);
}
/**
* Returns a {@code String} object representing the specified
* {@code long}. The argument is converted to signed decimal
@ -456,15 +429,9 @@ public final class Long extends Number
*/
public static String toString(long i) {
int size = DecimalDigits.stringSize(i);
if (COMPACT_STRINGS) {
byte[] buf = new byte[size];
DecimalDigits.uncheckedGetCharsLatin1(i, size, buf);
return new String(buf, LATIN1);
} else {
byte[] buf = new byte[size * 2];
DecimalDigits.uncheckedGetCharsUTF16(i, size, buf);
return new String(buf, UTF16);
}
byte[] buf = new byte[size];
DecimalDigits.uncheckedGetCharsLatin1(i, size, buf);
return String.newStringWithLatin1Bytes(buf);
}
/**