set = new HashSet<>();
while (set.size() < size) {
set.add(begin + ran.nextInt(end - begin));
}
- Integer[] ranArr = set.toArray(new Integer[size]);
- return ranArr;
+ return set.toArray(new Integer[size]);
}
// ------------------------------------------------------------------------------------------- range
@@ -1553,14 +1550,7 @@ public class NumberUtil {
* @since 3.0.1
*/
public static int compare(int x, int y) {
- if (x == y) {
- return 0;
- }
- if (x < y) {
- return -1;
- } else {
- return 1;
- }
+ return Integer.compare(x, y);
}
/**
@@ -1574,14 +1564,7 @@ public class NumberUtil {
* @since 3.0.1
*/
public static int compare(long x, long y) {
- if (x == y) {
- return 0;
- }
- if (x < y) {
- return -1;
- } else {
- return 1;
- }
+ return Long.compare(x, y);
}
/**
@@ -1595,14 +1578,7 @@ public class NumberUtil {
* @since 3.0.1
*/
public static int compare(short x, short y) {
- if (x == y) {
- return 0;
- }
- if (x < y) {
- return -1;
- } else {
- return 1;
- }
+ return Short.compare(x, y);
}
/**
@@ -1616,7 +1592,7 @@ public class NumberUtil {
* @since 3.0.1
*/
public static int compare(byte x, byte y) {
- return x - y;
+ return Byte.compare(x, y);
}
/**
@@ -2078,7 +2054,7 @@ public class NumberUtil {
* @since 4.0.7
*/
public static int partValue(int total, int partCount, boolean isPlusOneWhenHasRem) {
- int partValue = 0;
+ int partValue;
if (total % partCount == 0) {
partValue = total / partCount;
} else {
@@ -2222,7 +2198,7 @@ public class NumberUtil {
* byte数组转int,使用大端字节序(高位字节在前,低位字节在后)
* 见:http://www.ruanyifeng.com/blog/2016/11/byte-order.html
*
- * @param bytes
+ * @param bytes byte数组
* @return int
* @since 4.4.5
*/
@@ -2307,6 +2283,24 @@ public class NumberUtil {
return new BigInteger(1, mag);
}
+ /**
+ * 检查是否为有效的数字
+ * 检查Double和Float是否为无限大,或者Not a Number
+ * 非数字类型和Null将返回true
+ *
+ * @param number 被检查类型
+ * @return 检查结果,非数字类型和Null将返回true
+ * @since 4.6.7
+ */
+ public static boolean isValidNumber(Number number) {
+ if (number instanceof Double) {
+ return (false == ((Double) number).isInfinite()) && (false == ((Double) number).isNaN());
+ } else if (number instanceof Float) {
+ return (false == ((Float) number).isInfinite()) && (false == ((Float) number).isNaN());
+ }
+ return true;
+ }
+
// ------------------------------------------------------------------------------------------- Private method start
private static int mathSubnode(int selectNum, int minNum) {
if (selectNum == minNum) {
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java
index d507e42f5..6c758b223 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java
@@ -13,10 +13,7 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.Map;
+import java.util.*;
/**
* 对象工具类,包括判空、克隆、序列化等操作
@@ -37,10 +34,11 @@ public class ObjectUtil {
* @param obj1 对象1
* @param obj2 对象2
* @return 是否相等
+ * @see Objects#equals(Object, Object)
*/
public static boolean equal(Object obj1, Object obj2) {
// return (obj1 != null) ? (obj1.equals(obj2)) : (obj2 == null);
- return (obj1 == obj2) || (obj1 != null && obj1.equals(obj2));
+ return Objects.equals(obj1, obj2);
}
/**
@@ -120,7 +118,7 @@ public class ObjectUtil {
* Array
*
*
- * @param obj 对象
+ * @param obj 对象
* @param element 元素
* @return 是否包含
*/
@@ -138,7 +136,7 @@ public class ObjectUtil {
return ((Collection>) obj).contains(element);
}
if (obj instanceof Map) {
- return ((Map, ?>) obj).values().contains(element);
+ return ((Map, ?>) obj).containsValue(element);
}
if (obj instanceof Iterator) {
@@ -176,7 +174,7 @@ public class ObjectUtil {
/**
* 检查对象是否为null
* 判断标准为:
- *
+ *
*
* 1. == null
* 2. equals(null)
@@ -265,8 +263,8 @@ public class ObjectUtil {
* ObjectUtil.defaultIfNull(Boolean.TRUE, *) = Boolean.TRUE
*
*
- * @param 对象类型
- * @param object 被检查对象,可能为{@code null}
+ * @param 对象类型
+ * @param object 被检查对象,可能为{@code null}
* @param defaultValue 被检查对象为{@code null}返回的默认值,可以为{@code null}
* @return 被检查对象为{@code null}返回默认值,否则返回原值
* @since 3.0.7
@@ -325,7 +323,7 @@ public class ObjectUtil {
*/
@SuppressWarnings("unchecked")
public static T cloneByStream(T obj) {
- if (null == obj || false == (obj instanceof Serializable)) {
+ if (false == (obj instanceof Serializable)) {
return null;
}
final FastByteArrayOutputStream byteOut = new FastByteArrayOutputStream();
@@ -352,7 +350,7 @@ public class ObjectUtil {
* @return 序列化后的字节码
*/
public static byte[] serialize(T obj) {
- if (null == obj || false == (obj instanceof Serializable)) {
+ if (false == (obj instanceof Serializable)) {
return null;
}
@@ -369,12 +367,12 @@ public class ObjectUtil {
}
return byteOut.toByteArray();
}
-
+
/**
* 反序列化
* 对象必须实现Serializable接口
*
- * @param 对象类型
+ * @param 对象类型
* @param bytes 反序列化的字节码
* @return 反序列化后的对象
* @see #unserialize(byte[])
@@ -387,13 +385,13 @@ public class ObjectUtil {
* 反序列化
* 对象必须实现Serializable接口
*
- * @param 对象类型
+ * @param 对象类型
* @param bytes 反序列化的字节码
* @return 反序列化后的对象
*/
@SuppressWarnings("unchecked")
public static T unserialize(byte[] bytes) {
- ObjectInputStream ois = null;
+ ObjectInputStream ois;
try {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bais);
@@ -423,16 +421,8 @@ public class ObjectUtil {
* @return 检查结果,非数字类型和Null将返回true
*/
public static boolean isValidIfNumber(Object obj) {
- if (obj != null && obj instanceof Number) {
- if (obj instanceof Double) {
- if (((Double) obj).isInfinite() || ((Double) obj).isNaN()) {
- return false;
- }
- } else if (obj instanceof Float) {
- if (((Float) obj).isInfinite() || ((Float) obj).isNaN()) {
- return false;
- }
- }
+ if (obj instanceof Number) {
+ return NumberUtil.isValidNumber((Number) obj);
}
return true;
}
@@ -441,8 +431,8 @@ public class ObjectUtil {
* {@code null}安全的对象比较,{@code null}对象排在末尾
*
* @param 被比较对象类型
- * @param c1 对象1,可以为{@code null}
- * @param c2 对象2,可以为{@code null}
+ * @param c1 对象1,可以为{@code null}
+ * @param c2 对象2,可以为{@code null}
* @return 比较结果,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0
* @see java.util.Comparator#compare(Object, Object)
* @since 3.0.7
@@ -454,9 +444,9 @@ public class ObjectUtil {
/**
* {@code null}安全的对象比较
*
- * @param 被比较对象类型
- * @param c1 对象1,可以为{@code null}
- * @param c2 对象2,可以为{@code null}
+ * @param 被比较对象类型
+ * @param c1 对象1,可以为{@code null}
+ * @param c2 对象2,可以为{@code null}
* @param nullGreater 当被比较对象为null时是否排在前面
* @return 比较结果,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0
* @see java.util.Comparator#compare(Object, Object)
@@ -480,7 +470,7 @@ public class ObjectUtil {
/**
* 获得给定类的第一个泛型参数
*
- * @param obj 被检查的对象
+ * @param obj 被检查的对象
* @param index 泛型类型的索引号,既第几个泛型类型
* @return {@link Class}
* @since 3.0.8
@@ -490,7 +480,12 @@ public class ObjectUtil {
}
/**
- * 将Object转为String
+ * 将Object转为String
+ * 策略为:
+ *
+ * 1、null转为"null"
+ * 2、调用Convert.toStr(Object)转换
+ *
*
* @param obj Bean对象
* @return Bean所有字段转为Map后的字符串
@@ -498,10 +493,10 @@ public class ObjectUtil {
*/
public static String toString(Object obj) {
if (null == obj) {
- return "null";
+ return StrUtil.NULL;
}
if (obj instanceof Map) {
- return ((Map, ?>) obj).toString();
+ return obj.toString();
}
return Convert.toStr(obj);
diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/Mode.java b/hutool-crypto/src/main/java/cn/hutool/crypto/Mode.java
index 2b964e249..a9a1fc0b7 100644
--- a/hutool-crypto/src/main/java/cn/hutool/crypto/Mode.java
+++ b/hutool-crypto/src/main/java/cn/hutool/crypto/Mode.java
@@ -9,17 +9,17 @@ package cn.hutool.crypto;
public enum Mode{
/** 无模式 */
NONE,
- /** Cipher Block Chaining */
+ /** 密码分组连接模式(Cipher Block Chaining) */
CBC,
- /** Cipher Feedback */
+ /** 密文反馈模式(Cipher Feedback) */
CFB,
- /** A simplification of OFB */
+ /** 计数器模式(A simplification of OFB) */
CTR,
/** Cipher Text Stealing */
CTS,
- /** Electronic Codebook */
+ /** 电子密码本模式(Electronic CodeBook) */
ECB,
- /** Output Feedback */
+ /** 输出反馈模式(Output Feedback) */
OFB,
/** Propagating Cipher Block */
PCBC;