1. 程式人生 > >第二十九講 常用類

第二十九講 常用類

System

概述

System類用於描述系統一些資訊,該類中的方法和屬性都是靜態的。其中有兩個最常見的屬性,分別是:

  • out:標準輸出流,預設對應的裝置是顯示器;
  • in:標準輸入流,預設對應的裝置是鍵盤。

最常見的成員方法

方法 說明
public static long currentTimeMillis() 返回以毫秒為單位的當前時間
public static Properties getProperties() 獲取當前的系統屬性資訊
public static String getProperty(String key) 獲取指定鍵指示的系統屬性

System類的currentTimeMillis()方法可統計一段程式的執行時間,例如:

package cn.liayun.otherapi;

public class SystemDemo {

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		for
(int i = 0; i < 100; i++) { System.out.println("hello" + i); } long end = System.currentTimeMillis(); System.out.println("共耗時:" + (end - start) + "毫秒"); } }

System類的getProperties()方法將獲取到的系統資訊都儲存到了Properties鍵值集合中,又因為Properties是HashTable的子類,也就是Map集合的一個子類物件,所以可以通過Map的方法取出該集合的元素。該集合中儲存的都是字串,沒有泛型定義。以下程式碼用於獲取系統屬性資訊:

Properties prop = System.getProperties(); // 獲取到的系統資訊都儲存到了Properties鍵值集合當中了。
  • 獲取所有屬性資訊
    Set<String> keySet = prop.stringPropertyNames();
    		
    for (String key : keySet) {
    	String value = prop.getProperty(key);
    	System.out.println(key + "::" + value);
    }
    
  • 獲取指定屬性資訊
    String value = System.getProperty("os.name");
    System.out.println("value="+value);
    

Runtime

概述

每個Java應用程式都有一個Runtime類例項,使應用程式能夠與其執行的環境相連線。可以通過 getRuntime方法獲取當前執行時。應用程式不能建立自己的Runtime類例項。

最常見的成員方法

方法 說明
public static Runtime getRuntime() 返回與當前Java應用程式相關的執行時物件
public Process exec(String command) 在單獨的程序中執行指定的字串命令

Runtime類並沒有提供建構函式,說明不可以new物件,那麼我們會直接想到該類中的方法都是靜態的,但發現該類中還有非靜態方法,說明該類肯定會提供方法獲取本類物件,而且該方法是靜態的,返回值型別是本類型別。查閱API,可知該方法是public static Runtime getRuntime(),由這個特點可以看出該類使用了單例設計模式。

package cn.liayun.otherapi;

import java.io.IOException;

public class RuntimeDemo {

	public static void main(String[] args) throws IOException {
		/*
		 * 單例模式的物件Runtime。
		 */
		Runtime r = Runtime.getRuntime();
		
//		r.exec("notepad.exe");
		r.exec("notepad.exe D:\\Practise\\Java Base\\JavaSE_Code\\lee_day19\\SysInfo.txt");
	}

}

Math

概述

Math類包含用於執行基本數學運算的方法,如初等指數、對數、平方根和三角函式。

最常見的成員方法

方法 說明
public static int abs(int a) 返回int值的絕對值
public static double ceil(double a) 返回大於指定資料的最小整數
public static double floor(double a) 返回小於指定資料的最大整數
public static long round(double a) 四捨五入
public static double pow(double a,double b) a的b次冪
public static double random() 返回帶正號的double值,該值大於等於0.0且小於1.0
package cn.liayun.otherapi;

import java.util.Random;

public class MathDemo {

	public static void main(String[] args) {
		/*
		 * Math:數學類,都是靜態的成員。
		 */
		double d1 = Math.ceil(12.34);
		double d2 = Math.floor(12.34);
		double d3 = Math.round(12.34);//四捨五入。
		
		System.out.println("d1 = " + d1);//13
		System.out.println("d2 = " + d2);//12
		System.out.println("d3 = " + d3);//12
		
		System.out.println(Math.pow(10, 3));
		
		for (int x = 0; x < 10; x++) {
			int d = (int) Math.ceil(Math.random() * 6);
			System.out.println(d);
		}
	}

}

