《瘋狂Java講義(第4版)》-----第7章【Java基礎類庫】
阿新 • • 發佈:2018-12-13
筆者認為,《瘋狂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頁