System类
System类位于java.lang包中,系统级的很多属性和控制方法都放置在该类的内部。
由于该类的构造方法是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法也都是static的。
1. 成员变量
System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。
2. 成员方法
long currentTimeMillis() 获取当前时间的毫秒值(当前时间与 协调世界时1970.1.1日午夜之间的时间差)。 可以用来获取一段代码的运行时间。
public static Properties getPropertis() 确定当前的系统属性。
代码演示:
package p1.otherapi;
import java.util.Properties;
import java.util.Set;
public class SystemDemo {
//这句语句在任何系统上都能获取当前系统的回车符来实现在java程序中的换行(java的跨平台性)
private static final String LINE_SEPARATOR=System.getProperty("line.separator");//根据指定键获取值
public static void main(String[] args) {
/*
* System类的方法和属性都是静态的。
常见方法:
long currentTimeMillis() 获取当前时间的毫秒值(当前时间与 协调世界时1970.1.1日午夜之间的时间差)
可以用来获取一段代码的运行时间
public static Properties getPropertis() 确定当前的系统属性
* */
// currentimemillis();
System.out.println("hello"+LINE_SEPARATOR+"world");
// getproperties();
//给系统设置一些属性信息。这些信息是全局的,其他程序都可以使用。
// System.setProperty("myclasspath","c:\myclass" );
}
public static void currentimemillis() {
long l1=System.currentTimeMillis();//1509675688852
System.out.println(l1);
System.out.println(l1/1000);//秒 以此类推再除以60为分...
long l2=1509675688852l;
long l3=System.currentTimeMillis();
System.out.println(l3-l2);
}
public static void getproperties(){
//获取系统的属性信息,并存储到了Properties集合中
/*
properties集合中存储的都是String类型的键和值。
最好使用它自己的存储和取出方法来完成元素的操作。
*/
Properties prop=System.getProperties();
Set<String> nameSet=prop.stringPropertyNames();
for(String name:nameSet){
String value=prop.getProperty(name);
System.out.println(name+"::"+value);
}
}
}
还有一些其他方法:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 数组拷贝,也就是将一个数组中的内容复制到另外一个数组中的指定位置,由于该方法是native方法,所以性能上比使用循环高效。
public static void exit(int status) 退出程序。
public static void gc() 进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。
Runtime类
Runtime类封装了运行时的环境。每个 Java 应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。
一般不能实例化一个Runtime对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。
一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。
当Applet和其他不被信任的代码调用任何Runtime方法时,常常会引起SecurityException异常。对于Process类的实例主要作用是创建一个可以管理的进程,并对它进行管理。Process类还有几个方法分别是destroy() 杀掉子进程、exitValue()返回子进程的出口值、getErrorStream()获取子进程的错误流。
代码示例:
public class RuntimeDemo {
public static void main(String[] args) throws IOException, InterruptedException {
/*
每一个java应用程序都有一个Runtime类实例,是应用程序能够与其运行的环境相连接。
可以通过getRuntime方法获取当前运行时。
应用程序不能创建自己的Runtime类实例。
Runtime:没有构造方法摘要,说明该类不可以创建对象。
又发现还有非静态的方法,说明该类应该提供静态的返回该类对象的方法。
而且只有一个,说明Runtime类使用了单例设计模式
*
* */
Runtime r=Runtime.getRuntime();
//excute:执行 xxx.exe
r.exec("notepad.exe");
r.exec("notepad.exe C:\\Users\\Administrator\\Desktop\\文档1.txt");
r.exec("C:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQScLauncher.exe");
//关闭Runtime类开启的进程
Process p=r.exec("notepad.exe");
Thread.sleep(5000);
p.destroy();
}
}
Math类
在Math类中提供了众多的数学函数方法,主要包括三角函数方法,指数函数方法,取整函数方法,取最大值、最小值以及平均值函数方法,这些方法都被定义为static形式,可以用如下形式调用:
Math.数学方法
在Math类中除了函数犯法外还存在一些常用数学常量,如PI,E等:
Math.PI
Math.E
常用数学运算方法:
1. 三角函数方法
public static double sin(double a):返回角的三角正弦。类似的还有cos、tan、asin(反正弦)、acos、atan。以及toRadians(角度转弧度)、toDegrees(弧度转角度)。
- 指数函数方法
public static double exp(double a):获取e的a次方。类似的还有
Math.log(),Math.log10()是对数函数;Math.pow(a,b)是以a为底b为指数的值;Math.sqrt() 是开根号。
- 取整函数方法
public static double ceil(double a):返回大于等于参数的最小整数;
floor:返回小于等于参数的最大整数
rint:返回与参数最接近的整数,如果两个同为整数且同样接近,则结果为偶数。
public static int round(float a):将参数加上0.5后返回与参数最近的整数
public static long round(double a):将参数加上0.5后返回与参数最近的整数,然后强制转换为长整型。
- 取最大值、最小值、绝对值函数方法
max、min、abs:返回值类型视需求决定。 - 随机数方法
生成随机数取值范围是0.0到1.0的double型数值。也可以用简单的表达式生成任意范围的随机数例如:m+(int)(Math.random()*n) 返回m到m+n(不包括m+n)之间的一个随机整数。
除了Math类中的random()方法可以获取随机数外,java还提供了一个乐意获取随机数的方式,就是java.util.Random类。可以通过实例化一个Random对象来创建一个随机数生成器。
Random r=new Random();
以这种方式实例化对象时,java编译器以系统当前时间作为随机数生成器的种子。
也可以在实例化Random对象的时候,设置随机数生成器的种子:
Random r=new Random(seedValue);
Random获取各种类型的随机数的方法:
public int nextInt():返回一个随机整数,类似的还有nextLong(),nextBoolean(),nextFloat(),nextDouble(),nextGaussian()
public int nextInt(int n):返回一个大于等于0且小于n的随机整数。
Date类
在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。
Date类表示特定的瞬间,精确到毫秒。
创建Date对象
1. public Date()——分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
2. public Date(long date)——根据给定的毫秒值创建日期对象。
日期对象和毫秒值之间的转换
日期对象–>毫秒值:
通过getTime方法可以将一个日期类型转换为long类型的毫秒值。
毫秒值–>日期对象:
1. 可以通过构造函数public Date(long date)将毫秒值转为日期类型。
2. 通过public void setTime(long time)方法。
对对象进行格式化
日期对象转换为日期格式的字符串:
将日期对象转换为日期格式的字符串使用的是DateFormat类中的format方法。
日期格式的字符串转换为日期对象:
使用的是DateFormat类中的parse()方法。
方法演示:
public class DateDemo {
public static void main(String[] args) throws ParseException {
// demo_1();
// methodDemo_2();
methodDemo_3();
}
/**
将日期格式的字符串-->日期对象
使用的是DateFormat类中的parse()方法
* @throws ParseException
*/
private static void methodDemo_3() throws ParseException {
// String str_date="2017-11-3";
// DateFormat dateFormat=DateFormat.getDateInstance();
// String str_date="2017年11月3日";
// DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.LONG);
String str_date="2017--11--3";
DateFormat dateFormat=new SimpleDateFormat("yyyy--MM--dd");
Date date=dateFormat.parse(str_date);
System.out.println(date);
}
/**
对对象进行格式化
将日期对象-->日期格式的字符串
使用的是DateFormat类中的format方法
* */
public static void methodDemo_2() {
Date date=new Date();
//获取日期格式对象,具备着默认的格式风格.FULL,LONG等可以指定风格
// DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.LONG);
// DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.FULL);
// DateFormat dateFormat=DateFormat.getInstance();
// DateFormat dateFormat=DateFormat.getDateTimeInstance();
DateFormat dateFormat=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
//风格是自定义的
dateFormat=new SimpleDateFormat("yyyy---MM--dd");
String str_date=dateFormat.format(date);
System.out.println(str_date);
}
/**
日期对象和毫秒值之间的转换
毫秒值-->日期对象
1,通过Date对象的构造方法 new Date(timeMillis);
2.还可以通过setTime设置
因为可以通过Date对象的方法对该日期的各个字段(年月日等)进行操作
日期对象-->毫秒值
1.getTime方法
因为可以通过具体数值进行运算
* */
public static void demo_1() {
long time =System.currentTimeMillis();
System.out.println(time);//1509701667787
Date date=new Date();
System.out.println(date);//Fri Nov 03 17:34:27 CST 2017
Date date2=new Date(1509675688852l);
System.out.println(date2);
}
}
Date类小练习:
“2017-11-3”到”2017-11-11”中间有多少天?
思路:
两个日期相减,必须要有两个可以进行减法运算的数。 能减的可以是毫秒值。
如何获取毫秒值:通过date对象。
如何获取date对象:可以将字符串转成date对象。
步骤:
1.将日期格式的字符串转成Date对象;
2.将Date对象转成毫秒值;
3.相减,再变成天数。
代码:
public class DateTest {
public static void main(String[] args) throws ParseException {
String str_date1="2017-11-3";
String str_date2="2017-11-11";
test(str_date1,str_date2);
}
public static void test(String str_date1,String str_date2) throws ParseException {
//1.将日期字符串转成日期对象
//定义日期格式对象
DateFormat dateFormat=DateFormat.getDateInstance();
//DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");
Date date1=dateFormat.parse(str_date1);
Date date2=dateFormat.parse(str_date2);
long time1=date1.getTime();
long time2=date2.getTime();
long time=Math.abs(time1-time2);
int day=getDay(time);
System.out.println(day);
}
public static int getDay(long time) {
int day=(int)(time/1000/60/60/24);
return day;
}
}
Calendar类
从JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现(Date的一些方法都过时了)。在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。
该类被abstract所修饰,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,说明不能通过new的方式来获得实例,对此,Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象,getInstance方法返回一个Calendar对象,其日历字段已由当前日期和时间初始化:
Calendar c = Calendar.getInstance();
由于Calendar类toString实现的没有Date类那么直观,所以直接输出Calendar类的对象意义不大。
使用Calendar类代表指定的时间
通过set方法:public final void set(int year,int month,int date)
首先创建一个Calendar的对象,然后在设定该对象中的年月日参数:
Calendar c=Calendar.getInstance();
c.set(year, 2, 1);//某一年的三月一号,月份是0,1,2...11分别代表1,2...12月
或者c1.set(2017,10,6);//设置日期的全部字段
获得Calendar类中的信息
通过get方法获取:
int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH)+1;
int day=c.get(Calendar.DAY_OF_MONTH);
其他方法
add方法:public abstract void add(int field,int amount);
该方法的作用是在Calendar对象中的某个字段上增加或减少一定的数值,增加是amount的值为正,减少是amount的值为负。
after方法:public boolean after(Object when);
该方法的作用是判断当前日期对象是否在when对象的后面,如果在when对象的后面则返回true,否则返回false。
方法演示:
public class CalendarDemo {
public static void main(String[] args) {
Calendar c=Calendar.getInstance();
// System.out.println(c);
// showDate(c);
int year=2017;
showDays(year);
}
//求某年的二月有多少天:
public static void showDays(int year) {
Calendar c=Calendar.getInstance();
c.set(year, 2, 1);//某一年的三月一号
c.add(Calendar.DAY_OF_MONTH, -1);//三月一号的前一天
int day=c.get(Calendar.DAY_OF_MONTH);
System.out.println(year+"二月的天数:"+day);
showDate(c);
}
//输出指定日期的日历和星期几
public static void showDate(Calendar c) {
int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH)+1;
int day=c.get(Calendar.DAY_OF_MONTH);
int week=c.get(Calendar.DAY_OF_WEEK);
System.out.println(year+"年"+month+"月"+day+"日"+getWeek(week));
}
private static String getWeek(int i) {
String[] weeks={"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
return weeks[i];
}
}