練習

給定一個小數,保留該小數的後兩位。

package cn.liayun.otherapi;

import java.text.DecimalFormat;

public class Test {

	public static void main(String[] args) {		
		String str_num = getNumber(0.9);
		System.out.println(str_num);
	}

	private static String getNumber(double d) {
		DecimalFormat decimalFormat = new DecimalFormat("#0.00");//模式不能寫成"#.00"
		return decimalFormat.format(d);
	}

}

Random

概述

此類用於產生偽隨機數,如果用相同的種子建立兩個Random例項,則對每個例項進行相同的方法呼叫序列,它們將生成並返回相同的數字序列。

最常見的成員方法

方法 說明
public int nextInt() 返回的是int範圍內的隨機數
public int nextInt(int n) 返回的是[0,n)範圍內的隨機數

例,產生10個1~6(包括1,但不包括6)圍內的偽隨機數。

package cn.liayun.otherapi;

import java.util.Random;

public class RandomDemo {

	public static void main(String[] args) {		
		Random r = new Random();
		for (int i = 0; i < 10; i++) {
			int num = r.nextInt(6) + 1;
			System.out.println(num);
		}
	}

}

Date

格式化和解析日期字串

日期物件的格式化

首先建立Date物件,並列印。

Date d = new Date();
System.out.println(d); // 列印的時間看不懂,希望有些格式。

這時可發現列印的時間看不懂,想要把日期按照我們的習慣格式化一下,咋辦呢?可將模式封裝到SimpleDateFormat物件中,如下:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");

然後呼叫format()方法讓模式格式化指定的Date物件,將日期物件轉成日期格式的字串。

String str_date = dateFormat.format(date);
System.out.println(str_date);

日期字串的解析

將日期格式的字串轉成日期物件,即解析。

package cn.liayun.otherapi;

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

public class DateDemo2 {

	public static void main(String[] args) throws ParseException {
		/*
		 * "日期格式的字串:2013-07-17"
		 * 需要將日期格式的字串轉成日期物件,即解析。
		 */
		String str_date = "2013-07-17";
		
		DateFormat dateFormat = DateFormat.getDateInstance();
		
		Date date = dateFormat.parse(str_date);
		
		System.out.println(date);
	}

}

日期物件和毫秒值之間的相互轉換

毫秒值轉成日期物件

毫秒值轉成日期物件,需要呼叫Date類的建構函式或者setTime()方法。

package cn.liayun.otherapi;

import java.text.DateFormat;
import java.util.Date;

public class DateDemo3 {

	public static void main(String[] args) {
		long time = 1541179812628l;
		//毫秒值--->日期物件,建構函式或者setTime()方法。
		Date date = new Date(time);
		
		DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
		String str_date = dateFormat.format(date);
		System.out.println(str_date);		
	}

}

日期物件轉成毫秒值

日期物件轉成毫秒值,需要呼叫Date類的getTime()方法。

package cn.liayun.otherapi;

import java.text.DateFormat;
import java.util.Date;

public class DateDemo3 {

	public static void main(String[] args) {
		long time = 1541179812628l;
		//毫秒值--->日期物件,建構函式或者setTime()方法。
		Date date = new Date(time);
		
		DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
		String str_date = dateFormat.format(date);
		System.out.println(str_date);
		
		//日期物件--->毫秒值,Date物件的getTime()方法。
		long time2 = date.getTime();
		System.out.println(time2);
		
	}

}

Calendar

概述

Calendar類是一個抽象類,它為特定瞬間與一組諸如YEAR、MONTH、DAY_OF_MONTH、HOUR等 日曆欄位之間的轉換提供了一些方法,併為操作日曆欄位(例如獲得下星期的日期)提供了一些方法。

最常見的成員方法

方法 說明
public static Calendar getInstance() 獲取例項
public int get(int field) 返回給定日曆欄位的值。日曆類中的每個日曆欄位都是靜態的成員變數,並且是int型別
public abstract void add(int field, int amount) 根據日曆的規則,為給定的日曆欄位新增或減去指定的時間量
public final void set(int year, int month, int date) 設定當前日曆的年月日
package cn.liayun.otherapi;

