天天看點

【java中常用工具類的總結】System類,Runtime類,Date類,Calendar類,Math類

<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">【基本定義】</span></span>

<span style="font-size:18px;">System:類中方法或者屬性都是靜态的,不能被執行個體化
out:标準輸出,預設是控制台
in:标準輸入,預設是鍵盤

【重點】描述系統的加載資訊:
1.擷取系統屬性資訊的方法 Properties getProperties();
2.如何在系統中定義一些特有的資訊呢?
3.擷取指定的資訊
4.怎樣在jvm使用時,加載一些自定義的資訊

【分析】
一、Properties(屬性):
	1.其實就是Hashtable的子類,也就是map集合的子類,是以不涉及到泛型
	2.可以通過map集合的方法取出該集合中的元素
	3.改集合中存儲的全部是字元串
二、setProperty(String key, String value):
	1.設定在系統加載時,自定義的鍵值和内容
三、String getProperty(key);
	1.取得指定的鍵對應的value内容
四、用java -D(wangke)=(nanren) SystemDemo1 即可
	其中wangke是自定義的key,nanren是自定義的value  SystemDemo1是可執行的.class檔案名稱


*/
import java.util.*;
class SystemDemo1 
{
	public static void main(String[] args) 
	{
		
		//【【1】得到系統在運作時加載的具體檔案内容】
		System.setProperty("---keyneirong----","---valueneirong---");
		Properties proper=System.getProperties();
		//這其實也是周遊,相當于疊代一樣的
		for (Object obj:proper.keySet())
		{
			String value=(String)proper.get(obj);
			System.out.println(obj+":::"+value);
		}

		/*Set set=proper.keySet();
		Iterator i=set.iterator();
		while (i.hasNext())
		{
			String key=(String)i.next();
			String value=(String)proper.get(key);
			System.out.println(key+":::"+value);
		}*/
		
		//【【2】如何在系統中定義一些特有的資訊呢?】
		//System.setProperty("keyneirong","valueneirong");

		//【【3】取得指定的鍵對應的value内容】
		String value=System.getProperty("os.name"); //例如這是擷取系統的版本資訊Windows XP
		System.out.println(value);

		//【4】怎樣在jvm使用時,加載一些自定義的資訊

		//運作時輸入:java -D(wangke)=(nanren) SystemDemo1 即可OK
	}
}
</span></span>
           
<span style="font-size:18px;"><span style="font-size:18px;">/*
Runtime:
每個 Java 應用程式都有一個 Runtime 類執行個體,使應用程式能夠與其運作的環境相連接配接。
可以通過 getRuntime 方法擷取目前運作時。 
應用程式不能建立自己的 Runtime 類執行個體

【重點】
1.該類并沒有提供構造函數,是以不能建立執行個體(不能new)
2.可能該類中的方法全是靜态的,直接調用即可!
3.但是發現有非靜态的方法,那就說明該類中肯定提供了一個能擷取本類的方法
4.發現得知:隻能通過getRuntime方法來擷取到該Runtime
5.掌握常用的一個靜态方法static exec("");""裡為需要執行的内容,該方法傳回值是一個程序process
【特點】
該類使用了單例的設計模式來完成,確定對象的唯一性
能擷取該類對象的方法是:
static Runtime getRuntime();
*/

class RuntimeDemo2 
{
	public static void main(String[] args) throws Exception
	{
		//示範擷取本類對象的靜态方法
		Runtime r=Runtime.getRuntime();
		
		//打開了一個系統中的掃雷遊戲
		//【注意】該靜态方法可能去執行不存在的檔案,這時候就會抛出一個IO異常,是以需要聲明
		//r.exec("winmine.exe");

		//傳回的是一個程序,可以用程序的方法去操作它,這裡是打開一個記事本SystemDemo1.java檔案
		Process p=r.exec("notepad.exe SystemDemo1.java");

		//等待6s後幹掉此程序
		Thread.sleep(6000);
		//殺死程序
		p.destroy();
	}
}
</span></span>
           
<span style="font-size:18px;"><span style="font-size:18px;">/*
Date類:
在java.util.*中,屬于工具類
該類主要是封裝了時間的一些内容在裡面
1.該類可以執行個體化,即是獲得目前系統的時間
2.按照自定義的時間格式輸出:要用到SimpleDateFormat類(自定義時間的規範化)在java.text.*;
3.以毫秒數得到目前的時間long System.currentTimeMillis(),再用date的帶參數構造方式建立

*/
import java.text.*;
import java.util.*;
class DateDemo3 
{
	public static void main(String[] args) 
	{
		//獲得目前系統的時間
		Date d=new Date();
		
		//擷取的結果:Mon Mar 23 18:34:42 CST 2015
		System.out.println(d);

		//設定自定義的時間格式
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd hh:mm:ss E");

		//用SimpleDateFormat的對象調用format方法,傳回一個字元串
		String str=sdf.format(d);
		System.out.println(str);
		
		//用System類也能擷取到目前的時間
		long l=System.currentTimeMillis();
		Date d1=new Date(l);
		System.out.println(d1);

	}
}
</span></span>
           
