一、大数值运算类
1、整数类型的大数值运算类 - BigInteger
BigInteger 通过字符串进行赋值初始化,调用方法实现加减乘除
BigInteger big1 = new BigInteger("123456789123456789123456789"); BigInteger big2 = new BigInteger("123456789123456789123456789"); BigInteger add = big1.add(big2);//加法 System.out.println(add); BigInteger subtract = big1.subtract(big2);//减法 System.out.println(subtract); BigInteger multiply = big1.multiply(big2);//乘法 System.out.println(multiply); BigInteger divide = big1.divide(big2);//除法 System.out.println(divide);
2、小数类型的大数值运算类 - BigDecimal
double类型在1以内的运算会损失精度
BigDecimal big1 = new BigDecimal("0.5"); BigDecimal big2 = new BigDecimal("0.4"); BigDecimal add = big1.add(big2);//加法 System.out.println(add); BigDecimal subtract = big1.subtract(big2);//减法 System.out.println(subtract); BigDecimal multiply = big1.multiply(big2);//乘法 System.out.println(multiply); BigDecimal divide = big1.divide(big2);//除法 System.out.println(divide);
小数除法一定要设置保留几位小数 和 进制模式
BigDecimal big1 = new BigDecimal("10"); BigDecimal big2 = new BigDecimal("3"); //除法 //big1除以big2,保留俩位小数,并进行四舍五入 BigDecimal divide = big1.divide(big2, 2, BigDecimal.ROUND_HALF_UP); System.out.println(divide);
二、枚举 ( Enum )
枚举引入:编写季节类(Season),该类只有四个对象(spring,summer,autumn,winter)
public class Season { public static final Season spring = new Season("春天", "万物复苏"); public static final Season summer = new Season("夏天", "汗如雨下"); public static final Season autumn = new Season("秋天", "秋高气爽"); public static final Season winter = new Season("冬天", "寒风凛冽"); private String name; private String info; private Season() { } private Season(String name, String info) { this.name = name; this.info = info; } . . . . . . } public class Test01 { public static void main(String[] args) { System.out.println(Season.spring); System.out.println(Season.summer); System.out.println(Season.autumn); System.out.println(Season.winter); } }
也可以使用枚举解决这个问题,对象使用方式与上方代码相同
package com.dream.enum02; //底层实现:public class Season extends Enum public enum Season{ //默认:public static final Season spring("春天","春雨绵绵"), summer("夏天","大汗淋漓"), autumn("秋天","硕果累累"), winter("冬天","银装素裹"); private String name; private String info; private Season() { } private Season(String name, String info) { this.name = name; this.info = info; } ............ }
枚举里没有定义方法,可以在最后一个对象后面加逗号、分号或什么都不加
public enum Color { //枚举里没有定义方法,可以在最后一个对象后面加逗号、分号或什么都不加 // RED,GREEN,BLUE // RED,GREEN,BLUE, RED,GREEN,BLUE; }
枚举的常用方法
//通过字符串获取到枚举类中的对象 Season season1 = Enum.valueOf(Season.class, "spring"); System.out.println(season1); //获取到Season枚举类中所有的对象 Season[] values = Season.values(); for (Season season : values) { System.out.println(season); } //通过字符串获取到枚举类中的对象 Season season2 = Season.valueOf("summer"); System.out.println(season2); //获取到枚举对象的名字 String name = season2.name(); System.out.println(name); //获取Season枚举类字节码文件对象 Class<Season> c = season2.getDeclaringClass(); System.out.println(c);
枚举案例 - 状态机
public enum Signal{ RED, YELLOW, GREEN } public class Test01 { public static void main(String[] args) { /** * 枚举案例 - 状态机 */ Scanner scan = new Scanner(System.in); System.out.println("请输入信号灯:RED, YELLOW, GREEN"); String next = scan.next(); Signal signal = Signal.valueOf(next); switch (signal) { case RED: System.out.println("红灯停"); break; case YELLOW: System.out.println("黄灯请注意"); break; case GREEN: System.out.println("绿灯行"); break; } scan.close(); } }
枚举案例 - 错误码/状态码
执行方法后通过返回状态码的枚举对象,便于处理状态信息和输出状态信息
public enum AddCode{ ERROR_1(-1,"添加失败 - 学生信息不合法"), ERROR_2(-2,"添加失败 - 有重复学生"), OK(1,"添加成功"); private int code; private String info; private AddCode() { } private AddCode(int code, String info) { this.code = code; this.info = info; } ............ @Override public String toString() { return code + " -- " + info; } }
枚举案例 - 组织枚举
使用类或者接口把众多的枚举组织起来
Java类在编译时会自动为 enum 类型加上static修饰符;
就是说,在类中组织 enum,如果你不给它修饰为 public,那么只能在本包中进行访问。
//使用类组织枚举 public class Code { /** //使用接口组织枚举 public interface Code{ */ //类默认添加static //接口默认添加public static enum UpdateCode{ ERROR_1(-1,"修改失败 - 学生信息不合法"), ERROR_2(-2,"修改失败 - 没有该学生"), ERROR_3(-3,"修改失败 - 修改类型错误"), ERROR_4(-4,"修改失败 - 修改数据类型错误"), ERROR_5(-5,"修改失败 - 修改数据不合法"), ERROR_6(-6,"修改失败 - 目标班级上有该学生"), ERROR_7(-7,"修改失败 - 目标学号上有该学生"), OK(1,"修改成功"); private int code; private String info; private UpdateCode() { } private UpdateCode(int code, String info) { this.code = code; this.info = info; } ............ } //类默认添加static //接口默认添加public static enum DeleteCode{ ERROR_1(-1,"删除失败 - 学生信息不合法"), ERROR_2(-2,"删除失败 - 没有该学生"), OK(1,"删除成功"); private int code; private String info; private DeleteCode() { } private DeleteCode(int code, String info) { this.code = code; this.info = info; } ............ } //类默认添加static //接口默认添加public static enum AddCode{ ERROR_1(-1,"添加失败 - 学生信息不合法"), ERROR_2(-2,"添加失败 - 有重复学生"), OK(1,"添加成功"); private int code; private String info; private AddCode() { } private AddCode(int code, String info) { this.code = code; this.info = info; } ............ } }
Java接口在编译时会自动为enum类型加上public static修饰符;
经验:一般使用接口组织
枚举案例:策略枚举
需求:计算所有员工的工资
分析:
员工分类:行政人员、教师
行政人员:基本工资 + 绩效
教师:基本工资 + 课时费*课时 + 绩效枚举中可以有抽象方法,但是该抽象方法必须有实现方法,即
enum Salary{ java(StaffType.teacher),//java部门 python(StaffType.teacher),//python部门 principal(StaffType.administrative),//总经办(校长)部门 reception(StaffType.administrative);//前台部门 private StaffType staffType; private Salary(StaffType staffType) { this.staffType = staffType; } public double getSalary(double baseSalary, int classHour, double teachingHourSubsidy,double achievements){ return staffType.calculationSalary(baseSalary, classHour, teachingHourSubsidy, achievements); } //员工类型 enum StaffType{ //匿名内部类的对象 administrative{//行政人员类型 @Override public double calculationSalary(double baseSalary, int classHour, double teachingHourSubsidy,double achievements) { BigDecimal bigBaseSalary = new BigDecimal(String.valueOf(baseSalary)); BigDecimal bigAchievements = new BigDecimal(String.valueOf(achievements)); BigDecimal big = bigBaseSalary.add(bigAchievements); return big.doubleValue(); } }, teacher{//教师类型 @Override public double calculationSalary(double baseSalary, int classHour, double teachingHourSubsidy,double achievements) { BigDecimal bigBaseSalary = new BigDecimal(String.valueOf(baseSalary)); BigDecimal bigClassHour = new BigDecimal(String.valueOf(classHour)); BigDecimal bigTeachingHourSubsidy = new BigDecimal(String.valueOf(teachingHourSubsidy)); BigDecimal bigAchievements = new BigDecimal(String.valueOf(achievements)); BigDecimal big = bigClassHour.multiply(bigTeachingHourSubsidy).add(bigBaseSalary).add(bigAchievements); return big.doubleValue(); } }; //计算工资 //该抽象方法对应上方内部枚举中匿名类对象 public abstract double calculationSalary(double baseSalary, int classHour,double teachingHourSubsidy,double achievements); } }
枚举策略使用
double salary1 = Salary.java.getSalary(1800, 88, 15, 400); System.out.println(salary1); double salary2 = Salary.principal.getSalary(20000, 0, 0, 20000); System.out.println(salary2); double salary3 = Salary.reception.getSalary(1200, 0, 0, 200); System.out.println(salary3);