其他类API

本文深入讲解Java中的System、Runtime、Math、Date及Calendar类。覆盖系统属性管理、数学运算、日期时间处理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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):返回角的三角正弦。类似的还有costanasin(反正弦)、acosatan。以及toRadians(角度转弧度)、toDegrees(弧度转角度)。
  1. 指数函数方法
public static double exp(double a):获取e的a次方。类似的还有
Math.log(),Math.log10()是对数函数;Math.pow(a,b)是以a为底b为指数的值;Math.sqrt() 是开根号。
  1. 取整函数方法
public static double ceil(double a):返回大于等于参数的最小整数;
floor:返回小于等于参数的最大整数
rint:返回与参数最接近的整数,如果两个同为整数且同样接近,则结果为偶数。
public static int round(float a):将参数加上0.5后返回与参数最近的整数
public static long round(double a):将参数加上0.5后返回与参数最近的整数,然后强制转换为长整型。
  1. 取最大值、最小值、绝对值函数方法
    max、min、abs:返回值类型视需求决定。
  2. 随机数方法
    生成随机数取值范围是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];
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值