<span style="font-size:18px;"><span style="font-size:18px;">/*
Calendar:
月曆類:
【重點】
1.
Calendar中月份和星期的擷取,
應該注意角标,月份0代表的是一月……
而星期中的擷取,1代表的是星期天

2.set方法:set(int field, int value)
set是給将給定的月曆字段設定為給定值。

3.add方法:add(int field, int amount) (時間的偏移量)
add是根據月曆的規則,為給定的月曆字段添加或減去指定的時間量。
*/

import java.util.*;
class CalendarDemo1
{
	public static void main(String[] args) 
	{
		//【1】自定義擷取年月日,星期的單例類
		MyCalendar m=MyCalendar.getInstance();
		sop(m.getYear());
		sop(m.getMonth());
		sop(m.getDay());
		sop(m.getWeek());

		//因為構造方法被私有化了,必須通過自己的靜态方法才能得到自己的執行個體對象
		/*Calendar c=Calendar.getInstance();

		//擷取年
		int year=c.get(Calendar.YEAR);

		//因為這裡的月曆類中的月份,0角标為其實是一月,
		//即是得到月份是目前系統月份的前一個月,是以需要加1才行
		int month=c.get(Calendar.MONTH);
		
		//擷取天
		int day=c.get(Calendar.DAY_OF_MONTH);

		//擷取星期
		int week=c.get(Calendar.DAY_OF_WEEK);

		//分别輸出即可
		sop(year+"年");
		sop(month+"月");
		sop(day+"日");
		sop(week+"日"); //這裡擷取到是2,星期中排序是星期天……星期六,是以是星期一
		*/


		//【2】set方法
		Calendar cd=Calendar.getInstance();
		cd.set(Calendar.YEAR,2020);
		sop(cd.get(Calendar.YEAR));  //2020

		cd.set(2020,3,30); //【注意】這裡設定的3指的是四月份才對
		sop(cd.get(Calendar.MONTH));

		//【3】add方法:時間的偏移量
		Calendar cd1=Calendar.getInstance();
		int year=cd1.get(Calendar.YEAR);
		sop(year); //2015

		cd1.add(Calendar.YEAR,4);
		int yearNew=cd1.get(Calendar.YEAR);
		sop(yearNew);  //2019

		cd1.add(Calendar.YEAR,-4);
		int yearNow=cd1.get(Calendar.YEAR);
		sop(yearNow);  //2015
		
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

//【從上面可以得出:擷取的月和星期都不是自己想要的結果:是以可以自己定義一個查表法】
//是以下面是自己寫的一個比較完美的單例模式擷取時間的自定義類
class MyCalendar
{
	private MyCalendar()
	{
	}
	
	private static MyCalendar mc=null;
	//單例模式加鎖判斷方法
	public static MyCalendar getInstance()
	{
		synchronized (MyCalendar.class)
		{	if (mc==null)
			{
				if (mc==null)
				{
					mc=new MyCalendar();
				}
			}
			return mc;
		}
	}
	
	private String[] month={"","一月","二月","三月","四月",
							"五月","六月","七月","八月",
							"九月","十月","十一月","十二月"};
	private String[] week={"","星期日","星期一","星期二",
					"星期三","星期四","星期五","星期六"};

	private Calendar c=Calendar.getInstance();

	public String getYear()
	{
		//擷取年
		return c.get(Calendar.YEAR)+"年";
	}

	public String getMonth()
	{
		//擷取月
		int index=c.get(Calendar.MONTH);
		//return month[index+1];這是擷取查表法的方法
		return index+1+"月";
	}

	public String getDay()
	{
		//擷取日
		return c.get(Calendar.DAY_OF_MONTH)+"日";
	}
	
	public String getWeek()
	{
		//擷取星期
		int index = c.get(Calendar.DAY_OF_WEEK);
		return week[index];
	}
}
</span></span>
           
<span style="font-size:18px;"><span style="font-size:18px;">/*
練習
1.擷取任意年份二月份的天數
2.擷取昨天的現在這個時刻
【分析】
1.我們知道任意年份的二月天數都不一樣,是以最好是set(year,2,1);
其實這代表的是某年的3月1日,是以要得到二月的天數,隻需要把1 偏移-1位就可以得到了
其實就是set方法和add方法的應用!
2.
*/
import java.util.*;
class CalendarDemo2 
{
	public static void main(String[] args) 
	{	
		//【1】調用擷取2月份天數的方法
		getFebDay(2000);
		//【2】調用昨天這個時刻的方法
		getYesterday();
	}
	
	//擷取某年的二月份天數的方法
	public static void getFebDay(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);
		sop(year+"年的2月份共有"+day+"天");
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	
	//擷取昨天這個時刻的方法
	public static void getYesterday()
	{
		Calendar c=Calendar.getInstance();
		c.add(Calendar.DAY_OF_MONTH,-1);
		int year=c.get(Calendar.YEAR);
		int month=c.get(Calendar.MONTH)+1;
		int day=c.get(Calendar.DAY_OF_MONTH);
		int hour=c.get(Calendar.HOUR_OF_DAY);
		int minute=c.get(Calendar.MINUTE);
		int second=c.get(Calendar.SECOND);
		sop("昨天的這個時刻是:"+year+"年"+month+"月"+day+"日"+hour+":"+minute+":"+second);
	}
}
</span></span>
           
<span style="font-size:18px;"><span style="font-size:18px;">/*
在java.long.*;
Math 類包含用于執行基本數學運算的方法
其中有很多方法,但是比較常用的是一下幾種方法:
【重點】
1.static double E (常量) 含義:e(即自然對數的底數)的 double 值
2.static double PI (常量) 其實就是π
3.{double,float,int,long} abs(4中類型 d); 傳回d的絕對值,很簡單
[示範以下]【重點】
4.static double ceil(double a) :傳回大于a值的最大整數
5.static double floor(double a) : 傳回小于a值的最大整數
6.static long round(double a) :把a四舍五入,傳回為long
7.static double pow(double a, double b) :a的b次方,例如:pow(2,3);結果是8 
8.static double random() :随機數,預設傳回的是{0<= 随機數 <1}
	随機數的産生在java.util.*包中有一個直接可以用的類,那就是
	Random類,其中有很多方法,不再一一介紹,知道幾個就行;
	nextInt(int i):傳回0(包括)到i(不包括)值的随機整數;
	以此類推:還有nextDouble()和nextFloat()等等……
9.有一個小練習:給定一個小數,保留該小數的後兩位!
*/
import java.util.*;
class MathDemo6 
{
	public static void main(String[] args) 
	{
		double d=2342.676;
		show(d);//示範

		showTwo(d);//練習
	}

	public static void show(double d)
	{	
		
		//傳回大于double類型值的最大整數
		sop(Math.ceil(d));  //2343.0
		sop(Math.ceil(-d)); //-2342.0

		//傳回小于double類型值的最大整數
		sop(Math.floor(d));  //2342.0
		sop(Math.floor(-d)); //-2343.0
		
		//把a四舍五入,傳回為long
		sop(Math.round(d));  //2343
		sop(Math.round(-d)); //-2343
		sop(Math.round(23.29));//23
		sop(Math.round(23.59));//24

		//【注意】随機數:預設傳回的是{0<= 随機數 <1}
		sop(Math.random());  //随機産生的,我這會兒是:0.33517799412879334
		
		//例如以下是傳回十組0到1(其實就是包含:有頭無尾)的随機數字
		for (int i=0; i<10;i++ )
		{
			sop(Math.random());
		}

		//那怎樣傳回1到10的随機數呢,需要有頭有尾,且是int類型!
		for (int i=0; i<10;i++ )
		{
			sop((int)(Math.random()*10)+1); //加1主要是為了包含有尾
		}

		//java.uitl.*中的Random随機數類,可以直接操作的,有很多方法,不用強制轉換
		

		//[重點]用Random類傳回十組0到1(其實就是包含:有頭無尾)的随機數字
		Random r=new Random();
		for (int i=0;i<10 ;i++ )
		{
			sop(r.nextInt(10));//要包含10就加一就OK了,這裡是有頭無尾式
		}

	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}

	/*9.有一個小練習:給定一個小數,保留該小數的後兩位!
	【基本思路】:先把這個數字*100,然後在四舍五入這個數字強制傳回一個int類型,最後再
	把這個數字除以100.00(主要是為了保留後兩位)傳回為double(内部會自動提升)類型即可
	*/

	public static void showTwo(double d)
	{
		double d1=d*100;
		int d2=(int)Math.round(d1);
		double a=d2/100.00;
		sop(a); //2342.68
	}
}
</span></span>
           

【總結】

以上這些都是比較常用的類,其中有重點的方法和注意的情況,我都寫在内容中,僅供大家參考學習……個人覺得最重要的是能通過運用這些工具類,能夠熟悉其java中API幫助文檔的使用!

繼續閱讀