常用类之BigDecimal类、Date类、Calendar类、SimpleDateFormat类及System类

常用类

1.BigDecimal类

  • 引言: 很多实际应用中需要精确运算,而double是近似值存储,不在符合要求,需要借助BIgDecimal。

  • BigDecimal

    • 位置:java.math包中
    • 作用:精确计算浮点数
    • 基本类型存储在栈中,引用类型存储在堆中
    • 创建方式:BigDecimal bd=new BigDecimal("1.0");
  • 方法:
    BigDecimal add(BigDecimal db);//加
    BigDecimal subtract(BigDecimal db);//减
    BigDecimal multiply(BigDecimal db);//乘
    BigDecimal divide(BigDecimal db);//除

  • 除法:divide(BigDecimal bd,int scal,RoundingMode mode)

    • 参数scal:指定精确到小数点后几位。
    • 参数mode:指定小数部分的取舍模式,通常采用四舍五入的模式,取值为BigDecimal.ROUND_HALF_UP。

1.1 BigDecimal代码演示

package classes.demo08;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class TestBigDecimal {
    public static void main(String[] args) {
        double d1=1.0;//double 是近似值存储
        double d2=0.9;
        System.out.println(d1-d2);//输出0.09999999999999998

        //面式题
        double result=(1.4-0.5)/0.9;
        System.out.println(result);//输出0.9999999999999999

        //BigDecimal,大的浮点数精确计算
        BigDecimal bd1 = new BigDecimal("1.0");
        BigDecimal bd2 = new BigDecimal("0.9");
        //加法
        BigDecimal r1 = bd1.add(bd2);
        System.out.println(r1);
        //减法
        BigDecimal r2 = bd1.subtract(bd2);
        System.out.println(r2);
        //乘法
        BigDecimal r3 = bd1.multiply(bd2);
        System.out.println(r3);

        //先减再除法
        BigDecimal r5 = new BigDecimal("1.4").
                subtract(new BigDecimal("0.5")).
                divide(new BigDecimal("0.9"));//除法
        System.out.println(r5);

        //除法时除不尽会报错,要用重载的选择保留几位小数的divide()方法
        //四舍五入的取法BigDecimal.ROUND_HALF_UP

        //除不尽的情况,保留小数位              //RoundingMode.HALF_UP:4舍5入法
        //BigDecimal r6 = new BigDecimal("10").divide(new BigDecimal("3"),5,BigDecimal.ROUND_HALF_UP);
        BigDecimal result1 = new BigDecimal("20").divide(new BigDecimal("3"),3,BigDecimal.ROUND_HALF_UP); // 10 除以 3,保留 5 位小数,采用四舍五入
        System.out.println(result1);



    }
}



运行结果

0.09999999999999998
0.9999999999999999
1.9
0.1
0.90
1
6.667


2.Date类

  • Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代。

  • 时间单位

    • 1秒=1000毫秒
    • 1毫秒=1000微秒
    • 1微秒=1000纳秒

2.1 Date类使用代码演示

package classes.demo08;