import java.util.Calendar;

import cn.liayun.exception.NotWeekException;

public class CalendarDemo {

	public static void main(String[] args) {
		/*
		 * 演示日曆。
		 * Calendar
		 */
		Calendar c = Calendar.getInstance();
		
		//對日曆物件進行其中日期的定義。
//		c.set(Calendar.YEAR, 2014);
//		c.set(2012, 4, 1);
		
		//日期的偏移。
//		c.add(Calendar.MONTH, 5);
		
		//獲取其中的所需日期。
		showDate(c);
	}

	private 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);
		String week = getWeek(c.get(Calendar.DAY_OF_WEEK));
		
		System.out.println(year + "年" + month + "月" + day + "日" + week);
	}

	private static String getWeek(int i) {
		if (i > 7 || i <= 0) {
			throw new NotWeekException("沒有對應的星期,必須是1~7");
		}
		String[] weeks = {"", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
		return weeks[i];
	}

}

cn.liayun.exception包中的NotWeekException異常類繼承自RuntimeException類,並顯示呼叫其中所有的構造方法。

package cn.liayun.exception;

public class NotWeekException extends RuntimeException {

	public NotWeekException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public NotWeekException(String arg0, Throwable arg1, boolean arg2, boolean arg3) {
		super(arg0, arg1, arg2, arg3);
		// TODO Auto-generated constructor stub
	}

	public NotWeekException(String arg0, Throwable arg1) {
		super(arg0, arg1);
		// TODO Auto-generated constructor stub
	}

	public NotWeekException(String arg0) {
		super(arg0);
		// TODO Auto-generated constructor stub
	}

	public NotWeekException(Throwable arg0) {
		super(arg0);
		// TODO Auto-generated constructor stub
	}
	
}

練習

練習一、獲取任意一年的二月有多少天。

思路:

  1. 根據指定年設定一個時間就是c.set(year, 2, 1),某一年的3月1日;
  2. c.add(Calendar.DAY_OF_MONTH, -1),3月1日往前推一天,就是2月最後一天。
package cn.liayun.otherapi;

import java.util.Calendar;

public class CalendarDemo {

	public static void main(String[] args) {
		Calendar c = Calendar.getInstance();
		
		//任意一年二月有多少天?三月一日的前一天就是。
		int year = 2018;
		c.set(year, 2, 1);
		c.add(Calendar.DAY_OF_MONTH, -1);
		
		//獲取其中的所需日期。
		System.out.println(c.get(Calendar.DAY_OF_MONTH));
	}

}

練習二、“2012/3/17”、"2012-5-28"這兩個字串代表的日期之間間隔多少天?

package cn.liayun.test;

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

public class Test {

	public static void main(String[] args) throws ParseException {
		getDays();
	}
	
	//"2012/3/17","2012-5-28",問,間隔多少天?
	/*
	 * 1. 只有毫秒值可以相減。
	 * 2. 獲取毫秒值,字串--->日期物件--->毫秒值
	 */
	
	public static void getDays() throws ParseException {
		String str_date1 = "2012/5/17";
		String str_date2 = "2012-5-18";
		
		//如何將日期格式字串解析成日期物件呢?
		//1.自定義yyyy/MM/dd風格物件。
		DateFormat dateFormat1 = new SimpleDateFormat("yyyy/MM/dd");
		//2.定義一個預設的風格。
		DateFormat dateFormat2 = DateFormat.getDateInstance(DateFormat.MEDIUM);
		
		//3.對日期格式字串進行解析。
		Date date1 = dateFormat1.parse(str_date1);
		Date date2 = dateFormat2.parse(str_date2);
		
//		System.out.println(date1);
//		System.out.println(date2);
		
		//4.通過日期物件獲取毫秒值。
		long time1 = date1.getTime();
		long time2 = date2.getTime();
		
		//5.相減。
		long time = Math.abs(time1 - time2);
		
		int day = transDay(time);
		
		System.out.println(day);
	}

	private static int transDay(long time) {
		return (int)(time / 1000 / 60 / 60 / 24);
	}
}