Java中BigDecimal 工具类

简介: Java中BigDecimal 工具类

public class BigDecimalUtil {

/**
 * 系统精度
 */
public static int scaleSystem = 2;

@Value("${lzb.basic.computationScale:2}")
public void setScaleSystem(int scaleCustom) {
    BigDecimalUtil.scaleSystem = scaleCustom;
}

/**
 * 系统精度
 *
 * @return
 */
private static int getScaleSystem() {
    return scaleSystem;
}

/**
 * 默认精度
 */
private static int scaleDefault = 8;
/**
 * 默认精度 系统超长精度
 */
private static int scaleDefaultMax = 16;

/**
 * 加
 * Add big decimal.
 *
 * @param v1 the v 1
 * @param v2 the v 2
 * @return the big decimal
 */
public static BigDecimal add(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.add(b2);
}

public static BigDecimal add(String v1, String v2) {
    BigDecimal b1 = new BigDecimal(v1);
    BigDecimal b2 = new BigDecimal(v2);
    return b1.add(b2);
}

/**
 * 加
 * Add big decimal.
 *
 * @param b1 the v 1
 * @param b1 the v 2
 * @return the big decimal
 */
public static BigDecimal add(BigDecimal b1, BigDecimal b2) {
    return b1.add(b2);
}

/**
 * 减
 * Sub big decimal.
 *
 * @param v1 the v 1
 * @param v2 the v 2
 * @return the big decimal
 */
public static BigDecimal sub(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.subtract(b2);
}

public static BigDecimal sub(String v1, String v2) {
    BigDecimal b1 = new BigDecimal(v1);
    BigDecimal b2 = new BigDecimal(v2);
    return b1.subtract(b2);
}

/**
 * 减
 * Sub big decimal.
 *
 * @param v1 the v 1
 * @param v2 the v 2
 * @return the big decimal
 */
public static BigDecimal sub(BigDecimal v1, BigDecimal v2) {
    return v1.subtract(v2);
}


/**
 * 乘
 * Mul big decimal.
 *
 * @param v1 the v 1
 * @param v2 the v 2
 * @return the big decimal
 */
public static BigDecimal mul(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.multiply(b2);
}

public static BigDecimal mul(String v1, String v2) {
    BigDecimal b1 = new BigDecimal(v1);
    BigDecimal b2 = new BigDecimal(v2);
    return b1.multiply(b2);
}

/**
 * 乘
 * Mul big decimal.
 *
 * @param v1 the v 1
 * @param v2 the v 2
 * @return the big decimal
 */
public static BigDecimal mul(BigDecimal v1, BigDecimal v2) {
    return v1.multiply(v2);
}

/**
 * 除
 * Div big decimal.
 *
 * @param v1 the v 1
 * @param v2 the v 2
 * @return the big decimal
 */
public static BigDecimal div(double v1, double v2, int scale) {
    if (scale < 0) {
        throw new IllegalArgumentException("The scale must be a positive integer or zero");
    }
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.divide(b2, scale, RoundingMode.HALF_UP);
}

public static BigDecimal div(String v1, String v2) {
    BigDecimal b1 = new BigDecimal(v1);
    BigDecimal b2 = new BigDecimal(v2);
    return b1.divide(b2);
}

/**
 * 除
 * Div big decimal.
 *
 * @param v1 the v 1
 * @param v2 the v 2
 * @return the big decimal
 */
public static BigDecimal div(double v1, double v2) {
    return div(v1, v2, scaleDefault);
}

/**
 * 除
 * Div big decimal.
 *
 * @param v1 the v 1
 * @param v2 the v 2
 * @return the big decimal
 */
public static BigDecimal div(BigDecimal v1, BigDecimal v2, int scale) {
    if (scale < 0) {
        throw new IllegalArgumentException("The scale must be a positive integer or zero");
    }
    return v1.divide(v2, scale, RoundingMode.HALF_UP);
}

/**
 * 除
 * Div big decimal.
 *
 * @param v1 the v 1
 * @param v2 the v 2
 * @return the big decimal
 */
public static BigDecimal divScale(BigDecimal v1, BigDecimal v2) {
    return div(v1, v2, getScaleSystem());
}

/**
 * 除
 * Div big decimal.
 *
 * @param v1 the v 1
 * @param v2 the v 2
 * @return the big decimal
 */
public static BigDecimal div(BigDecimal v1, BigDecimal v2) {
    return div(v1, v2, scaleDefault);
}

/**
 * 提供精确的小数位四舍五入处理。
 * Div big decimal.
 *
 * @param v1 the v 1
 * @return the big decimal
 */
public static BigDecimal round(double v1, int scale) {
    if (scale < 0) {
        throw new IllegalArgumentException("The scale must be a positive integer or zero");
    }
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal("1");
    return b1.divide(b2, scale, RoundingMode.HALF_UP);
}

public static BigDecimal round(double v1) {
    return round(v1, scaleDefault);
}

public static BigDecimal roundScale(double v1) {
    return round(v1, getScaleSystem());
}

/**
 * 提供精确的小数位四舍五入处理。
 * Div big decimal.
 *
 * @param v1 the v 1
 * @return the big decimal
 */
public static BigDecimal round(BigDecimal v1, int scale) {
    if (scale < 0) {
        throw new IllegalArgumentException("The scale must be a positive integer or zero");
    }
    BigDecimal b2 = new BigDecimal("1");
    return v1.divide(b2, scale, RoundingMode.HALF_UP);
}

/**
 * 提供精确的小数位四舍五入处理。
 * Div big decimal.
 *
 * @param v1 the v 1
 * @return the big decimal
 */
public static BigDecimal round(BigDecimal v1) {
    return round(v1, scaleDefault);
}

/**
 * 提供精确的小数位四舍五入处理。
 * Div big decimal.
 *
 * @param v1 the v 1
 * @return the big decimal
 */
public static BigDecimal roundScale(BigDecimal v1) {
    return round(v1, getScaleSystem());
}

/**
 * 判断不为空,并且大于0
 *
 * @param a
 * @return
 */
public static boolean isNotNullAndGreaterThan0(BigDecimal a) {
    if (a == null) {
        return false;
    }
    return a.compareTo(BigDecimal.ZERO) > 0;
}

/**
 * 判断不为空
 *
 * @param a
 * @return
 */
public static boolean isNotNull(BigDecimal a) {
    if (a == null) {
        return false;
    }
    return true;
}

/**
 * 创建, 但是 值可以为 Null
 *
 * @param str
 * @return
 */
public static BigDecimal createBigDecimal(String str) {
    return NumberUtils.createBigDecimal(str);
}

/**
 * 赋值,自动判断 null,如果为null 时,自动返回 value值
 *
 * @param str
 * @param value 默认值
 * @return
 */
public static BigDecimal toBigDecimal(BigDecimal str, BigDecimal value) {
    if (!isNotNull(str)) {
        return value;
    }
    return str;
}

/**
 * 比较大小
 * 返回  -1  小 , 0 相等  ,1 大
 *
 * @param b1
 * @param b2
 * @return
 */
public static int compare(BigDecimal b1, BigDecimal b2) {
    return b1.compareTo(b2);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数
 *
 * @param str
 * @param scale
 * @return
 */
public static BigDecimal toBigDecimal(String str, int scale) {
    return NumberUtils.toScaledBigDecimal(str, scale, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(String str) {
    return NumberUtils.toScaledBigDecimal(str, scaleDefault, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalDefault(String str) {
    return NumberUtils.toScaledBigDecimal(str, scaleDefaultMax, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 指定 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalScale(String str) {
    return NumberUtils.toScaledBigDecimal(str, getScaleSystem(), RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal2(String str) {
    return NumberUtils.toScaledBigDecimal(str, 2, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 4 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal4(String str) {
    return NumberUtils.toScaledBigDecimal(str, 4, RoundingMode.HALF_UP);
}

/**
 * BigDecimal 转换 为 BigDecimal ,保留小数位数
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(BigDecimal str, int scale) {
    return NumberUtils.toScaledBigDecimal(str, scale, RoundingMode.HALF_UP);
}

/**
 * BigDecimal 转换 为 BigDecimal ,保留小数位数  2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(BigDecimal str) {
    return NumberUtils.toScaledBigDecimal(str, scaleDefault, RoundingMode.HALF_UP);
}

/**
 * BigDecimal 转换 为 BigDecimal ,保留小数位数  2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalDefault(BigDecimal str) {
    return NumberUtils.toScaledBigDecimal(str, scaleDefaultMax, RoundingMode.HALF_UP);
}

/**
 * BigDecimal 转换 为 BigDecimal ,保留小数位数  指定 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalScale(BigDecimal str) {
    return NumberUtils.toScaledBigDecimal(str, getScaleSystem(), RoundingMode.HALF_UP);
}

/**
 * BigDecimal 转换 为 BigDecimal ,保留小数位数  2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal2(BigDecimal str) {
    return NumberUtils.toScaledBigDecimal(str, 2, RoundingMode.HALF_UP);
}

/**
 * BigDecimal 转换 为 BigDecimal ,保留小数位数  2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal4(BigDecimal str) {
    return NumberUtils.toScaledBigDecimal(str, 4, RoundingMode.HALF_UP);
}

/**
 * Double 转换 为 BigDecimal ,保留小数位数  2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal2(Double str) {
    return NumberUtils.toScaledBigDecimal(str, 2, RoundingMode.HALF_UP);
}

/**
 * Double 转换 为 BigDecimal ,保留小数位数  2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(Double str) {
    return NumberUtils.toScaledBigDecimal(str, scaleDefault, RoundingMode.HALF_UP);
}

/**
 * Double 转换 为 BigDecimal ,保留小数位数  2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalDefault(Double str) {
    return NumberUtils.toScaledBigDecimal(str, scaleDefaultMax, RoundingMode.HALF_UP);
}

/**
 * Double 转换 为 BigDecimal ,保留小数位数  指定 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalScale(Double str) {
    return NumberUtils.toScaledBigDecimal(str, getScaleSystem(), RoundingMode.HALF_UP);
}

/**
 * Double 转换 为 BigDecimal ,保留小数位数  4 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal4(Double str) {
    return NumberUtils.toScaledBigDecimal(str, 4, RoundingMode.HALF_UP);
}

/**
 * Double 转换 为 BigDecimal ,保留小数位数
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(Double str, int scale) {
    return NumberUtils.toScaledBigDecimal(str, scale, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(Float str) {
    return NumberUtils.toScaledBigDecimal(str, scaleDefault, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalDefault(Float str) {
    return NumberUtils.toScaledBigDecimal(str, scaleDefaultMax, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal2(Float str) {
    return NumberUtils.toScaledBigDecimal(str, 2, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 4 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal4(Float str) {
    return NumberUtils.toScaledBigDecimal(str, 4, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 指定 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(Float str, int scale) {
    return NumberUtils.toScaledBigDecimal(str, scale, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 指定 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalScale(Float str) {
    return NumberUtils.toScaledBigDecimal(str, getScaleSystem(), RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(int str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scaleDefault, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalDefault(int str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scaleDefaultMax, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal2(int str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), 2, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 4 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal4(int str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), 4, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 n 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(int str, int scale) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scale, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 指定 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalScale(int str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), getScaleSystem(), RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(long str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scaleDefault, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalDefault(long str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scaleDefaultMax, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal2(long str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), 2, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 4 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal4(long str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), 4, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 n 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(long str, int scale) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scale, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 n 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalScale(long str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), getScaleSystem(), RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(float str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scaleDefault, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalDefault(float str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scaleDefaultMax, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal2(float str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), 2, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 4 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal4(float str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), 4, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 n 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(float str, int scale) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scale, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 n 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalScale(float str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), getScaleSystem(), RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(double str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scaleDefault, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalDefault(double str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scaleDefaultMax, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal2(double str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), 2, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 4 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal4(double str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), 4, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 4 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal(double str, int scale) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), scale, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 4 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimalScale(double str) {
    return NumberUtils.toScaledBigDecimal(String.valueOf(str), getScaleSystem(), RoundingMode.HALF_UP);
}

}

相关文章
|
27天前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
|
4月前
|
Java
【Java】Math、System、RunTime、BigDecimal类常用方法
【Java】Math、System、RunTime、BigDecimal类常用方法
|
2月前
|
安全 Java
java BigDecimal 的赋值一个常量
在 Java 中,`BigDecimal` 是一个用于精确计算的类,特别适合处理需要高精度和小数点运算的场景。如果你需要给 `BigDecimal` 赋值一个常量,可以使用其静态方法 `valueOf` 或者直接通过字符串构造函数。 以下是几种常见的方法来给 `BigDecimal` 赋值一个常量: ### 使用 `BigDecimal.valueOf` 这是推荐的方式,因为它可以避免潜在的精度问题。 ```java import java.math.BigDecimal; public class BigDecimalExample { public static void
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
156 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2月前
|
Java
Java 些许公共工具类
Java 些许公共工具类
18 1
|
4月前
|
缓存 前端开发 Java
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
【8月更文挑战第10天】java基础巩固,工具类的封装
30 1
|
4月前
|
Java
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
|
4月前
|
安全 Java
12 Java常用类(二)(String类+时间类+BigDecimal类等等)
12 Java常用类(二)(String类+时间类+BigDecimal类等等)
43 2
|
4月前
|
存储 设计模式 安全
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
72 0
|
5月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
70 1