From 01f94defd29b9866294802a9847ceafbed5eb1bb Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 24 Mar 2023 01:29:11 +0800 Subject: [PATCH] fix code --- .../hutool/core/lang/func/FunctionPool.java | 38 ++++++++++++++++++ .../hutool/core/lang/func/LambdaFactory.java | 1 - .../java/cn/hutool/core/text/StrUtil.java | 33 +++------------- .../core/lang/func/FunctionPoolTest.java | 39 +++++++++++++++++++ 4 files changed, 82 insertions(+), 29 deletions(-) create mode 100644 hutool-core/src/main/java/cn/hutool/core/lang/func/FunctionPool.java create mode 100644 hutool-core/src/test/java/cn/hutool/core/lang/func/FunctionPoolTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/FunctionPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/FunctionPool.java new file mode 100644 index 000000000..02e611cc3 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/FunctionPool.java @@ -0,0 +1,38 @@ +package cn.hutool.core.lang.func; + +import cn.hutool.core.reflect.ConstructorUtil; + +import java.lang.reflect.Constructor; +import java.util.function.BiFunction; + +/** + * 常用Lambda函数封装
+ * 提供常用对象方法的Lambda包装,减少Lambda初始化时间。 + * + * @author looly + */ +@SuppressWarnings("unchecked") +public class FunctionPool { + + /** + * 通过{@code String(char[] value, boolean share)}这个内部构造生成一个Lambda函数
+ * 此函数通过传入char[],实现zero-copy的String创建,效率很高。但是要求传入的char[]不可以在其他地方修改。 + */ + public static final BiFunction STRING_CREATOR; + + static { + final Constructor 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()); + } +}