1. 程式人生 > >《瘋狂Java講義(第4版)》-----第7章【Java基礎類庫】

《瘋狂Java講義(第4版)》-----第7章【Java基礎類庫】

筆者認為,《瘋狂Java講義(第4版)》這本書的前6章是Java語言的核心,前4章是結構化程式設計的核心,第5章和第6章是Java面向物件的核心。從第七章開始,都是在這些核心基礎知識上的擴充套件了,很多內容可以先熟悉一遍即可,用的時候多查本書以及多檢視官方文件即可。

Java程式入口函式main及Scanner類

main函式

public static void main(String[] args){}

為了讓JVM自由呼叫main方法,所以用public修飾,JVM呼叫main的時候是用類呼叫的,所以用static修飾,main的返回值給JVM沒意義,所以乾脆沒返回值,所以用void。

main函式裡的陣列args使用示例程式碼


class Hello{

	public static void main(String[] args){
		System.out.println("Hello, World!");
		System.out.println(args.length);
		for(String arg : args){
			System.out.println(arg);
		}
	}
	
}

在這裡插入圖片描述

Scanner類

從標準輸入(鍵盤):

import java.util.Scanner;

class Hello{

	public static void main(String[] args){
		
		//System.in表示標準輸入,就是從鍵盤輸入
		Scanner scan = new Scanner(System.in);
		scan.useDelimiter("-");//使用-作為分隔符,預設是使用空格、換行、Tab
		while(scan.hasNext()){
			System.out.println(scan.next());
		}
	}
	
}

在這裡插入圖片描述

從檔案輸入:

import java.util.Scanner;
import java.io.File;

class Hello{

	public static void main(String[] args) throws Exception{
		
		//從檔案讀入,把和該程式碼檔案Hello.java裡面的東西讀出來
		Scanner scan = new Scanner(new File("Hello.java"));
		while(scan.hasNextLine()){
			System.out.println(scan.nextLine());
		}
	}
	
}

在這裡插入圖片描述

System類、Runtime類

  • System類代表當前Java程式的執行平臺,可以調取系統資訊(作業系統版本、作業系統中配置的環境變數、當前作業系統日期時間等)。
  • 247頁作者介紹了用native關鍵字可以讓Java呼叫C語言,從而實現一些底層Java無法實現的功能。
  • Runtime類代表Java程式的執行時環境,每個Java程式都有一個與之對應的Runtime例項,應用程式不可自行建立Runtime例項,但可以通過getRuntime()獲得。Runtime類可以訪問JVM的相關資訊(處理器數量、記憶體資訊等),可以執行作業系統裡面的軟體(如記事本notepad.exe),可以獲取程序相關資訊。

具體實現直接參看書247~250頁

Object、Objects、String、StringBuffer

Random、ThreadLocalRandom

在併發訪問的環境下,使用ThreadLocalRandom代替Random可以減少多執行緒資源的競爭,保證系統具有更好的執行緒安全性。

//如果種子相同,連續呼叫,出現的隨機數是相同的


Random rand1 = new Random();//構造方法共兩個,其一
Random rand2 = new Random(66);//構造方法共兩個,其二
Random rand3 = new Random(System.currentTimeMillis() );//保證下面一句程式碼的種子和這句程式碼的種子不同
Random rand4 = new Random(System.currentTimeMillis() );//保證下面一句程式碼的種子和這句程式碼的種子不同
System.out.println(rand1.nextInt(12));//簡單示例下,更多見官方API

BigDecimal

為了精確表示、計算浮點數,Java提供了BigDecimal類。

import java.math.BigDecimal;
import java.math.RoundingMode;

class Hello{

	public static void main(String[] args) throws Exception{
		//推薦使用傳入String類物件的構造器
		BigDecimal x = new BigDecimal("1");

		//非要用double初始化BigDecimal物件,用valueOf方法
		BigDecimal y = BigDecimal.valueOf(3.0);
		//如果用double值傳入構造器,產生的效果是不精確啊
		BigDecimal z = new BigDecimal(0.1);
		System.out.println(x);
		System.out.println(y);
		System.out.println(z);
		//這裡的3就是小數點位數吧!!!
		//RoundingMode是java.math下的一個列舉類,表示四近似的方式,HALF_UP就是我們小學學習的四捨五入
		System.out.println(x.divide(y,3,RoundingMode.HALF_UP).doubleValue());
	}
	
}

在這裡插入圖片描述

Date

已經過時了。 import java.util.Date;

class Hello{

	public static void main(String[] args) throws Exception{
		Date d = new Date();
		System.out.println(d);
	}
	
}

輸出:Tue Oct 02 17:10:57 CST 2018

Calendar

Calendar類是個抽象類

public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>
import java.util.Calendar;

class Hello{

	public static void main(String[] args) throws Exception{
		Calendar c = Calendar.getInstance();
		System.out.println(c.get(Calendar.YEAR));//年
		System.out.println(c.get(Calendar.MONTH)+1);//月,注意月是從0開始的
		System.out.println(c.get(Calendar.DAY_OF_MONTH));//日
		System.out.println(c.get(Calendar.HOUR));//時
		System.out.println(c.get(Calendar.MINUTE));//分
		System.out.println(c.get(Calendar.SECOND));//秒

		c.set(2018, 1, 1, 0, 0, 0);
		System.out.println(c.getTime());
		//時間年份往前推一年
		c.add(Calendar.YEAR, -1);
		System.out.println(c.getTime());
	}
	
}

在這裡插入圖片描述

注意add和roll的區別

add會根據實際動態變化時間。roll上一級不變,下一級和add類似。

Calendar c = new Calendar();
c.set(2003, 7, 31);
c.add(MONTH, 6);//2003-8-23=》2004-2-29,變化到2月發現沒31日,就成了29日。修正到變化最小的值

c.set(2003, 7, 23);
c.roll(MONTH, 6);//2003-8-23=》2003-2-23,上一級不會變動
//roll,下一級變動和add類似

Calendar的容錯性


import static java.util.Calendar.*;
import java.util.Calendar;

class Hello{

	public static void main(String[] args) throws Exception{
		Calendar c = Calendar.getInstance();
		c.set(MONTH, 12);
		System.out.println(c.getTime());
		//預設是寬鬆處理,容錯性好,比如月份大於等於12,年數會增加一年,動態變化
		//寬鬆處理關閉,不允許出現比如大於等於12月的情況,否則編譯通過,執行報錯
		c.setLenient(false);
		c.set(MONTH, 12);
		System.out.println(c.getTime());
		
	}
	
}

在這裡插入圖片描述

set方法的延遲

set呼叫後,如果沒有呼叫get,getTime,getTimeInMillis,add,roll,就不會生效。下面程式碼輸出: 在這裡插入圖片描述


import java.util.Calendar;
import static java.util.Calendar.*;

public class Hello{

	public static void main(String[] args){
		Calendar c = Calendar.getInstance();
		c.set(2003, 7, 31);//2003-8-31
		c.set(MONTH, 8);//該程式碼沒生效,如果生效應該是2003-10-1,9月沒31號
		
		c.set(DATE, 10);
		//下面呼叫getTime方法,c.set(DATE, 10);修改生效
		System.out.println(c.getTime());//2003-9-10
		
	}
}

Java8新增java.time包的情況見官方文件及該書266頁

正則表示式

見該書268~274頁