5.6 System类与Runtime类
5.6.1 System类
Java
不支持全局函数和全局变量,Java
设计者将一些与系统相关的重要函数和变量收集到了一个System
类中,System
类中的所有成员都是静态的,当要应用这些变量和方法的时候,直接使用System
类名做前缀就可以了。
1. exit()方法
终止当前正在运行的虚拟机,参数用作状态码,按照惯例,非0的状态码表示异常终止。事实上要退出Java
程序,可以使用destory()
退出一个独立运行的过程。
2. currentTimeMills方法
System.currentTimeMills()
产生一个当前的毫秒数,这个毫秒就是自1970年1月1日0时起的毫秒数。
5.6.2 Runtime类
Runtime
类封装了Java
命令本身所启动的实例进程,也就是封装了Java
虚拟机进程。一个Java
虚拟机对应一个Runtime
实例对象。Runtime
类中的许多方法和System
类中的方法重复,不能直接创建Runtime
的实例对象,也就是不能通过new
来创建,只能通过Runtime.getRuntime
静态方法来获得Runtime
实例对象的引用。
Java
虚拟机本身就是Windows
上的一个进程,这个进程可以启动其他的Windows
程序,通过这种方式启动的Windows
程序实例就称为子进程。Java
虚拟机调用Runtime
的exec
方法可以启动这个子进程,其返回值就是代表子进程的Process对象。
Process类是一个抽象类,封装一个进程。
5.7 Date类和Carlendar类
Java
语言提供了以下两个类来处理日期。
java.util.Date
包装了一个long
类型的数据,表示与GMT
(格林威治标准时间)的1970年1月1日00:00:00这一刻所相距的毫秒数。java.util.Calendar
可以灵活地设置或读取日期中的年,月,日,时,分,秒等信息。
5.7.1 Date类
java.util
包中的Date
类表示特定的时间,精确到毫秒。使用Date
类的无参构造函数Date()
创建的对象可以获取本地当前时间。
Date();
分配Date
对象并初始化此对象,以表示分配它的时间(精确到毫秒)。在类Date
所有可以接受或返回年,月,日,小时,分钟和秒值的方法中,将使用下面的表示形式。
- 年份
y
由整数y-1900表示- 月份由从0-11的整数表示。0是一月,1是二月等,因此11是十二月。
- 日期(一月中的某天)按通常方式由整数1-31表示
- 小时由从0-23的整数表示,因此从午夜到1 a.m.的时间是0点,从中午到1 p.m.的时间是12点。
- 分钟按通常方式由0-59的整数表示。
- 秒由0-61的整数表示,值60和61只对闰秒发生,尽管那样,也只用在实际正确跟踪闰秒的
Java
实现中。若按当前引入闰秒的方式,两个闰秒在同一分钟内发生是极不可能的,但此规范遵循ISO C的日期和时间约定。
3中格式输出时间
Date nowTime = new Date();
System.out.println(nowTime);
SimpleDateFormat matter1 = new SimpleDateFormat("'time':yyyy年mm月dd日E 北京时间");
System.out.println(matter1.format(nowTime));
SimpleDateFormat matter2 = new SimpleDateFormat("北京时间:yyyy年mm月dd日hh时mm分ss秒");
System.out.println(matter2.format(nowTime));
Date date1 = new Date(1000);
Date date2 = new Date(-1000);
System.out.println(matter2.format(date1));
System.out.println(matter2.format(date2));
System.out.println(new Date(System.currentTimeMillis()));
Tue Apr 17 21:54:20 CST 2018
time:2018年54月17日星期二 北京时间
北京时间:2018年54月17日09时54分20秒
北京时间:1970年00月01日08时00分01秒
北京时间:1970年59月01日07时59分59秒
Tue Apr 17 21:54:20 CST 2018
5.7.2 Calendar类
java.util.Calendar
类是一个抽象类。它为特定瞬间与一组诸如YEAR
,MONTH
,DAY_OF_MONTH
,HOUR
等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
抽象类不能采用new
实例化,但可以使用Calendar
类的static
方法getInstance()
初始化一个日历对象。
Calendar calendar = Calendar.getInstance();
set
和get
方法可用来设置和读取日期的特定部分,比如年,月,日,时,分,秒等。
将日历翻到任何一个时间,参数year取负数时表示公元前。
public int get(int field);
可以获取有关年份,月份,小时,星期等信息,参数field
的有效值由Calendar
的静态常量指定。
calendar.get(Calendar.MONTH);
返回一个整数,如果该整数是0表示当前日历是在一月,该整数是1表示当前日历是在二月等。
public long getTimeInMillis();
返回此calendar的时间值,以毫秒为单位。
public class GregorianCalendar1 {
public static void main(String[] args) {
GregorianCalendar cal = new GregorianCalendar(); // 表示当前时间
System.out.println(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss EEEE").format(cal.getTime()));
cal.clear();
cal.set(Calendar.YEAR, 2018);
cal.set(Calendar.MONTH, Calendar.JULY);
cal.set(Calendar.DAY_OF_MONTH, 15);
cal.set(Calendar.HOUR_OF_DAY, 12);
cal.set(Calendar.MINUTE, 33);
cal.set(Calendar.SECOND, 55);
System.out.println(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss EEEE").format(cal.getTime()));
}
}
2018-17-17 09:17:25 星期二
2018-33-15 12:33:55 星期日
private void initDate() {
String temp = "2018-04-19";
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = format.parse(temp);
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.set(Calendar.DATE,19); // 设置该月的日期 即4月19日
int a = calendar.get(Calendar.DAY_OF_WEEK); // 星期四,但是显示是5,因为星期日是1,星期六是7
int b = calendar.getActualMaximum(Calendar.DATE); // 得到字段Calendar.DATE在日历中的最大值
calendar.add(Calendar.DATE,1); // 天数增加1
} catch (ParseException e) {
e.printStackTrace();
}
}
5.8 Math与Random类
5.8.1 Math类
java.lang包中的Math类也称数学类,是一个工具类,它在解决与数学有关的一些问题时有着非常重要的作用。Math类包含许多用来进行科学计算的类方法,涉及到大多数数学函数,如sin,cos,exp,abs等,这些方法可以直接通过类名调用。Math类还提供了Math.PI和Math.E两个静态数学常量:E和PI,它们的值分别为2.7182828284590452354和3.14159265358979323846,该类是final的,不能被继承,类中的方法和属性全部是静态的,不允许在类的外部创建Math类的对象。因此只能使用Math类的方法而不能对其做任何更改。
Math.abs(12.3); //12.3 返回这个数的绝对值
Math.abs(-12.3); //12.3
Math.copySign(1.23, -12.3); //-1.23,返回第一个参数的量值和第二个参数的符号
Math.copySign(-12.3, 1.23); //12.3
Math.signum(x); //如果x大于0则返回1.0,小于0则返回-1.0,等于0则返回0
Math.signum(12.3); //1.0
Math.signum(-12.3); //-1.0
Math.signum(0); //0.0
//指数
Math.exp(x); //e的x次幂
Math.expm1(x); //e的x次幂 - 1
Math.scalb(x, y); //x*(2的y次幂)
Math.scalb(12.3, 3); //12.3*2³
//取整
Math.ceil(12.3); //返回最近的且大于这个数的整数13.0
Math.ceil(-12.3); //-12.0
Math.floor(12.3); //返回最近的且小于这个数的整数12.0
Math.floor(-12.3); //-13.0
//x和y平方和的二次方根
Math.hypot(x, y); //√(x²+y²)
//返回概述的二次方根
Math.sqrt(x); //√(x) x的二次方根
Math.sqrt(9); //3.0
Math.sqrt(16); //4.0
//返回该数的立方根
Math.cbrt(27.0); //3
Math.cbrt(-125.0); //-5
//对数函数
Math.log(e); //1 以e为底的对数
Math.log10(100); //10 以10为底的对数
Math.log1p(x); //Ln(x+ 1)
//返回较大值和较小值
Math.max(x, y); //返回x、y中较大的那个数
Math.min(x, y); //返回x、y中较小的那个数
//返回 x的y次幂
Math.pow(x, y);
Math.pow(2, 3); //即2³ 即返回:8
//随机返回[0,1)之间的无符号double值
Math.random();
//返回最接近这个数的整数,如果刚好居中,则取偶数
Math.rint(12.3); //12.0
Math.rint(-12.3); //-12.0
Math.rint(78.9); //79.0
Math.rint(-78.9); //-79.0
Math.rint(34.5); //34.0
Math.rint(35.5); //36.0
Math.round(12.3); //与rint相似,返回值为long
//三角函数
Math.sin(α); //sin(α)的值
Math.cos(α); //cos(α)的值
Math.tan(α); //tan(α)的值
//求角
Math.asin(x/z); //返回角度值[-π/2,π/2] arc sin(x/z)
Math.acos(y/z); //返回角度值[0~π] arc cos(y/z)
Math.atan(y/x); //返回角度值[-π/2,π/2]
Math.atan2(y-y0, x-x0); //同上,返回经过点(x,y)与原点的的直线和经过点(x0,y0)与原点的直线之间所成的夹角
Math.sinh(x); //双曲正弦函数sinh(x)=(exp(x) - exp(-x)) / 2.0;
Math.cosh(x); //双曲余弦函数cosh(x)=(exp(x) + exp(-x)) / 2.0;
Math.tanh(x); //tanh(x) = sinh(x) / cosh(x);
//角度弧度互换
Math.toDegrees(angrad); //角度转换成弧度,返回:angrad * 180d / PI
Math.toRadians(angdeg); //弧度转换成角度,返回:angdeg / 180d * PI