constructor = ConstructorUtil.getConstructor(String.class, char[].class, boolean.class);
+ STRING_CREATOR = LambdaFactory.build(BiFunction.class, constructor);
+ }
+
+ /**
+ * 通过{@code String(char[] value, boolean share)}这个内部构造创建String对象。
+ * 此函数通过传入char[],实现zero-copy的String创建,效率很高。但是要求传入的char[]不可以在其他地方修改。
+ *
+ * @param value char[]值,注意这个数组不可修改!!
+ * @return String
+ */
+ public static String createString(final char[] value) {
+ return STRING_CREATOR.apply(value, true);
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java
index f425c83b2..43269e0a8 100644
--- a/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java
+++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/LambdaFactory.java
@@ -2,7 +2,6 @@ package cn.hutool.core.lang.func;
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.lang.Assert;
-import cn.hutool.core.lang.Opt;
import cn.hutool.core.lang.mutable.MutableEntry;
import cn.hutool.core.map.WeakConcurrentMap;
import cn.hutool.core.reflect.LookupFactory;
diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java
index aa953c2ec..427a38673 100644
--- a/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/text/StrUtil.java
@@ -122,7 +122,8 @@ public class StrUtil extends CharSequenceUtil implements StrPool {
* 将对象转为字符串
*
* 1、Byte数组和ByteBuffer会被转换为对应字符串的数组
- * 2、对象数组会调用Arrays.toString方法
+ * 2、char[]会直接构造String
+ * 3、对象数组会调用Arrays.toString方法
*
*
* @param obj 对象
@@ -136,7 +137,9 @@ public class StrUtil extends CharSequenceUtil implements StrPool {
if (obj instanceof String) {
return (String) obj;
- } else if (obj instanceof byte[]) {
+ }else if(obj instanceof char[]){
+ return new String((char[]) obj);
+ }else if (obj instanceof byte[]) {
return str((byte[]) obj, charset);
} else if (obj instanceof Byte[]) {
return str((Byte[]) obj, charset);
@@ -178,17 +181,6 @@ public class StrUtil extends CharSequenceUtil implements StrPool {
return new String(data, charset);
}
- /**
- * 将Byte数组转为字符串
- *
- * @param bytes byte数组
- * @param charset 字符集
- * @return 字符串
- */
- public static String str(final Byte[] bytes, final String charset) {
- return str(bytes, CharsetUtil.charset(charset));
- }
-
/**
* 解码字节码
*
@@ -211,21 +203,6 @@ public class StrUtil extends CharSequenceUtil implements StrPool {
return str(bytes, charset);
}
- /**
- * 将编码的byteBuffer数据转换为字符串
- *
- * @param data 数据
- * @param charset 字符集,如果为空使用当前系统字符集
- * @return 字符串
- */
- public static String str(final ByteBuffer data, final String charset) {
- if (data == null) {
- return null;
- }
-
- return str(data, CharsetUtil.charset(charset));
- }
-
/**
* 将编码的byteBuffer数据转换为字符串
*
diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/func/FunctionPoolTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/func/FunctionPoolTest.java
new file mode 100644
index 000000000..cb8d5f74c
--- /dev/null
+++ b/hutool-core/src/test/java/cn/hutool/core/lang/func/FunctionPoolTest.java
@@ -0,0 +1,39 @@
+package cn.hutool.core.lang.func;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.StopWatch;
+import cn.hutool.core.util.RandomUtil;
+import org.junit.Test;
+
+import java.util.ArrayList;
+
+public class FunctionPoolTest {
+
+ @Test
+ public void createStringTest() {
+ // 预热
+ FunctionPool.createString("123".toCharArray());
+
+ // 测试数据
+ final ArrayList list = ListUtil.of();
+ for (int i = 0; i < 100000; i++) {
+ list.add(RandomUtil.randomString(100).toCharArray());
+ }
+
+ final StopWatch stopWatch = DateUtil.createStopWatch();
+ stopWatch.start("copy creator");
+ for (final char[] value : list) {
+ new String(value);
+ }
+ stopWatch.stop();
+
+ stopWatch.start("zero copy creator");
+ for (final char[] value : list) {
+ FunctionPool.createString(value);
+ }
+ stopWatch.stop();
+
+ //Console.log(stopWatch.prettyPrint());
+ }
+}