diff --git a/src/java.base/share/classes/java/lang/String.java b/src/java.base/share/classes/java/lang/String.java index 55bbecaf425..0f272eba893 100644 --- a/src/java.base/share/classes/java/lang/String.java +++ b/src/java.base/share/classes/java/lang/String.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -698,8 +698,13 @@ public final class String /* * Throws iae, instead of replacing, if malformed or unmappable. + * + * @param noShare + * {@code true} if the resulting string MUST NOT share the byte array, + * {@code false} if the byte array can be exclusively used to construct + * the string and is not modified or used for any other purpose. */ - static String newStringUTF8NoRepl(byte[] bytes, int offset, int length) { + static String newStringUTF8NoRepl(byte[] bytes, int offset, int length, boolean noShare) { checkBoundsOffCount(offset, length, bytes.length); if (length == 0) { return ""; @@ -710,7 +715,11 @@ public final class String dp = StringCoding.countPositives(bytes, offset, length); int sl = offset + length; if (dp == length) { - return new String(Arrays.copyOfRange(bytes, offset, offset + length), LATIN1); + if (noShare || length != bytes.length) { + return new String(Arrays.copyOfRange(bytes, offset, offset + length), LATIN1); + } else { + return new String(bytes, LATIN1); + } } dst = new byte[length]; System.arraycopy(bytes, offset, dst, 0, dp); @@ -778,7 +787,7 @@ public final class String return ""; } if (cs == UTF_8.INSTANCE) { - return newStringUTF8NoRepl(src, 0, src.length); + return newStringUTF8NoRepl(src, 0, src.length, false); } if (cs == ISO_8859_1.INSTANCE) { if (COMPACT_STRINGS) @@ -800,6 +809,8 @@ public final class String if (cd instanceof ArrayDecoder ad && ad.isASCIICompatible() && !StringCoding.hasNegatives(src, 0, src.length)) { + if (COMPACT_STRINGS) + return new String(src, LATIN1); return new String(src, 0, src.length, ISO_8859_1.INSTANCE); } int en = scale(len, cd.maxCharsPerByte()); diff --git a/src/java.base/share/classes/java/lang/System.java b/src/java.base/share/classes/java/lang/System.java index 501ed47fcad..e8659f65c86 100644 --- a/src/java.base/share/classes/java/lang/System.java +++ b/src/java.base/share/classes/java/lang/System.java @@ -2478,7 +2478,7 @@ public final class System { } public String newStringUTF8NoRepl(byte[] bytes, int off, int len) { - return String.newStringUTF8NoRepl(bytes, off, len); + return String.newStringUTF8NoRepl(bytes, off, len, true); } public byte[] getBytesUTF8NoRepl(String s) {