import java.util.Date;
/*
在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的
Date 类。这个类最主要的作用就是获取当前时间,我们来看下 Date 类的使用:
使用 Date 类的默认无参构造方法创建出的对象就代表当前时间,我们可以直接输出 Date 对象显示当前的时间
其中, Wed 代表 Wednesday (星期三), Jun 代表 June (六月), 11 代表 11 号, CST 代表 China Standard Time (中国标准时间,也就是北京时间,东八区)。

从上面的输出结果中,我们发现,默认的时间格式不是很友好,与我们日常看到的日期格式不太一样,如果想要按指定的格式进行显示,如 2014-06-11 09:22:30 ,那该怎么做呢?
此时就到了 java.text 包中的 SimpleDateFormat 类大显身手的时候了!!可以使用 SimpleDateFormat
来对日期时间进行格式化,如可以将日期转换为指定格式的文本,也可将文本转换为日期。

具体参考博客:https://blog.csdn.net/silent0001/article/details/100149282?spm=1001.2014.3001.5502
* */
public class TestDate {
    public static void main(String[] args) {
        //1 创建Date对象
        Date date = new Date();
        //今天
        //d1.toString() 以字符串的形式打印

        //使用 Date 类的默认无参构造方法创建出的对象就代表当前时间,我们可以直接输出 Date 对象显示当前的时间
        System.out.println(date.toString());//Fri Jul 01 14:18:52 CST 2022
        System.out.println(date.toLocaleString());//2022-7-1 14:18:52


        //昨天
        Date d1=new Date(date.getTime()-60*60*24*1000);
        System.out.println(d1.toLocaleString());
        //2 方法 after before  (返回的是Boolean类型)
        boolean result = date.after(d1);//今天是否在昨天之后  true
        System.out.println(result);

        boolean beforeresult = date.before(d1);
        System.out.println(beforeresult);//false

        //比较compareTo()  比较(比的是毫秒值)(返回的为int)
        System.out.println(date.compareTo(d1));
        //equals()  判断是否相等,返回Boolean类型
        System.out.println(date.equals(d1));


    }
}



运行结果

Fri Jul 01 19:01:04 CST 2022
2022-7-1 19:01:04
2022-6-30 19:01:04
true
false
1
false

3.Calendar类

  • 引言: Date 类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法却遭到众多批评,不建议使用,更推荐使用 Calendar 类进行时间和日期的处理

    • java.util.Calendar 类是一个抽象类,可以通过调用 getInstance() 静态方法获取一个 Calendar 对象,此对象已由当前日期时间初始化,即默认代表当前时间
  • Calendar

    • Calendar提供了获取或设置各种日历字段的方法。
    • 构造方法:protected Calendar()由于修饰符是protected,所以无法直接创建该对象
  • 方法


       方法名               说明     
static Calendar() 设置默认时区和区域获取日历
void set(int year, int mouth, int date, int hourofday, int minute, int second) 设置日历的年月日时分秒
int get(int field) 返回给定日历字段的值,字段比如年月日等
void setTime(Date date) 用给定的Date设置此日历的时间
Date getTime() 返回一个Date表示日历的时间
void add(int field, int amount) 按照日立的规则,给指定字段添加或减少时间量
long getTimeInMillies() 毫秒为单位返回该日历的时间值

3.1 Calendar 类方法使用代码演示

package classes.demo08;

import java.util.Calendar;

public class TestCalender {
    public static void main(String[] args) {
        //1 创建Calendar对象   Protected Calendar() 由于修饰符是protected,所以无法之间创建对象。  但是可以通过getInstance()方法
        Calendar instance = Calendar.getInstance();

        System.out.println(instance.toString());//和date还不一样,并不是我们需要的信息

        System.out.println(instance.getTimeInMillis());
        //打印时间,要使用getTime()方法
        System.out.println(instance.getTime().toLocaleString());
        //2 获取时间信息

        //获取年
        int year = instance.get(instance.YEAR);
        //获取月
        int month = instance.get(instance.MONTH);
        //获取日
        int day = instance.get(instance.DAY_OF_MONTH);
        //获取小时
        int hour = instance.get(instance.HOUR_OF_DAY);
        //获取分钟
        int minute = instance.get(instance.MINUTE);
        //获取秒
        int second = instance.get(instance.SECOND);

        //输出(注意月要加一)  因为外国是0-11个月
        System.out.println(year+"年"+(month+1)+"月"+day+"日"+"  "+hour+"时"+minute+"分"+second+"秒");

        //3 修改时间
        //先创建一个时间
        Calendar calendar = Calendar.getInstance();
        //调用set方法
        calendar.set(calendar.HOUR_OF_DAY,1);//小时变为1
        System.out.println(calendar.getTime().toLocaleString());

        //用add方法修改时间
        calendar.add(calendar.MONTH,-1);//相当于把小时减一
        System.out.println(calendar.getTime().toLocaleString());
        // 补充方法   判断月有多少天
        int actualMaximum = calendar.getActualMaximum(calendar.DAY_OF_MONTH);//最多天数
        int actualMinimum = calendar.getActualMinimum(calendar.DAY_OF_MONTH);
        System.out.println(actualMaximum);
        System.out.println(actualMinimum);


    }
}



