常用类
BigDecimal类
案例:
public class Demo07 { public static void main(String[] args) { double d1 = 1.0; double d2 = 0.9; System.out.println(d1-d2); } } //结果:0.09999999999999998
精度丢失问题 近似数存储
BigDecimal类解决精度问题 精度计算浮点数
//BigDecimal 大的浮点数精确计算 BigDecimal bd1 = new BigDecimal("1.0");//一定要用字符串 BigDecimal bd2 = new BigDecimal("0.9");//一定要用字符串 BigDecimal r1 = bd1.subtract(bd2);//减法运算,不是基本类型不能直接- 需要方法 System.out.println(r1); //加 BigDecimal r2 = bd1.add(bd2); System.out.println(r2); //乘 BigDecimal r3 = bd1.multiply(bd2); System.out.println(r3); //除 BigDecimal r4 = new BigDecimal("1.4") .subtract(new BigDecimal("0.5")) .divide(new BigDecimal("0.9")); System.out.println(r4); //如果除不尽 报异常 java.lang.ArithmeticException 需要我们设置保留几位小数 BigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3"),2, RoundingMode.HALF_UP);//保留两位小数 四舍五入 System.out.println(r5); /* 结果: 0.1 1.9 0.90 1 3.33 */
Date类
精确到毫秒 大部分方法已经被Calendar类中的方法取代
package studyObject.packet; import java.util.Date; public class DateStudy { public static void main(String[] args) { //今天 Date date = new Date(); System.out.println(date.toString()); System.out.println(date.toLocaleString()); //昨天 Date date1 = new Date(date.getTime()-60*60*24*1000); System.out.println(date1.toLocaleString()); boolean after = date.after(date1);//判断date是否是在date1后 System.out.println(after); boolean before = date.before(date1);//判断date是否是在date1前 System.out.println(before); int compareTo = date.compareTo(date1);//比较两个的毫秒值 System.out.println(compareTo); boolean equals = date.equals(date1);//比较是否相等 System.out.println(equals); } } /* Mon Jul 17 21:34:05 GMT+08:00 2023 2023-7-17 21:34:05 2023-7-16 21:34:05 true false 1 false */
Calendar类
提供获取或设置各种日历字段的方法
构造方法是protected 无法直接创建该对象
package studyObject.packet; import java.util.Calendar; public class CalendarStudy { public static void main(String[] args) { //Calendar对象无法直接创建 需要 Calendar calendar = Calendar.getInstance(); System.out.println(calendar.getTime().toLocaleString());//2023-7-17 21:40:07 System.out.println(calendar.getTimeInMillis());//1689601240042 毫秒 //获取时间信息 //获取年 int year = calendar.get(Calendar.YEAR); //月 从0开始 到11 int mouth = calendar.get(Calendar.MONTH); //日 int day = calendar.get(Calendar.DAY_OF_MONTH);//Date //小时 int hour = calendar.get(Calendar.HOUR_OF_DAY);//HOUR_OF_DAY 24小时 Hour 12小时 //分 int minute = calendar.get(Calendar.MINUTE); //秒 int second = calendar.get(Calendar.SECOND); System.out.println(year+"年"+(mouth+1)+"月"+day+"日"+hour+"时"+minute+"分"+second+"秒");//2023年7月17日21时47分46秒 //修改时间 Calendar calendar1 = Calendar.getInstance(); calendar1.set(Calendar.DAY_OF_MONTH,5); System.out.println(calendar1.getTime().toLocaleString());//2023-7-5 21:52:06 日被修改 //添加时间 calendar1.add(Calendar.HOUR,1); System.out.println(calendar1.getTime().toLocaleString());//2023-7-5 22:53:27 添加了一个小时 //减一个小时 就把1改-1 //补充 int max = calendar1.getActualMaximum(Calendar.DAY_OF_MONTH);//当前日的最大值 int min = calendar1.getActualMinimum(Calendar.DAY_OF_MONTH);//当前日的最小值 System.out.println(max);//31 System.out.println(min);//1 } }
SimplDateFormat类
以与语言环境有关的方式来格式化和解析日期的具体类
进行格式化(日期->文本 解析(文本->日期
常用时间模式字母
y -》年 M --》年中月份 d--》月中天数 H--》一天中小时数(0-23)
m--》分钟 s--》秒 S--》毫秒
package studyObject.packet; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDateFormatStudy { public static void main(String[] args) throws ParseException { //创建对象 // y -》年 M --》年中月份 d--》月中天数 H--》一天中小时数(0-23) //m--》分钟 s--》秒 S--》毫秒 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //创建Date Date date = new Date(); //格式化date String str = sdf.format(date); System.out.println(str);//2023年07月17日 22:28:51 //解析 Date date2 = sdf.parse("1990年12月15日 12:32:22");//格式要和上面一样 System.out.println(date2);//Sat Dec 15 12:32:22 GMT+08:00 1990 } }
System类
系统类,主要用于获取系统的属性数据和其他操作,构造方法私有,不需要创建对象直接用
package studyObject.packet; import java.util.Arrays; public class SystemStudy { public static void main(String[] args) { //复制数组 //src 原数组 //srcPos 从原数组那个位置开始复制 //dest: 目标数组 //destPos 目标数组的位置 //length 复制的长度 int[] src={20,15,30,45,23,21,48,74}; int[] dest=new int[8]; System.arraycopy(src,0,dest,0,src.length);// for (int i = 0; i < dest.length; i++) { System.out.println(dest[i]); } //Arrays.copyOf()也是复制 他使用arraycopy来实现复制 System.out.println(System.currentTimeMillis());//获得当前时间的毫秒数 // System.gc();//告诉垃圾回收器回收垃圾, 是否回收看垃圾回收器自己 // System.exit(0);//退出JVM 0正常退出 非0非正常退出 } }
Math类
对数值数据进行常见的数学操作 比如平方根 幂次 sin值等
使用:直接使用类名.方法名调用就行
Math类的构造方法是私有化,无法创建对象
package studyObject.packet; public class MathStudy { public static void main(String[] args) { //获取绝对值 int abs = Math.abs(-9); System.out.println(abs);//9 //向上取整 double ceil = Math.ceil(12.3); System.out.println(ceil);//13.0 //向下取整 double floor = Math.floor(12.3); System.out.println(floor);//12.0 //四舍五入 long round = Math.round(12.4); System.out.println(round);//12 //返回一个随机数m 0.0<= m <1.0 double random = Math.random(); System.out.println(random);//0.5102154436962966 } }
Random类
用来获取随机数
//创建随机对象 Random random = new Random(); System.out.println(random.nextInt(10));//2014176306 返回0 到10 之间的随机整数 左闭右开
枚举类 Enum
问题:
我们在声明变量记录数据,变量需要声明变量的类型,但是类型的声明不会限制变量的取值,就会出现:
String sex ;
我们只想sex接受男/女 但是我们赋值一个其他的字符串,语法上也是合理的
这样就会造成非法数据任然被接受,造成数据异常
解决:
在声明变量时需要指定变量的取值范围
实现:
枚举
枚举:
package studyObject.packet; public enum MyEnum { 男,女 }
调用:
package studyObject.packet; public class TestEnum { public static void main(String[] args) { EnumStudy enumStudy = new EnumStudy("张三",MyEnum.男); //变量赋值必须使用枚举类.数据 } }
创建需要生成的对象
package studyObject.packet; //枚举 /** * */ public class EnumStudy { private String uname; public MyEnum sex; //写出get set方法 重写toString 写出构造方法 }
支持结合switch使用
使用场景,当我们需要对一个对象的取值范围限定时考虑使用枚举