1313import static java .lang .invoke .MethodType .methodType ;
1414
1515/**
16+ * 使用 底层 API 的 Java 高性能 辅助工具类。该工具类具有实验性质。
17+ *
18+ * <p> 请<b>注意</b>:为了确保高性能,本类中的方法会尽量避免数组的复制开销,因此请务必谨慎使用,后续<b>不要</b>修改传入或返回的 数组数据!
19+ *
1620 * @see com.alibaba.fastjson2.util.JDKUtils
1721 */
1822@ SuppressWarnings ({ "JavaLangInvokeHandleSignature" , "unchecked" })
1923public class JavaX {
2024
2125 public static final int javaVersion = parseJavaVersion (System .getProperty ("java.version" ));
26+ /** 指示当前 Java 版本是否为 Java 9+ 版本 */
2227 public static final boolean isJava9OrHigher = javaVersion >= 9 ;
2328
2429 public static final Unsafe UNSAFE ;
@@ -37,8 +42,37 @@ public class JavaX {
3742 // GraalVM not support
3843 // Android not support
3944 public static final BiFunction <char [], Boolean , String > STRING_CREATOR_JDK8 ;
45+ /**
46+ * <ul>
47+ * <li>在 JDK 9+ 并且 <code> String.COMPACT_STRINGS = true </code>时,通过 <code> STRING_CREATOR_JDK11.apply( bytes, coder ) </code> 构造字符串可以<b>避免</b> byte[] 的复制开销。
48+ * <p><b>注意</b>:请自行确保 <code> bytes </code> 和 <code> coder </code> 数据的正确性,并且后续<b>不能</b>修改 <code> bytes </code>!
49+ * </li>
50+ * <li>如未满足上述条件, 则 <code> STRING_VALUE.apply( bytes, coder ) </code> 等价于 <code> new String( bytes ) </code>
51+ * </ul>
52+ *
53+ * @see String#String(byte[])
54+ */
4055 public static final BiFunction <byte [], Byte , String > STRING_CREATOR_JDK11 ;
56+ /**
57+ * <ul>
58+ * <li>在 JDK 9+ 并且 <code> String.COMPACT_STRINGS = true </code>时,通过 <code> STRING_CODER.applyAsInt( str ) </code> 可以直接获取底层 <code> String.coder </code>。
59+ * <li>如未满足上述条件, 则 <code> STRING_CODER.applyAsInt( str ) </code> 等价于 {@link #UTF16}
60+ * </ul>
61+ *
62+ * @see #LATIN1
63+ * @see #UTF16
64+ */
4165 public static final ToIntFunction <String > STRING_CODER ;
66+ /**
67+ * <ul>
68+ * <li>在 JDK 9+ 并且 <code> String.COMPACT_STRINGS = true </code>时,通过 <code> STRING_VALUE.apply( str ) </code> 可以直接获取底层 <code> String.value </code> 的 <code> byte[] </code> <b>引用</b>。
69+ * <p><b>注意</b>:外部【不能】修改引用的字节数组!!
70+ * </li>
71+ * <li>如未满足上述条件, 则 <code> STRING_VALUE.apply( str ) </code> 等价于 <code> str.getByte() </code>
72+ * </ul>
73+ *
74+ * @see String#getBytes()
75+ */
4276 public static final Function <String , byte []> STRING_VALUE ;
4377
4478 @ Nullable
@@ -459,10 +493,11 @@ private static boolean isASCIIOnJdk8(String str) {
459493
460494 /**
461495 * 将字符串转换为 UTF-8 编码的字节数组
462- * <p> 【注意】:在 JDK 9+,返回的字节数组可能是字符串底层数组的引用 ,只能读取、不可修改 ,否则可能引发错误!!!
496+ * <p> 【注意】:在 JDK 9+,返回的字节数组可能是字符串底层数组的<b>引用</b> ,只能读取、<b>不可</b>修改 ,否则可能引发错误!!!
463497 *
464498 * @param str 待转换的字符串,不能为空
465499 * @return UTF-8编码的字节数组
500+ * @see String#getBytes(Charset)
466501 */
467502 public static byte [] getUtf8Bytes (@ Nonnull String str ) {
468503 if (STRING_CODER .applyAsInt (str ) == LATIN1 ) {
@@ -476,14 +511,15 @@ public static byte[] getUtf8Bytes(@Nonnull String str) {
476511
477512 /**
478513 * JDK 9+时,此值与 <code> String.COMPACT_STRINGS </code> 保持一致。
479- * <p> JDK 8值 ,此值恒为 false
514+ * <p> JDK 8 时 ,此值恒为 false
480515 */
481516 public static boolean supportLatin1 () {
482517 return supportLatin1 ;
483518 }
484519
485520 /**
486- * 根据指定的字符集创建新的字符串
521+ * 将指定字符集的 字节数组 构造为对应的 字符串
522+ * <p> 【注意】:在 JDK 9+ 时,为提高性能,返回的字符串内部可能直接使用传入的 <code> bytes </code> 数组的 <b>引用</b>,请自行确保后续<b>不要</b>修改入参 <code> bytes </code> 的数据!!!
487523 *
488524 * @param bytes 字节数组
489525 * @param charset 字符集
0 commit comments