运行结果

java.util.GregorianCalendar[time=1656674064029,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=6,WEEK_OF_YEAR=27,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=182,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=14,SECOND=24,MILLISECOND=29,ZONE_OFFSET=28800000,DST_OFFSET=0]
1656674064029
2022-7-1 19:14:24
2022年7月1日  19时14分24秒
2022-7-1 1:14:24
2022-6-1 1:14:24
30
1

4.SimpleDateFormat类

  • SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类
  • 进行格式化(日期→文本)、解析(文本→日期)
  • 常用的时间模式字母

      字母          日期或时间           示例     
y 2019
M 年中月份 08
d 月中天数 10
H 一天中小时(0-23) 22
m 分钟 16
s 59
S 毫秒 356


4.1 SimpleDateFormat类常用方法代码演示:

package classes.demo08;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestSimpleDateFormat {
    public static void main(String[] args) throws ParseException {
        //1 创建SimpleDATeFormat对象 y年 M月
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
        //SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

        //2 创建Date  获取时间
        Date date = new Date();
        //调用format()方法  格式化date(把日期转成字符串)
        String format = simpleDateFormat.format(date);
        System.out.println(format);

        //调用parse()方法  解析(把字符串转为日期)(字符-->日期)

        // 使用时需要和前后日期格式一致
        Date parse = simpleDateFormat.parse("2022/07/01");//需抛出异常
        System.out.println(parse);

    }
}


运行结果

2022/07/01
Fri Jul 01 00:00:00 CST 2022

5.System类

  • 主要用于获取系统的属性数据和其他操作,构造方法私有的
  • 方法

       方法名               说明     
static void arraycopy(...) 复制数组
static long currentTimeMillis(); 获取当前系统时间,返回毫秒值
static void gc(); 建议jvm赶快启动垃圾回收期器回收垃圾
static void exit(int status); 退出jvm 如果参数是0表示正常退出jvm;非0表示异常退出

5.1 System类方法代码演示:

package classes.demo08;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println(name+"被回收了");
    }
}


package classes.demo08;

public class TestSystem {
    public static void main(String[] args) {

        //1 arraycopy(),数据复制
       int[] arry={15,35,52,45,78,90,56};
       int[] ints=new int[7];

        //System.arraycopy(src,srcPos,dest,destPos,length);
        //src:源数组
        //srcPos:从哪个位置开始复制
        //dest:目标数组
        //destPos:目标数组的位置
        //length:复制的长度

       System.arraycopy(arry,3,ints,0,3);
        for (int anInt : ints) {
            System.out.println(anInt);
        }


        //2 currentTimeMillis(),获取时间
        System.out.println(System.currentTimeMillis());

        long star = System.currentTimeMillis();
        int result=0;
        for (int i = -99999; i < 99999; i++) {
            for (int i1 = -999999; i1 < 99999; i1++) {
                result=i+i1;
            }

        }
        //计时   currentTimeMillis()方法主要用于计代码时间
        long end = System.currentTimeMillis();
        System.out.println("用时:"+(end-star));

        //3 gc(),垃圾回收
        //匿名使用后,会自动回收
        Student st1 = new Student("小米", 19);
        Student st2 = new Student("小明", 20);
        new Student("xiaoxiao",18);
        new Student("xiaobai",21);

        System.gc();// 垃圾回收,在另一个类中重写 finalize() 方法,显示是否回收,当没有对象引用可能就会被回收

        //4 exit(0),退出

        System.exit(0);//退出JVM
        System.out.println("执行结束");//不会被执行



    }
}


运行结果

45
78
90
0
0
0
0
1656676265134
用时:6
xiaobai被回收了
xiaoxiao被回收了


3.更多参考

千峰教育-常用类

posted @ 2022-07-01 19:53  哼哼哈¥  阅读(86)  评论(0编辑  收藏  举报