diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2f1a63c30..18b91a983 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,17 +3,45 @@
-------------------------------------------------------------------------------------------------------------
-# 5.5.9 (2021-02-18)
+# 5.6.0 (2021-03-10)
+
+### 新特性
+* 【poi 】 重要:不再兼容POI-3.x,增加兼容POI-5.x(issue#I35J6B@Gitee)
+* 【core 】 FileTypeUtil使用长匹配优先(pr#1457@Github)
+* 【core 】 IterUtil和CollUtil增加isEqualList方法(issue#I3A3PY@Gitee)
+* 【crypto 】 增加PBKDF2(issue#1416@Github)
+* 【core 】 增加FuncKeyMap(issue#1402@Github)
+* 【core 】 增加StrMatcher(issue#1379@Github)
+* 【core 】 NumberUtil增加factorial针对BigInterger方法(issue#1379@Github)
+* 【core 】 TreeNode增加equals方法(issue#1467@Github)
+
+### Bug修复
+* 【socket 】 修复Client创建失败资源未释放问题。
+* 【core 】 修复DataSizeUtil中EB单位错误问题(issue#I39O7I@Gitee)
+
+-------------------------------------------------------------------------------------------------------------
+
+# 5.5.9 (2021-02-26)
### 新特性
* 【crypto 】 PemUtil.readPemKey支持EC(pr#1366@Github)
* 【extra 】 Ftp等cd方法增加同步(issue#1397@Github)
* 【core 】 StrUtil增加endWithAnyIgnoreCase(issue#I37I0B@Gitee)
+* 【crypto 】 Sm2增加getD和getQ方法(issue#I37Z4C@Gitee)
+* 【cache 】 AbstractCache增加keySet方法(issue#I37Z4C@Gitee)
+* 【core 】 NumberWordFormatter增加formatSimple方法(pr#1436@Github)
+* 【crypto 】 增加读取openSSL生成的sm2私钥
+* 【crypto 】 增加众多方法,SM2兼容各类密钥格式(issue#I37Z75@Gitee)
### Bug修复
* 【json 】 JSONUtil.isJson方法改变trim策略,解决特殊空白符导致判断失败问题
* 【json 】 修复SQLEXception导致的栈溢出(issue#1399@Github)
* 【extra 】 修复Ftp中异常参数没有传入问题(issue#1397@Github)
+* 【crypto 】 修复Sm2使用D构造空指针问题(issue#I37Z4C@Gitee)
+* 【poi 】 修复ExcelPicUtil中图表报错问题(issue#I38857@Gitee)
+* 【core 】 修复ListUtil.page方法返回空列表无法编辑问题(issue#1415@Github)
+* 【core 】 修复ListUtil.sub中step不通结果不一致问题(issue#1409@Github)
+* 【db 】 修复Condition转换参数值时未转换数字异常(issue#I38LTM@Gitee)
-------------------------------------------------------------------------------------------------------------
diff --git a/README-EN.md b/README-EN.md
index 275b8ae58..b5961c350 100644
--- a/README-EN.md
+++ b/README-EN.md
@@ -125,19 +125,19 @@ Each module can be introduced individually, or all modules can be introduced by
* Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。
* Hutool最初是我项目中“util”包的一个整理,后来慢慢积累并加入更多非业务相关功能,并广泛学习其它开源项目精髓,经过自己整理修改,最终形成丰富的开源工具集。
*
false .如果不存在.先增加这个字符串.再返回true
- *
+ *
* @param str 字符串
* @return 是否加入成功,如果存在就返回false .如果不存在返回true
*/
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BloomFilterUtil.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BloomFilterUtil.java
index 4e2cd7aca..6ba79067e 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BloomFilterUtil.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BloomFilterUtil.java
@@ -2,7 +2,7 @@ package cn.hutool.bloomfilter;
/**
* 布隆过滤器工具
- *
+ *
* @author looly
* @since 4.1.5
*/
@@ -10,7 +10,7 @@ public class BloomFilterUtil {
/**
* 创建一个BitSet实现的布隆过滤器,过滤器的容量为c * n 个bit.
- *
+ *
* @param c 当前过滤器预先开辟的最大包含记录,通常要比预计存入的记录多一倍.
* @param n 当前过滤器预计所要包含的记录.
* @param k 哈希函数的个数,等同每条记录要占用的bit数.
@@ -22,7 +22,7 @@ public class BloomFilterUtil {
/**
* 创建BitMap实现的布隆过滤器
- *
+ *
* @param m BitMap的大小
* @return BitMapBloomFilter
*/
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/BitMap.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/BitMap.java
index 0e8eecf4d..b877bf395 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/BitMap.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/BitMap.java
@@ -2,7 +2,7 @@ package cn.hutool.bloomfilter.bitMap;
/**
* BitMap接口,用于将某个int或long值映射到一个数组中,从而判定某个值是否存在
- *
+ *
* @author looly
*
*/
@@ -13,14 +13,14 @@ public interface BitMap{
/**
* 加入值
- *
+ *
* @param i 值
*/
void add(long i);
/**
* 检查是否包含值
- *
+ *
* @param i 值
* @return 是否包含
*/
@@ -28,7 +28,7 @@ public interface BitMap{
/**
* 移除值
- *
+ *
* @param i 值
*/
void remove(long i);
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java
index 498129f8f..f941d0696 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java
@@ -4,7 +4,7 @@ import java.io.Serializable;
/**
* 过滤器BitMap在32位机器上.这个类能发生更好的效果.一般情况下建议使用此类
- *
+ *
* @author loolly
*
*/
@@ -22,7 +22,7 @@ public class IntMap implements BitMap, Serializable {
/**
* 构造
- *
+ *
* @param size 容量
*/
public IntMap(int size) {
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java
index 7ee584663..93f0d6d99 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java
@@ -4,7 +4,7 @@ import java.io.Serializable;
/**
* 过滤器BitMap在64位机器上.这个类能发生更好的效果.一般机器不建议使用
- *
+ *
* @author loolly
*
*/
@@ -22,7 +22,7 @@ public class LongMap implements BitMap, Serializable {
/**
* 构造
- *
+ *
* @param size 容量
*/
public LongMap(int size) {
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/package-info.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/package-info.java
index bc24ee883..37d547426 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/package-info.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/package-info.java
@@ -1,6 +1,6 @@
/**
* BitMap实现
- *
+ *
* @author looly
*
*/
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/AbstractFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/AbstractFilter.java
index b1ac316e9..a19d55527 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/AbstractFilter.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/AbstractFilter.java
@@ -7,7 +7,7 @@ import cn.hutool.bloomfilter.bitMap.LongMap;
/**
* 抽象Bloom过滤器
- *
+ *
* @author loolly
*
*/
@@ -20,7 +20,7 @@ public abstract class AbstractFilter implements BloomFilter {
/**
* 构造
- *
+ *
* @param maxValue 最大值
* @param machineNum 机器位数
*/
@@ -30,7 +30,7 @@ public abstract class AbstractFilter implements BloomFilter {
/**
* 构造32位
- *
+ *
* @param maxValue 最大值
*/
public AbstractFilter(long maxValue) {
@@ -39,7 +39,7 @@ public abstract class AbstractFilter implements BloomFilter {
/**
* 初始化
- *
+ *
* @param maxValue 最大值
* @param machineNum 机器位数
*/
@@ -75,7 +75,7 @@ public abstract class AbstractFilter implements BloomFilter {
/**
* 自定义Hash方法
- *
+ *
* @param str 字符串
* @return HashCode
*/
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/ELFFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/ELFFilter.java
index 1b292db60..81c44a37f 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/ELFFilter.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/ELFFilter.java
@@ -8,11 +8,11 @@ public class ELFFilter extends AbstractFilter {
public ELFFilter(long maxValue, int machineNumber) {
super(maxValue, machineNumber);
}
-
+
public ELFFilter(long maxValue) {
super(maxValue);
}
-
+
@Override
public long hash(String str) {
return HashUtil.elfHash(str) % size;
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/HfFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/HfFilter.java
index 79f95da48..fc2814149 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/HfFilter.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/HfFilter.java
@@ -7,11 +7,11 @@ public class HfFilter extends AbstractFilter {
public HfFilter(long maxValue, int machineNum) {
super(maxValue, machineNum);
}
-
+
public HfFilter(long maxValue) {
super(maxValue);
}
-
+
@Override
public long hash(String str) {
int length = str.length() ;
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/JSFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/JSFilter.java
index 9bc5e7394..af9d5837f 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/JSFilter.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/JSFilter.java
@@ -19,11 +19,11 @@ public class JSFilter extends AbstractFilter {
for (int i = 0; i < str.length(); i++) {
hash ^= ((hash << 5) + str.charAt(i) + (hash >> 2));
}
-
+
if(hash<0) {
hash*=-1 ;
}
-
+
return hash % size;
}
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/package-info.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/package-info.java
index 811eb3d2a..157177d8e 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/package-info.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/filter/package-info.java
@@ -1,6 +1,6 @@
/**
* 各种Hash算法的过滤器实现
- *
+ *
* @author looly
*
*/
diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/package-info.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/package-info.java
index b43515889..1eec3a1a7 100644
--- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/package-info.java
+++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/package-info.java
@@ -1,6 +1,6 @@
/**
* 布隆过滤,提供一些Hash算法的布隆过滤
- *
+ *
* @author looly
*
*/
diff --git a/hutool-bloomFilter/src/test/java/cn/hutool/bloomfilter/BitMapBloomFilterTest.java b/hutool-bloomFilter/src/test/java/cn/hutool/bloomfilter/BitMapBloomFilterTest.java
index 277b424b8..ad104d632 100644
--- a/hutool-bloomFilter/src/test/java/cn/hutool/bloomfilter/BitMapBloomFilterTest.java
+++ b/hutool-bloomFilter/src/test/java/cn/hutool/bloomfilter/BitMapBloomFilterTest.java
@@ -8,14 +8,14 @@ import cn.hutool.bloomfilter.bitMap.IntMap;
import cn.hutool.bloomfilter.bitMap.LongMap;
public class BitMapBloomFilterTest {
-
+
@Test
public void filterTest() {
BitMapBloomFilter filter = new BitMapBloomFilter(10);
filter.add("123");
filter.add("abc");
filter.add("ddd");
-
+
Assert.assertTrue(filter.contains("abc"));
Assert.assertTrue(filter.contains("ddd"));
Assert.assertTrue(filter.contains("123"));
diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml
index 2a6cf622f..6b25aaef5 100644
--- a/hutool-bom/pom.xml
+++ b/hutool-bom/pom.xml
@@ -7,7 +7,7 @@
LinkedHashMap
+ * 只清理超时对象,LRU的实现会交给{@code LinkedHashMap}
*/
@Override
protected int pruneCache() {
diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java
index 7814d9679..02b8173e4 100644
--- a/hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java
+++ b/hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java
@@ -7,7 +7,7 @@ import java.util.Iterator;
/**
* 无缓存实现,用于快速关闭缓存
- *
+ *
* @param * persion * persion.name @@ -33,7 +33,7 @@ import java.util.Map; * person.friends[5].name * ['person']['friends'][5]['name'] *- * + * * @author Looly * @since 4.0.6 */ @@ -54,9 +54,9 @@ public class BeanPath implements Serializable{ *
* persion
* persion.name
@@ -64,7 +64,7 @@ public class BeanPath implements Serializable{
* person.friends[5].name
* ['person']['friends'][5]['name']
*
- *
+ *
* @param expression 表达式
* @return BeanPath
*/
@@ -74,7 +74,7 @@ public class BeanPath implements Serializable{
/**
* 构造
- *
+ *
* @param expression 表达式
*/
public BeanPath(String expression) {
@@ -83,7 +83,7 @@ public class BeanPath implements Serializable{
/**
* 获取Bean中对应表达式的值
- *
+ *
* @param bean Bean对象或Map或List等
* @return 值,如果对应值不存在,则返回null
*/
@@ -95,29 +95,29 @@ public class BeanPath implements Serializable{
* 设置表达式指定位置(或filed对应)的值* 1. 如果为List,如果下标不大于List长度,则替换原有值,否则追加值 * 2. 如果为数组,如果下标不大于数组长度,则替换原有值,否则追加值 *- * + * * @param bean Bean、Map或List * @param value 值 */ public void set(Object bean, Object value) { set(bean, this.patternParts, value); } - + /** * 设置表达式指定位置(或filed对应)的值
* 1. 如果为List,如果下标不大于List长度,则替换原有值,否则追加值 * 2. 如果为数组,如果下标不大于数组长度,则替换原有值,否则追加值 *- * + * * @param bean Bean、Map或List * @param patternParts 表达式块列表 * @param value 值 @@ -135,7 +135,7 @@ public class BeanPath implements Serializable{ // ------------------------------------------------------------------------------------------------------------------------------------- Private method start /** * 获取Bean中对应表达式的值 - * + * * @param patternParts 表达式分段列表 * @param bean Bean对象或Map或List等 * @param ignoreLast 是否忽略最后一个值,忽略最后一个值则用于set,否则用于read @@ -215,7 +215,7 @@ public class BeanPath implements Serializable{ /** * 初始化 - * + * * @param expression 表达式 */ private void init(String expression) { @@ -277,7 +277,7 @@ public class BeanPath implements Serializable{ /** * 对于非表达式去除单引号 - * + * * @param expression 表达式 * @return 表达式 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java index b2d375ba3..7d54e7a9c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java @@ -25,7 +25,7 @@ import java.util.Map; * 3. Map 转 Bean * 4. Map 转 Map * - * + * * @author looly * * @param
@@ -33,7 +33,7 @@ import java.util.Comparator; * } * } * - * + * * 字段值按照顺序比较,如果某个字段返回非0结果,比较终止,使用{@code toComparison()}返回结果,后续比较忽略。 * *
@@ -52,7 +52,7 @@ import java.util.Comparator;
*/
public class CompareToBuilder implements Builder Compares two Fields can be private, thus Compares two Fields can be private, thus Compares two Fields can be private, thus Compares two Fields can be private, thus Appends to Appends to the Appends to the
* A registry of objects used by reflection methods to detect cyclical object references and avoid infinite loops.
@@ -103,7 +103,7 @@ public class HashCodeBuilder implements Builder
* 解决方法为:在构造方法中遍历Iterator中的元素,装入新的List中然后遍历之。
* 当然,修改这个复制后的Iterator是没有意义的,因此remove方法将会抛出异常。
- *
+ *
*
* 需要注意的是,在构造此对象时需要保证原子性(原对象不被修改),最好加锁构造此对象,构造完毕后解锁。
- *
+ *
*
* @param
- * Adapt the specified
@@ -94,7 +93,7 @@ public class CompareToBuilder implements Builder
Objects via reflection.AccessibleObject.setAccessible
- * is used to bypass normal access control checks. This will fail under a
+ * is used to bypass normal access control checks. This will fail under a
* security manager unless the appropriate permissions are set.
@@ -126,7 +125,7 @@ public class CompareToBuilder implements Builder
Objects via reflection.AccessibleObject.setAccessible
- * is used to bypass normal access control checks. This will fail under a
+ * is used to bypass normal access control checks. This will fail under a
* security manager unless the appropriate permissions are set.
@@ -159,7 +158,7 @@ public class CompareToBuilder implements Builder
Objects via reflection.AccessibleObject.setAccessible
- * is used to bypass normal access control checks. This will fail under a
+ * is used to bypass normal access control checks. This will fail under a
* security manager unless the appropriate permissions are set.
@@ -192,7 +191,7 @@ public class CompareToBuilder implements Builder
Objects via reflection.AccessibleObject.setAccessible
- * is used to bypass normal access control checks. This will fail under a
+ * is used to bypass normal access control checks. This will fail under a
* security manager unless the appropriate permissions are set.
@@ -221,10 +220,10 @@ public class CompareToBuilder implements Builder
reflectionCompare(Object, Object, boolean, Class))
*/
public static int reflectionCompare(
- final Object lhs,
- final Object rhs,
- final boolean compareTransients,
- final Class> reflectUpToClass,
+ final Object lhs,
+ final Object rhs,
+ final boolean compareTransients,
+ final Class> reflectUpToClass,
final String... excludeFields) {
if (lhs == rhs) {
@@ -249,7 +248,7 @@ public class CompareToBuilder implements Builderbuilder the comparison of lhs
* to rhs using the fields defined in clazz.Class that defines fields to be compared
@@ -264,7 +263,7 @@ public class CompareToBuilder implements Builderbuilder the comparison of
@@ -312,7 +311,7 @@ public class CompareToBuilder implements Buildernull object is less than a non-null object
* lhs must either be an array or implement {@link Comparable}.builder the comparison of
* two shorts.
- *
+ *
* @param lhs left-hand value
* @param rhs right-hand value
* @return this - used to chain append calls
@@ -473,7 +472,7 @@ public class CompareToBuilder implements Builderbuilder the comparison of
* two bytes.
- *
+ *
* @param lhs left-hand value
* @param rhs right-hand value
* @return this - used to chain append calls
@@ -575,7 +574,7 @@ public class CompareToBuilder implements Builderbuilder the deep comparison of
* two Object arrays.builder has judged the "left-hand" side
* as less than, greater than, or equal to the "right-hand"
* side.
- *
+ *
* @return final comparison result
* @see #build()
*/
@@ -963,7 +962,7 @@ public class CompareToBuilder implements Builderbuilder has judged the "left-hand" side
* as less than, greater than, or equal to the "right-hand"
* side.
- *
+ *
* @return final comparison result as an Integer
* @see #toComparison()
* @since 3.0
diff --git a/hutool-core/src/main/java/cn/hutool/core/builder/HashCodeBuilder.java b/hutool-core/src/main/java/cn/hutool/core/builder/HashCodeBuilder.java
index 2de15b49d..6ca13c243 100644
--- a/hutool-core/src/main/java/cn/hutool/core/builder/HashCodeBuilder.java
+++ b/hutool-core/src/main/java/cn/hutool/core/builder/HashCodeBuilder.java
@@ -85,17 +85,17 @@ import cn.hutool.core.util.ArrayUtil;
*/
public class HashCodeBuilder implements Buildernull
*/
public static int reflectionHashCode(final Object object, final boolean testTransients) {
- return reflectionHashCode(DEFAULT_INITIAL_VALUE, DEFAULT_MULTIPLIER_VALUE, object,
+ return reflectionHashCode(DEFAULT_INITIAL_VALUE, DEFAULT_MULTIPLIER_VALUE, object,
testTransients, null);
}
@@ -457,7 +457,7 @@ public class HashCodeBuilder implements Buildernull
*/
public static int reflectionHashCode(final Object object, final String... excludeFields) {
- return reflectionHashCode(DEFAULT_INITIAL_VALUE, DEFAULT_MULTIPLIER_VALUE, object, false,
+ return reflectionHashCode(DEFAULT_INITIAL_VALUE, DEFAULT_MULTIPLIER_VALUE, object, false,
null, excludeFields);
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/builder/IDKey.java b/hutool-core/src/main/java/cn/hutool/core/builder/IDKey.java
index 40af0d8c4..e49ecd174 100644
--- a/hutool-core/src/main/java/cn/hutool/core/builder/IDKey.java
+++ b/hutool-core/src/main/java/cn/hutool/core/builder/IDKey.java
@@ -13,13 +13,13 @@ import java.io.Serializable;
*/
final class IDKey implements Serializable{
private static final long serialVersionUID = 1L;
-
+
private final Object value;
private final int id;
/**
* 构造
- *
+ *
* @param obj 计算唯一ID的对象
*/
public IDKey(final Object obj) {
@@ -32,7 +32,7 @@ final class IDKey implements Serializable{
/**
* returns hashcode - i.e. the system identity hashcode.
- *
+ *
* @return the hashcode
*/
@Override
@@ -42,7 +42,7 @@ final class IDKey implements Serializable{
/**
* checks if instances are equal
- *
+ *
* @param other The other object to compare to
* @return if the instances are for the same object
*/
diff --git a/hutool-core/src/main/java/cn/hutool/core/builder/package-info.java b/hutool-core/src/main/java/cn/hutool/core/builder/package-info.java
index db54a59b3..800a02855 100644
--- a/hutool-core/src/main/java/cn/hutool/core/builder/package-info.java
+++ b/hutool-core/src/main/java/cn/hutool/core/builder/package-info.java
@@ -1,7 +1,7 @@
/**
* 建造者工具
* 用于建造特定对象或结果
- *
+ *
* @author looly
*
*/
diff --git a/hutool-core/src/main/java/cn/hutool/core/clone/CloneRuntimeException.java b/hutool-core/src/main/java/cn/hutool/core/clone/CloneRuntimeException.java
index 9f5744e21..7f70e2813 100644
--- a/hutool-core/src/main/java/cn/hutool/core/clone/CloneRuntimeException.java
+++ b/hutool-core/src/main/java/cn/hutool/core/clone/CloneRuntimeException.java
@@ -13,19 +13,19 @@ public class CloneRuntimeException extends RuntimeException{
public CloneRuntimeException(Throwable e) {
super(ExceptionUtil.getMessage(e), e);
}
-
+
public CloneRuntimeException(String message) {
super(message);
}
-
+
public CloneRuntimeException(String messageTemplate, Object... params) {
super(StrUtil.format(messageTemplate, params));
}
-
+
public CloneRuntimeException(String message, Throwable throwable) {
super(message, throwable);
}
-
+
public CloneRuntimeException(Throwable throwable, String messageTemplate, Object... params) {
super(StrUtil.format(messageTemplate, params), throwable);
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/clone/CloneSupport.java b/hutool-core/src/main/java/cn/hutool/core/clone/CloneSupport.java
index 9a6a8ffec..3ea2fcec3 100644
--- a/hutool-core/src/main/java/cn/hutool/core/clone/CloneSupport.java
+++ b/hutool-core/src/main/java/cn/hutool/core/clone/CloneSupport.java
@@ -7,7 +7,7 @@ package cn.hutool.core.clone;
* @param
- *
+ *
* @author Looly
* @since 4.5.9
*/
@@ -24,7 +24,7 @@ public class Base62 {
// -------------------------------------------------------------------- encode
/**
* Base62编码
- *
+ *
* @param source 被编码的Base62字符串
* @return 被加密后的字符串
*/
@@ -34,7 +34,7 @@ public class Base62 {
/**
* Base62编码
- *
+ *
* @param source 被编码的Base62字符串
* @param charset 字符集
* @return 被加密后的字符串
@@ -45,7 +45,7 @@ public class Base62 {
/**
* Base62编码
- *
+ *
* @param source 被编码的Base62字符串
* @return 被加密后的字符串
*/
@@ -55,7 +55,7 @@ public class Base62 {
/**
* Base62编码
- *
+ *
* @param in 被编码Base62的流(一般为图片流或者文件流)
* @return 被加密后的字符串
*/
@@ -65,7 +65,7 @@ public class Base62 {
/**
* Base62编码
- *
+ *
* @param file 被编码Base62的文件
* @return 被加密后的字符串
*/
@@ -76,7 +76,7 @@ public class Base62 {
// -------------------------------------------------------------------- decode
/**
* Base62解码
- *
+ *
* @param source 被解码的Base62字符串
* @return 被加密后的字符串
*/
@@ -86,7 +86,7 @@ public class Base62 {
/**
* Base62解码
- *
+ *
* @param source 被解码的Base62字符串
* @return 被加密后的字符串
*/
@@ -96,7 +96,7 @@ public class Base62 {
/**
* Base62解码
- *
+ *
* @param source 被解码的Base62字符串
* @param charset 字符集
* @return 被加密后的字符串
@@ -107,7 +107,7 @@ public class Base62 {
/**
* Base62解码
- *
+ *
* @param Base62 被解码的Base62字符串
* @param destFile 目标文件
* @return 目标文件
@@ -118,7 +118,7 @@ public class Base62 {
/**
* Base62解码
- *
+ *
* @param base62Str 被解码的Base62字符串
* @param out 写出到的流
* @param isCloseOut 是否关闭输出流
@@ -129,7 +129,7 @@ public class Base62 {
/**
* Base62解码
- *
+ *
* @param base62Str 被解码的Base62字符串
* @return 被加密后的字符串
*/
@@ -139,7 +139,7 @@ public class Base62 {
/**
* 解码Base62
- *
+ *
* @param base62bytes Base62输入
* @return 解码后的bytes
*/
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Base62Codec.java b/hutool-core/src/main/java/cn/hutool/core/codec/Base62Codec.java
index 30390584d..0dbc1fadd 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/Base62Codec.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/Base62Codec.java
@@ -48,16 +48,16 @@ public class Base62Codec implements Serializable{
/**
* 创建GMP风格的Base62编码解码器对象
- *
+ *
* @return Base62Codec
*/
public static Base62Codec createGmp() {
return new Base62Codec(GMP);
}
-
+
/**
* 创建Inverted风格的Base62编码解码器对象
- *
+ *
* @return Base62Codec
*/
public static Base62Codec createInverted() {
@@ -69,7 +69,7 @@ public class Base62Codec implements Serializable{
/**
* 构造
- *
+ *
* @param alphabet 自定义字母表
*/
public Base62Codec(byte[] alphabet) {
@@ -93,7 +93,7 @@ public class Base62Codec implements Serializable{
/**
* 解码Base62消息
- *
+ *
* @param encoded Base62内容
* @return 消息
*/
@@ -105,7 +105,7 @@ public class Base62Codec implements Serializable{
// --------------------------------------------------------------------------------------------------------------- Private method start
/**
* 按照字典转换bytes
- *
+ *
* @param indices 内容
* @param dictionary 字典
* @return 转换值
@@ -122,7 +122,7 @@ public class Base62Codec implements Serializable{
/**
* 使用定义的字母表从源基准到目标基准
- *
+ *
* @param message 消息bytes
* @param sourceBase 源基准长度
* @param targetBase 目标基准长度
@@ -167,7 +167,7 @@ public class Base62Codec implements Serializable{
/**
* 估算结果长度
- *
+ *
* @param inputLength 输入长度
* @param sourceBase 源基准长度
* @param targetBase 目标基准长度
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Base64Decoder.java b/hutool-core/src/main/java/cn/hutool/core/codec/Base64Decoder.java
index bcade12dd..7f2346519 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/Base64Decoder.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/Base64Decoder.java
@@ -8,7 +8,7 @@ import cn.hutool.core.util.StrUtil;
/**
* Base64解码实现
- *
+ *
* @author looly
*
*/
@@ -41,7 +41,7 @@ public class Base64Decoder {
/**
* base64解码
- *
+ *
* @param source 被解码的base64字符串
* @return 被加密后的字符串
*/
@@ -51,7 +51,7 @@ public class Base64Decoder {
/**
* base64解码
- *
+ *
* @param source 被解码的base64字符串
* @param charset 字符集
* @return 被加密后的字符串
@@ -62,7 +62,7 @@ public class Base64Decoder {
/**
* base64解码
- *
+ *
* @param source 被解码的base64字符串
* @return 被加密后的字符串
*/
@@ -72,7 +72,7 @@ public class Base64Decoder {
/**
* 解码Base64
- *
+ *
* @param in 输入
* @return 解码后的bytes
*/
@@ -85,7 +85,7 @@ public class Base64Decoder {
/**
* 解码Base64
- *
+ *
* @param in 输入
* @param pos 开始位置
* @param length 长度
@@ -133,7 +133,7 @@ public class Base64Decoder {
// ----------------------------------------------------------------------------------------------- Private start
/**
* 获取下一个有效的byte字符
- *
+ *
* @param in 输入
* @param pos 当前位置,调用此方法后此位置保持在有效字符的下一个位置
* @param maxPos 最大位置
@@ -157,7 +157,7 @@ public class Base64Decoder {
/**
* int包装,使之可变
- *
+ *
* @author looly
*
*/
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Base64Encoder.java b/hutool-core/src/main/java/cn/hutool/core/codec/Base64Encoder.java
index f5ba54699..a70ec5a7d 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/Base64Encoder.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/Base64Encoder.java
@@ -7,7 +7,7 @@ import java.nio.charset.Charset;
/**
* Base64编码
- *
+ *
* @author looly
* @since 3.2.0
*/
@@ -40,7 +40,7 @@ public class Base64Encoder {
// -------------------------------------------------------------------- encode
/**
* 编码为Base64,非URL安全的
- *
+ *
* @param arr 被编码的数组
* @param lineSep 在76个char之后是CRLF还是EOF
* @return 编码后的bytes
@@ -51,7 +51,7 @@ public class Base64Encoder {
/**
* 编码为Base64,URL安全的
- *
+ *
* @param arr 被编码的数组
* @param lineSep 在76个char之后是CRLF还是EOF
* @return 编码后的bytes
@@ -63,7 +63,7 @@ public class Base64Encoder {
/**
* base64编码
- *
+ *
* @param source 被编码的base64字符串
* @return 被加密后的字符串
*/
@@ -73,7 +73,7 @@ public class Base64Encoder {
/**
* base64编码,URL安全
- *
+ *
* @param source 被编码的base64字符串
* @return 被加密后的字符串
* @since 3.0.6
@@ -84,7 +84,7 @@ public class Base64Encoder {
/**
* base64编码
- *
+ *
* @param source 被编码的base64字符串
* @param charset 字符集
* @return 被加密后的字符串
@@ -95,7 +95,7 @@ public class Base64Encoder {
/**
* base64编码,URL安全的
- *
+ *
* @param source 被编码的base64字符串
* @param charset 字符集
* @return 被加密后的字符串
@@ -107,7 +107,7 @@ public class Base64Encoder {
/**
* base64编码
- *
+ *
* @param source 被编码的base64字符串
* @return 被加密后的字符串
*/
@@ -117,7 +117,7 @@ public class Base64Encoder {
/**
* base64编码,URL安全的
- *
+ *
* @param source 被编码的base64字符串
* @return 被加密后的字符串
* @since 3.0.6
@@ -129,7 +129,7 @@ public class Base64Encoder {
/**
* 编码为Base64
* 如果isMultiLine为{@code true},则每76个字符一个换行符,否则在一行显示
- *
+ *
* @param arr 被编码的数组
* @param isMultiLine 在76个char之后是CRLF还是EOF
* @param isUrlSafe 是否使用URL安全字符,一般为{@code false}
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java b/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java
index e583ef2c8..16e0be430 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/Morse.java
@@ -11,7 +11,7 @@ import cn.hutool.core.util.StrUtil;
/**
* 莫尔斯电码的编码和解码实现
* 参考:https://github.com/TakWolf/Java-MorseCoder
- *
+ *
* @author looly, TakWolf
* @since 4.4.1
*/
@@ -22,7 +22,7 @@ public class Morse {
/**
* 注册莫尔斯电码表
- *
+ *
* @param abc 字母和字符
* @param dict 二进制
*/
@@ -104,7 +104,7 @@ public class Morse {
/**
* 构造
- *
+ *
* @param dit 点表示的字符
* @param dah 横线表示的字符
* @param split 分隔符
@@ -117,13 +117,13 @@ public class Morse {
/**
* 编码
- *
+ *
* @param text 文本
* @return 密文
*/
public String encode(String text) {
Assert.notNull(text, "Text should not be null.");
-
+
text = text.toUpperCase();
final StringBuilder morseBuilder = new StringBuilder();
final int len = text.codePointCount(0, text.length());
@@ -140,7 +140,7 @@ public class Morse {
/**
* 解码
- *
+ *
* @param morse 莫尔斯电码
* @return 明文
*/
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/Rot.java b/hutool-core/src/main/java/cn/hutool/core/codec/Rot.java
index 48bb01c49..ff0cdd135 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/Rot.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/Rot.java
@@ -3,7 +3,7 @@ package cn.hutool.core.codec;
/**
* RotN(rotate by N places),回转N位密码,是一种简易的替换式密码,也是过去在古罗马开发的凯撒加密的一种变体。
* 代码来自:https://github.com/orclight/jencrypt
- *
+ *
* @author looly,shuzhilong
* @since 4.4.1
*/
@@ -18,7 +18,7 @@ public class Rot {
/**
* Rot-13编码,同时编码数字
- *
+ *
* @param message 被编码的消息
* @return 编码后的字符串
*/
@@ -28,7 +28,7 @@ public class Rot {
/**
* Rot-13编码
- *
+ *
* @param message 被编码的消息
* @param isEnocdeNumber 是否编码数字
* @return 编码后的字符串
@@ -39,7 +39,7 @@ public class Rot {
/**
* RotN编码
- *
+ *
* @param message 被编码的消息
* @param offset 位移,常用位移13
* @param isEnocdeNumber 是否编码数字
@@ -57,7 +57,7 @@ public class Rot {
/**
* Rot-13解码,同时解码数字
- *
+ *
* @param rot 被解码的消息密文
* @return 解码后的字符串
*/
@@ -67,7 +67,7 @@ public class Rot {
/**
* Rot-13解码
- *
+ *
* @param rot 被解码的消息密文
* @param isDecodeNumber 是否解码数字
* @return 解码后的字符串
@@ -78,7 +78,7 @@ public class Rot {
/**
* RotN解码
- *
+ *
* @param rot 被解码的消息密文
* @param offset 位移,常用位移13
* @param isDecodeNumber 是否解码数字
@@ -97,7 +97,7 @@ public class Rot {
// ------------------------------------------------------------------------------------------ Private method start
/**
* 解码字符
- *
+ *
* @param c 字符
* @param offset 位移
* @param isDecodeNumber 是否解码数字
@@ -129,7 +129,7 @@ public class Rot {
/**
* 编码字符
- *
+ *
* @param c 字符
* @param offset 位移
* @param isDecodeNumber 是否编码数字
diff --git a/hutool-core/src/main/java/cn/hutool/core/codec/package-info.java b/hutool-core/src/main/java/cn/hutool/core/codec/package-info.java
index 921d1fca3..16774acaa 100644
--- a/hutool-core/src/main/java/cn/hutool/core/codec/package-info.java
+++ b/hutool-core/src/main/java/cn/hutool/core/codec/package-info.java
@@ -1,6 +1,6 @@
/**
* BaseN以及BCD编码封装
- *
+ *
* @author looly
*
*/
diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ArrayIter.java b/hutool-core/src/main/java/cn/hutool/core/collection/ArrayIter.java
index 3a49b9c29..8463d6422 100644
--- a/hutool-core/src/main/java/cn/hutool/core/collection/ArrayIter.java
+++ b/hutool-core/src/main/java/cn/hutool/core/collection/ArrayIter.java
@@ -58,7 +58,7 @@ public class ArrayIter
* 参数为集合的情况请使用{@link PriorityQueue#addAll}
@@ -73,7 +73,7 @@ public class BoundedPriorityQueue
+ *
+ * 此方法来自Apache-Commons-Collections4。
+ *
+ * @param list1 列表1
+ * @param list2 列表2
+ * @return 是否相同
+ * @since 5.6.0
+ */
+ public static boolean isEqualList(final Collection> list1, final Collection> list2) {
+ if (list1 == null || list2 == null || list1.size() != list2.size()) {
+ return false;
+ }
+
+ return IterUtil.isEqualList(list1, list2);
+ }
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollectionUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollectionUtil.java
index a1273374b..dde70af56 100644
--- a/hutool-core/src/main/java/cn/hutool/core/collection/CollectionUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollectionUtil.java
@@ -2,7 +2,7 @@ package cn.hutool.core.collection;
/**
* 集合相关工具类,包括数组,是{@link CollUtil} 的别名工具类类
- *
+ *
* @author xiaoleilu
* @see CollUtil
*/
diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ConcurrentHashSet.java b/hutool-core/src/main/java/cn/hutool/core/collection/ConcurrentHashSet.java
index 631875fbe..4760f8b39 100644
--- a/hutool-core/src/main/java/cn/hutool/core/collection/ConcurrentHashSet.java
+++ b/hutool-core/src/main/java/cn/hutool/core/collection/ConcurrentHashSet.java
@@ -7,7 +7,7 @@ import java.util.concurrent.ConcurrentHashMap;
/**
* 通过{@link ConcurrentHashMap}实现的线程安全HashSet
- *
+ *
* @author Looly
*
* @param
* 触发因子为默认的0.75
- *
+ *
* @param initialCapacity 初始大小
*/
public ConcurrentHashSet(int initialCapacity) {
@@ -41,7 +41,7 @@ public class ConcurrentHashSet
* 为了解决并发情况下{@link Iterator}遍历导致的问题(当Iterator被修改会抛出ConcurrentModificationException)
* ,故使用复制原Iterator的方式解决此问题。
- *
+ *
* Enumeration to the Iterator interface
+ * Adapt the specified {@code Enumeration} to the {@code Iterator} interface
*
* @param
+ *
+ * 此方法来自Apache-Commons-Collections4。
+ *
+ * @param list1 列表1
+ * @param list2 列表2
+ * @return 是否相同
+ * @since 5.6.0
+ */
+ public static boolean isEqualList(final Iterable> list1, final Iterable> list2) {
+ if (list1 == list2) {
+ return true;
+ }
+
+ final Iterator> it1 = list1.iterator();
+ final Iterator> it2 = list2.iterator();
+ Object obj1;
+ Object obj2;
+ while (it1.hasNext() && it2.hasNext()) {
+ obj1 = it1.next();
+ obj2 = it2.next();
+
+ if (false == Objects.equals(obj1, obj2)) {
+ return false;
+ }
+ }
+
+ // 当两个Iterable长度不一致时返回false
+ return false == (it1.hasNext() || it2.hasNext());
+ }
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/IteratorEnumeration.java b/hutool-core/src/main/java/cn/hutool/core/collection/IteratorEnumeration.java
index 734a4602a..9beea2ca7 100644
--- a/hutool-core/src/main/java/cn/hutool/core/collection/IteratorEnumeration.java
+++ b/hutool-core/src/main/java/cn/hutool/core/collection/IteratorEnumeration.java
@@ -13,9 +13,9 @@ import java.util.Iterator;
*/
public class IteratorEnumeration
* 此对象遍历结束后,应关闭之,推荐使用方式:
- *
+ *
*
* LineIterator it = null;
* try {
@@ -30,7 +30,7 @@ import cn.hutool.core.lang.Assert;
* it.close();
* }
*
- *
+ *
* 此类来自于Apache Commons io
*
* @author looly
@@ -45,7 +45,7 @@ public class LineIter implements Iterator
+ * 此方法与{@link List#subList(int, int)} 不同在于子列表是新的副本,操作子列表不会影响原列表。
*
* @param
* 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -51,17 +51,17 @@ public class Convert {
* 转换为字符串
* 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
public static String toStr(Object value) {
return toStr(value, null);
}
-
+
/**
* 转换为String数组
- *
+ *
* @param value 被转换的值
* @return String数组
* @since 3.2.0
@@ -74,7 +74,7 @@ public class Convert {
* 转换为字符
* 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -87,17 +87,17 @@ public class Convert {
* 转换为字符
* 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
public static Character toChar(Object value) {
return toChar(value, null);
}
-
+
/**
* 转换为Character数组
- *
+ *
* @param value 被转换的值
* @return Character数组
* @since 3.2.0
@@ -110,7 +110,7 @@ public class Convert {
* 转换为byte
* 如果给定的值为{@code null},或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -123,17 +123,17 @@ public class Convert {
* 转换为byte
* 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
public static Byte toByte(Object value) {
return toByte(value, null);
}
-
+
/**
* 转换为Byte数组
- *
+ *
* @param value 被转换的值
* @return Byte数组
* @since 3.2.0
@@ -157,7 +157,7 @@ public class Convert {
* 转换为Short
* 如果给定的值为{@code null},或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -170,17 +170,17 @@ public class Convert {
* 转换为Short
* 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
public static Short toShort(Object value) {
return toShort(value, null);
}
-
+
/**
* 转换为Short数组
- *
+ *
* @param value 被转换的值
* @return Short数组
* @since 3.2.0
@@ -193,7 +193,7 @@ public class Convert {
* 转换为Number
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -206,17 +206,17 @@ public class Convert {
* 转换为Number
* 如果给定的值为空,或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
public static Number toNumber(Object value) {
return toNumber(value, null);
}
-
+
/**
* 转换为Number数组
- *
+ *
* @param value 被转换的值
* @return Number数组
* @since 3.2.0
@@ -229,7 +229,7 @@ public class Convert {
* 转换为int
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -242,7 +242,7 @@ public class Convert {
* 转换为int
* 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
@@ -264,7 +264,7 @@ public class Convert {
* 转换为long
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -277,7 +277,7 @@ public class Convert {
* 转换为long
* 如果给定的值为{@code null},或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
@@ -287,7 +287,7 @@ public class Convert {
/**
* 转换为Long数组
- *
+ *
* @param value 被转换的值
* @return 结果
*/
@@ -299,7 +299,7 @@ public class Convert {
* 转换为double
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -312,7 +312,7 @@ public class Convert {
* 转换为double
* 如果给定的值为空,或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
@@ -322,7 +322,7 @@ public class Convert {
/**
* 转换为Double数组
- *
+ *
* @param value 被转换的值
* @return 结果
*/
@@ -334,7 +334,7 @@ public class Convert {
* 转换为Float
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -347,7 +347,7 @@ public class Convert {
* 转换为Float
* 如果给定的值为空,或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
@@ -357,7 +357,7 @@ public class Convert {
/**
* 转换为Float数组
- *
+ *
* @param value 被转换的值
* @return 结果
*/
@@ -369,7 +369,7 @@ public class Convert {
* 转换为boolean
* String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -382,7 +382,7 @@ public class Convert {
* 转换为boolean
* 如果给定的值为空,或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
@@ -392,7 +392,7 @@ public class Convert {
/**
* 转换为Boolean数组
- *
+ *
* @param value 被转换的值
* @return 结果
*/
@@ -404,7 +404,7 @@ public class Convert {
* 转换为BigInteger
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -417,7 +417,7 @@ public class Convert {
* 转换为BigInteger
* 如果给定的值为空,或者转换失败,返回默认值{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
@@ -429,7 +429,7 @@ public class Convert {
* 转换为BigDecimal
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -442,19 +442,19 @@ public class Convert {
* 转换为BigDecimal
* 如果给定的值为空,或者转换失败,返回null
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
*/
public static BigDecimal toBigDecimal(Object value) {
return toBigDecimal(value, null);
}
-
+
/**
* 转换为Date
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
@@ -489,7 +489,7 @@ public class Convert {
public static LocalDateTime toLocalDateTime(Object value) {
return toLocalDateTime(value, null);
}
-
+
/**
* Instant
* 如果给定的值为空,或者转换失败,返回默认值
@@ -508,7 +508,7 @@ public class Convert {
* 转换为Date
* 如果给定的值为空,或者转换失败,返回{@code null}
* 转换失败不会报错
- *
+ *
* @param value 被转换的值
* @return 结果
* @since 4.1.6
@@ -516,11 +516,11 @@ public class Convert {
public static Date toDate(Object value) {
return toDate(value, null);
}
-
+
/**
* 转换为Enum对象
* 如果给定的值为空,或者转换失败,返回默认值
- *
+ *
* @param
* 如果给定的值为空,或者转换失败,返回默认值{@code null}
- *
+ *
* @param
* 当转换失败时返回{@code null}
- *
+ *
* @param
* 当转换失败时返回默认值
- *
+ *
* @param
* 如果参数为空,则返回原字符串,不报错。
- *
+ *
* @param str 被转码的字符串
* @param sourceCharset 原字符集
* @param destCharset 目标字符集
@@ -914,7 +914,7 @@ public class Convert {
/**
* 转换时间单位
- *
+ *
* @param sourceDuration 时长
* @param sourceUnit 源单位
* @param destUnit 目标单位
@@ -929,7 +929,7 @@ public class Convert {
// --------------------------------------------------------------- 原始包装类型转换
/**
* 原始类转为包装类,非原始类返回原类
- *
+ *
* @see BasicType#wrap(Class)
* @param clazz 原始类
* @return 包装类
@@ -941,7 +941,7 @@ public class Convert {
/**
* 包装类转为原始类,非包装类返回原类
- *
+ *
* @see BasicType#unWrap(Class)
* @param clazz 包装类
* @return 原始类
@@ -954,7 +954,7 @@ public class Convert {
// -------------------------------------------------------------------------- 数字和英文转换
/**
* 将阿拉伯数字转为英文表达方式
- *
+ *
* @param number {@link Number}对象
* @return 英文表达式
* @since 3.0.9
@@ -962,10 +962,25 @@ public class Convert {
public static String numberToWord(Number number) {
return NumberWordFormatter.format(number);
}
-
+
+ /**
+ * 将阿拉伯数字转为精简表示形式,例如:
+ *
+ *
+ * 1200 -》 1.2k
+ *
+ *
+ * @param number {@link Number}对象
+ * @return 英文表达式
+ * @since 5.5.9
+ */
+ public static String numberToSimple(Number number) {
+ return NumberWordFormatter.formatSimple(number.longValue());
+ }
+
/**
* 将阿拉伯数字转为中文表达方式
- *
+ *
* @param number 数字
* @param isUseTraditonal 是否使用繁体字(金额形式)
* @return 中文
@@ -974,10 +989,10 @@ public class Convert {
public static String numberToChinese(double number, boolean isUseTraditonal) {
return NumberChineseFormatter.format(number, isUseTraditonal);
}
-
+
/**
* 金额转为中文形式
- *
+ *
* @param n 数字
* @return 中文大写数字
* @since 3.2.3
@@ -988,11 +1003,11 @@ public class Convert {
}
return NumberChineseFormatter.format(n.doubleValue(), true, true);
}
-
+
// -------------------------------------------------------------------------- 数字转换
/**
* int转byte
- *
+ *
* @param intValue int值
* @return byte值
* @since 3.2.0
@@ -1003,7 +1018,7 @@ public class Convert {
/**
* byte转无符号int
- *
+ *
* @param byteValue byte值
* @return 无符号int值
* @since 3.2.0
@@ -1015,7 +1030,7 @@ public class Convert {
/**
* byte数组转short
- *
+ *
* @param bytes byte数组
* @return short值
* @since 3.2.0
@@ -1039,7 +1054,7 @@ public class Convert {
/**
* byte[]转int值
- *
+ *
* @param bytes byte数组
* @return int值
* @since 3.2.0
@@ -1053,7 +1068,7 @@ public class Convert {
/**
* int转byte数组
- *
+ *
* @param intValue int值
* @return byte数组
* @since 3.2.0
@@ -1070,7 +1085,7 @@ public class Convert {
/**
* long转byte数组
* from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java
- *
+ *
* @param longValue long值
* @return byte数组
* @since 3.2.0
@@ -1088,7 +1103,7 @@ public class Convert {
/**
* byte数组转long
* from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java
- *
+ *
* @param bytes byte数组
* @return long值
* @since 3.2.0
diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java b/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java
index 865bc3f93..22c0d057b 100644
--- a/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java
+++ b/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java
@@ -1,180 +1,182 @@
-package cn.hutool.core.convert;
-
-import cn.hutool.core.util.StrUtil;
-
-import java.text.DecimalFormat;
-
-/**
- * 将浮点数类型的number转换成英语的表达方式
- * 参考博客:http://blog.csdn.net/eric_sunah/article/details/8713226
- *
- * @author Looly
- * @since 3.0.9
- */
-public class NumberWordFormatter {
-
- private static final String[] NUMBER = new String[]{"", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN",
- "EIGHT", "NINE"};
- private static final String[] NUMBER_TEEN = new String[]{"TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN",
- "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"};
- private static final String[] NUMBER_TEN = new String[]{"TEN", "TWENTY", "THIRTY", "FORTY", "FIFTY", "SIXTY",
- "SEVENTY", "EIGHTY", "NINETY"};
- private static final String[] NUMBER_MORE = new String[]{"", "THOUSAND", "MILLION", "BILLION"};
-
- private static final String[] NUMBER_SUFFIX = new String[]{"k", "w", "", "m", "", "", "b", "", "", "t", "", "", "p", "", "", "e"};
-
- /**
- * 将阿拉伯数字转为英文表达式
- *
- * @param x 阿拉伯数字,可以为{@link Number}对象,也可以是普通对象,最后会使用字符串方式处理
- * @return 英文表达式
- */
- public static String format(Object x) {
- if (x != null) {
- return format(x.toString());
- } else {
- return "";
- }
- }
-
- /**
- * 将阿拉伯数字转化为简介计数单位,例如 2100 => 2.1k
- * 范围默认只到w
- * @param value
- * @return
- */
- public static String formatValue(long value) {
- return formatValue(value, true);
- }
-
- /**
- * 将阿拉伯数字转化为简介计数单位,例如 2100 => 2.1k
- * @param value 对应数字的值
- * @param isTwo 控制是否为k、w
- * @return
- */
- public static String formatValue(long value, boolean isTwo) {
- if (value < 1000) {
- return String.valueOf(value);
- }
- int index = -1;
- double res = value * 1.0d;
- while (res > 10 && (!isTwo || index < 1)) {
- if (res > 1000) {
- res = res / 1000;
- index++;
- }
- if (res > 10) {
- res = res / 10;
- index++;
- }
- }
- DecimalFormat decimalFormat = new DecimalFormat("#.##");
- return String.format("%s%s", decimalFormat.format(res), NUMBER_SUFFIX[index]);
- }
-
- /**
- * 将阿拉伯数字转为英文表达式
- *
- * @param x 阿拉伯数字字符串
- * @return 英文表达式
- */
- private static String format(String x) {
- int z = x.indexOf("."); // 取小数点位置
- String lstr, rstr = "";
- if (z > -1) { // 看是否有小数,如果有,则分别取左边和右边
- lstr = x.substring(0, z);
- rstr = x.substring(z + 1);
- } else {
- // 否则就是全部
- lstr = x;
- }
-
- String lstrrev = StrUtil.reverse(lstr); // 对左边的字串取反
- String[] a = new String[5]; // 定义5个字串变量来存放解析出来的叁位一组的字串
-
- switch (lstrrev.length() % 3) {
- case 1:
- lstrrev += "00";
- break;
- case 2:
- lstrrev += "0";
- break;
- }
- StringBuilder lm = new StringBuilder(); // 用来存放转换后的整数部分
- for (int i = 0; i < lstrrev.length() / 3; i++) {
- a[i] = StrUtil.reverse(lstrrev.substring(3 * i, 3 * i + 3)); // 截取第一个三位
- if (false == "000".equals(a[i])) { // 用来避免这种情况:1000000 = one million
- // thousand only
- if (i != 0) {
- lm.insert(0, transThree(a[i]) + " " + parseMore(i) + " "); // 加:
- // thousand、million、billion
- } else {
- // 防止i=0时, 在多加两个空格.
- lm = new StringBuilder(transThree(a[i]));
- }
- } else {
- lm.append(transThree(a[i]));
- }
- }
-
- String xs = ""; // 用来存放转换后小数部分
- if (z > -1) {
- xs = "AND CENTS " + transTwo(rstr) + " "; // 小数部分存在时转换小数
- }
-
- return lm.toString().trim() + " " + xs + "ONLY";
- }
-
- private static String parseFirst(String s) {
- return NUMBER[Integer.parseInt(s.substring(s.length() - 1))];
- }
-
- private static String parseTeen(String s) {
- return NUMBER_TEEN[Integer.parseInt(s) - 10];
- }
-
- private static String parseTen(String s) {
- return NUMBER_TEN[Integer.parseInt(s.substring(0, 1)) - 1];
- }
-
- private static String parseMore(int i) {
- return NUMBER_MORE[i];
- }
-
- // 两位
- private static String transTwo(String s) {
- String value;
- // 判断位数
- if (s.length() > 2) {
- s = s.substring(0, 2);
- } else if (s.length() < 2) {
- s = "0" + s;
- }
-
- if (s.startsWith("0")) {// 07 - seven 是否小於10
- value = parseFirst(s);
- } else if (s.startsWith("1")) {// 17 seventeen 是否在10和20之间
- value = parseTeen(s);
- } else if (s.endsWith("0")) {// 是否在10与100之间的能被10整除的数
- value = parseTen(s);
- } else {
- value = parseTen(s) + " " + parseFirst(s);
- }
- return value;
- }
-
- // 制作叁位的数
- // s.length = 3
- private static String transThree(String s) {
- String value;
- if (s.startsWith("0")) {// 是否小於100
- value = transTwo(s.substring(1));
- } else if ("00".equals(s.substring(1))) {// 是否被100整除
- value = parseFirst(s.substring(0, 1)) + " HUNDRED";
- } else {
- value = parseFirst(s.substring(0, 1)) + " HUNDRED AND " + transTwo(s.substring(1));
- }
- return value;
- }
-}
\ No newline at end of file
+package cn.hutool.core.convert;
+
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * 将浮点数类型的number转换成英语的表达方式
+ * 参考博客:http://blog.csdn.net/eric_sunah/article/details/8713226
+ *
+ * @author Looly,totalo
+ * @since 3.0.9
+ */
+public class NumberWordFormatter {
+
+ private static final String[] NUMBER = new String[]{"", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN",
+ "EIGHT", "NINE"};
+ private static final String[] NUMBER_TEEN = new String[]{"TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN",
+ "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"};
+ private static final String[] NUMBER_TEN = new String[]{"TEN", "TWENTY", "THIRTY", "FORTY", "FIFTY", "SIXTY",
+ "SEVENTY", "EIGHTY", "NINETY"};
+ private static final String[] NUMBER_MORE = new String[]{"", "THOUSAND", "MILLION", "BILLION"};
+
+ private static final String[] NUMBER_SUFFIX = new String[]{"k", "w", "", "m", "", "", "b", "", "", "t", "", "", "p", "", "", "e"};
+
+ /**
+ * 将阿拉伯数字转为英文表达式
+ *
+ * @param x 阿拉伯数字,可以为{@link Number}对象,也可以是普通对象,最后会使用字符串方式处理
+ * @return 英文表达式
+ */
+ public static String format(Object x) {
+ if (x != null) {
+ return format(x.toString());
+ } else {
+ return StrUtil.EMPTY;
+ }
+ }
+
+ /**
+ * 将阿拉伯数字转化为简洁计数单位,例如 2100 =》 2.1k
+ * 范围默认只到w
+ *
+ * @param value 被格式化的数字
+ * @return 格式化后的数字
+ * @since 5.5.9
+ */
+ public static String formatSimple(long value) {
+ return formatSimple(value, true);
+ }
+
+ /**
+ * 将阿拉伯数字转化为简介计数单位,例如 2100 =》 2.1k
+ *
+ * @param value 对应数字的值
+ * @param isTwo 控制是否为只为k、w,例如当为{@code false}时返回4.38m,{@code true}返回438.43w
+ * @return 格式化后的数字
+ * @since 5.5.9
+ */
+ public static String formatSimple(long value, boolean isTwo) {
+ if (value < 1000) {
+ return String.valueOf(value);
+ }
+ int index = -1;
+ double res = value;
+ while (res > 10 && (false == isTwo || index < 1)) {
+ if (res > 1000) {
+ res = res / 1000;
+ index++;
+ }
+ if (res > 10) {
+ res = res / 10;
+ index++;
+ }
+ }
+ return String.format("%s%s", NumberUtil.decimalFormat("#.##", res), NUMBER_SUFFIX[index]);
+ }
+
+ /**
+ * 将阿拉伯数字转为英文表达式
+ *
+ * @param x 阿拉伯数字字符串
+ * @return 英文表达式
+ */
+ private static String format(String x) {
+ int z = x.indexOf("."); // 取小数点位置
+ String lstr, rstr = "";
+ if (z > -1) { // 看是否有小数,如果有,则分别取左边和右边
+ lstr = x.substring(0, z);
+ rstr = x.substring(z + 1);
+ } else {
+ // 否则就是全部
+ lstr = x;
+ }
+
+ String lstrrev = StrUtil.reverse(lstr); // 对左边的字串取反
+ String[] a = new String[5]; // 定义5个字串变量来存放解析出来的叁位一组的字串
+
+ switch (lstrrev.length() % 3) {
+ case 1:
+ lstrrev += "00";
+ break;
+ case 2:
+ lstrrev += "0";
+ break;
+ }
+ StringBuilder lm = new StringBuilder(); // 用来存放转换后的整数部分
+ for (int i = 0; i < lstrrev.length() / 3; i++) {
+ a[i] = StrUtil.reverse(lstrrev.substring(3 * i, 3 * i + 3)); // 截取第一个三位
+ if (false == "000".equals(a[i])) { // 用来避免这种情况:1000000 = one million
+ // thousand only
+ if (i != 0) {
+ lm.insert(0, transThree(a[i]) + " " + parseMore(i) + " "); // 加:
+ // thousand、million、billion
+ } else {
+ // 防止i=0时, 在多加两个空格.
+ lm = new StringBuilder(transThree(a[i]));
+ }
+ } else {
+ lm.append(transThree(a[i]));
+ }
+ }
+
+ String xs = ""; // 用来存放转换后小数部分
+ if (z > -1) {
+ xs = "AND CENTS " + transTwo(rstr) + " "; // 小数部分存在时转换小数
+ }
+
+ return lm.toString().trim() + " " + xs + "ONLY";
+ }
+
+ private static String parseFirst(String s) {
+ return NUMBER[Integer.parseInt(s.substring(s.length() - 1))];
+ }
+
+ private static String parseTeen(String s) {
+ return NUMBER_TEEN[Integer.parseInt(s) - 10];
+ }
+
+ private static String parseTen(String s) {
+ return NUMBER_TEN[Integer.parseInt(s.substring(0, 1)) - 1];
+ }
+
+ private static String parseMore(int i) {
+ return NUMBER_MORE[i];
+ }
+
+ // 两位
+ private static String transTwo(String s) {
+ String value;
+ // 判断位数
+ if (s.length() > 2) {
+ s = s.substring(0, 2);
+ } else if (s.length() < 2) {
+ s = "0" + s;
+ }
+
+ if (s.startsWith("0")) {// 07 - seven 是否小於10
+ value = parseFirst(s);
+ } else if (s.startsWith("1")) {// 17 seventeen 是否在10和20之间
+ value = parseTeen(s);
+ } else if (s.endsWith("0")) {// 是否在10与100之间的能被10整除的数
+ value = parseTen(s);
+ } else {
+ value = parseTen(s) + " " + parseFirst(s);
+ }
+ return value;
+ }
+
+ // 制作叁位的数
+ // s.length = 3
+ private static String transThree(String s) {
+ String value;
+ if (s.startsWith("0")) {// 是否小於100
+ value = transTwo(s.substring(1));
+ } else if ("00".equals(s.substring(1))) {// 是否被100整除
+ value = parseFirst(s.substring(0, 1)) + " HUNDRED";
+ } else {
+ value = parseFirst(s.substring(0, 1)) + " HUNDRED AND " + transTwo(s.substring(1));
+ }
+ return value;
+ }
+}
diff --git a/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java b/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java
index ccb4f009c..43108471b 100644
--- a/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java
+++ b/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java
@@ -694,7 +694,6 @@ public class FastDatePrinter extends AbstractDateBasic implements DatePrinter {
*
*/
UnpaddedMonthField() {
- super();
}
/**
@@ -833,7 +832,6 @@ public class FastDatePrinter extends AbstractDateBasic implements DatePrinter {
* Constructs an instance of {@code TwoDigitYearField}.
*/
TwoDigitYearField() {
- super();
}
/**
@@ -873,7 +871,6 @@ public class FastDatePrinter extends AbstractDateBasic implements DatePrinter {
* Constructs an instance of {@code TwoDigitMonthField}.
*/
TwoDigitMonthField() {
- super();
}
/**
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FastStringWriter.java b/hutool-core/src/main/java/cn/hutool/core/io/FastStringWriter.java
index e9c751b06..aabdf84fa 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/FastStringWriter.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/FastStringWriter.java
@@ -27,7 +27,6 @@ public final class FastStringWriter extends Writer {
* @param initialSize 初始容量
*/
public FastStringWriter(int initialSize) {
- super();
if (initialSize < 0) {
initialSize = StrBuilder.DEFAULT_CAPACITY;
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java
index 0e6659a5f..3da7555a4 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java
@@ -5,7 +5,7 @@ import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentSkipListMap;
import cn.hutool.core.util.StrUtil;
@@ -23,7 +23,15 @@ public class FileTypeUtil {
private static final Map
@@ -129,4 +130,21 @@ public class TreeNode