《瘋狂Java講義》學習筆記(六)Java基礎類庫

1、與用戶互動

  • main函數:public static void main(String[] args){…}
    public修飾符:Java類用JVM調用,爲了讓JVM可以自由調用這個main方法,所以使用public修飾符把這個方法暴露出來
    static修飾符:JVM直接通過該類調用主方法,因此使用static修飾
    void返回值:返回值返回給JVM沒有意義,所以沒有返回值
    args參數:可以在配置文件配置
  • Scanner讀取鍵盤:
Scanner sc = new Scanner(System.in);
// 換行符
sc.useDelimiter("\n");
while(sc.hasNext()){
    System.out.println(sc.next());
}
// 讀取文件流:
Scanner sc = new Scanner(new File("Scanner.java"));
while(sc.hasNextLine()){
    System.out.println(sc.next());
}

2、系統相關

  • System
    System類代表當前Java程序的運行平臺,程序不能創建System類的對象,System類提供了一些類變量和類方法,允許直接通過System類來調用這些變量和類方法
    System類提供了代表標準輸入、標準輸出和錯誤輸出的類變量,並提供了一些靜態方法用於訪問環境變量、系統屬性的方法,還提供了加載文件和動態鏈接庫的方法
public static void main(String[] args) throws FileNotFoundException, IOException {
    Map<String, String> env = System.getenv();
    for (String name : env.keySet()) {
        //所有變量
        System.out.println(env.get(name));
    }
    // 指定變量
    System.out.println(System.getenv("HOME"));
    // 獲取所有系統屬性
    Properties props = System.getProperties();
    // 保存在props.txt
    props.store(new FileOutputStream("props.txt"), "System properties");
    // 輸出特定的系統屬性
    System.out.println(System.getProperty("os.name"));
}
  • Runtime
    Runtime類代表Java程序的運行時環境,每個Java程序都有一個與之對應的Runtime實例,應用程序通過該對象與其運行時環境相連;應用程序不能創建自己的Runtime實例,但可以通過getRuntime()方法獲取與之關聯的Runtime對象
    Runtime類可以訪問JVM的相關信息,如處理器數量、內存信息等
// 獲取Java程序關聯的運行時對象
Runtime rt = Runtime.getRuntime();
System.out.println("處理器數量:"+rt.availableProcessors());
System.out.println("空閒內存數:"+rt.freeMemory());
System.out.println("總內存數:"+rt.totalMemory());
System.out.println("可用最大內存數:"+rt.maxMemory());

3、常用類

  • Object類是所有類、數組、枚舉類的父類,Java允許把任何類型的對象賦給Object類型的變量;當定義一個類時沒有使用extends關鍵字爲它顯式指定父類,則該類默認繼承Object父類
  • 所有Java類都是Object類的子類,所以任何Java對象都可以調用Object類的boolean equals(object obj)
protected void finalize():當系統中沒有引用變量引用到該對象時,垃圾回收器調用此方法來清理該對象的資源
Class<?> getClass():返回該對象的運行時類
int hasCode():返回該對象的hasCode值,默認情況下根據該對象的地址來計算(即與System.identityHashCode(Object x)方法的計算結果相同)
String toString():返回該對象的字符串,默認情況下Object類的toString()方法返回“運行時類名@十六進制hashCode值“格式的字符串
super.clone():克隆方法,它只克隆該對象的所有成員變量值,不會對引用類型的成員變量值所引用的對象進行克隆,相當於new一個新對象,將舊對象的變量值賦予給新對象bjects工具類,“空指針“安全
  • String、StringBuffer和StringBuilder
String 類是不可變類,即一旦一個String對象被創建以後,包含在這個對象中的字符序列是不可改變的,直至這個對象被銷燬
StringBuffer對象是一個字符序列可變的字符串,當一個StringBuffer被創建以後,通過append()、insert()、reverse()、setCharAt()、setlength()等方法可以改變這個字符串對象的字符序列
StringBuilder和StringBuffer基本像是,但StringBuilder沒有實現線程安全,所以性能略高,因此創建可變字符串對象,應優先考慮使用StringBuilder類
String、StringBuilder、StringBuffer都實現了CharSequence接口,因此CharSequence可認爲是一個字符串的協議接口
String常用API:
String():創建一個包含0個字符串序列的String對象
String(byte[] bytes,Charset charset):使用指定的字符集將指定的byte[]數組解碼成一個新的String對象
String(byte[] bytes,int offset,int length):使用平臺的默認字符集將指定的byte[]數組從offet開始、長度爲length的子數組解碼成爲一個新的String對象
String(byte[] bytes,int offset,int length,String charsetName):使用指定的字符集將指定的byte[]數組從offset開始、長度爲length的子數組解碼成一個新的String對象
String(byte[] bytes,String charsetName):使用指定的字符集將指定的byte[]數組解碼成一個新的String對象
String(char[] value,int offset,int count):將指定的字符數組從offset開始、長度爲count的字符元素連綴成字符串
String(String original):根據字符串直接量來創建一個String對象
String(StringBuffer buffer):根據StringBuffer對象來創建對應的String對象
String(StringBuilder builder):根據StringBuilder對象來創建對應的String對象
char charAt(int index):獲取字符串中指定位置的字符,index從0開始到length()-1
int compareTo(String anotherString()):比較兩個字符串的大小;如果兩個字符串的字符序列相等,則返回0;不相等時,從第0個字符開始比較,返回第一個不相等的index;如果一個字符串的前面剛好是另一個字符串(abc和abcde),則返回它們的長度差
String concat(String str):將該String對象與str連接在一起,相當於“+“
boolean contentEquals(StringBuffer sb):將String與StringBuffer進行比較,當它們包含的字符序列相同時返回true
static String copyValuesOf(char[] data):將字符數組連綴成字符串,與String(char[] content)類似
static String copyValuesOf(char[] data,int offset,int count)
boolean endsWith(String suffix):返回該String對象是否以suffix結尾
boolean equals(Object obj):將該字符串與指定對象比較,如果兩者包含的字符序列相等,則返回true
boolean equalsIgnoreCase(String str):同上,忽略大小寫
byte[] getBytes():將該String對象轉換成byte數組
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):將字符串中從srcBegin開始,到srcEnd結束的字符賦值(將其替換)到dst字符數組中,其中dstBegin爲目標字符數組的起始複製位置
int indexOf(int ch):找出ch字符在該字符串中第一次出現的位置
int indexOf(int ch,int fromIndex):找出ch字符在該字符串中從fromIndex開始後第一次出現的位置
int indexOf(String str):找出str字符串在該字符串中第一次出現的位置
int indexOf(String str,int fromIndex):找出str字符串在該字符串中從fromIndex開始後第一次出現的位置
int lastIndexOf(int ch)
int lastIndexOf(int ch,int fromIndex)
int lastIndexOf(String str)
int lastIndexOf(String str,int fromIndex)
int length()
String replace(char oldChar,char newChar)
String replace(CharSequence target,CharSequence replacement)
boolean startsWith(String prefix)
boolean startsWith(String prefix,int toffset):該String對象從toffet位置算起,是否以prefix開始
String substring(int beginIndex):獲取從beginIndex位置開始到結束的子字符串
String substring(int beginIndex,int endIndex):獲取從beginIndex位置開始到endIndex位置的子字符串
char[] toCharArray()
String toLowerCase()
String toUpperCase()
static String valueOf(X x):一系列用於將基本類型值轉換爲String對象
  • 因爲String是不可變類,使用String相加的形式會產生很多臨時變量,使用StringBuffer或StringBuilder可以避免這個問題
  • StringBuffer和StringBuilder可以通過length()和setLength(int len)方法來訪問和修改字符序列的長度,capacity屬性表示它的容量,通常比length大,一般不需要關心
StringBuilder append(String str)
StringBuilder insert(int offset,String str)
StringBuilder replace(int start,int end,String str)
StringBuilder reverse()
StringBuilder delete(int start,int end)

4、Math

  • Java提供了Math工具類完成像三角函數、對運算、指數運算等複雜運算,Math是工具類,所有方法都是類方法,還提供了兩個類變量:PI和E
  • ThreadLocalRondom是Random的增強版,在併發訪問的環境下,使用ThreadLocalRandom可以減少線程資源競爭,保證系統具有更好的線程安全。
  • Random
Random random = new Random();
random.nextBytes(new byte[16]);
random.nextInt(10);
random.nextDouble();
...
  • ThreadLocalRandom
ThreadLocalRandom tlr = ThreadLocalRandom.current();
tlr.nextInt(4,20);
tlr.nextDouble(2.0,10.0);

5、BigDecimal

  • 爲了精確表示、計算浮點數,Java提供了BigDecimal類,該類提供了大量構造器用於創建BigDecimal對象
  • BigDecimal(double val)會帶來精度損失,應當優先使用BigDecimal(String str),如果必須使用double浮點數作爲構造器參數,應該使用BigDecimal.valueOf(double value)靜態方法來創建
  • BigDecimal提供了add()、subtract()、multiply()、divide()、pow()次方等方法驚醒常規運算

6、java.util.Date類處理日期、時間,但Date的大部分構造器、方法都已經過時,不再推薦使用

  • Date提供了6個構造器,其中四個已經Deprecated,剩下兩個構造器如下:
    Date():生成一個代表當前時間的Date對象,底層調用System.currentTimeMillis()獲取long整數作爲日期參數
    Date(long date)
  • Date對象大部分方法也Deprecated,剩下爲數不多的幾個方法:
    boolean after(Date when):測試該日期是否在指定日期when之後
    boolean before(Date when):測試該日期是否在指定日期when之前
    long getTime():返回該時間對應的long型整數,即從GMT 1970-01-01 00:00:00 到該Date對象之間的時間差,以毫秒作爲計時單位
    void setTime(long time):設置該Date對象的時間

7、Calender

  • Calender類是一個抽象類,它提供了幾個靜態方法getInstance()來獲取Calendar對象,這些方法根據TimeZone、locale來創建Calendar,如果不指定則使用系統默認的TimeZone、locale來創建
  • Calendar常用API
void add(int field,int amount):根據日曆的規則,爲給定的日曆字段添加或減去指定的時間量,如:calendar.getInstance().add(YEAR,-1)
int get(int field):返回指定日曆字段的值
int getActualMaximum(int field):返回指定日曆字段可能擁有的最大值,如:月的最大值爲11
int getActualMinimum(int field):返回指定日曆字段可能擁有的最小值,如:月的最小值爲0
void roll(int field,int amount):與add()類似,區別在於加上amount後超過了該字段所能表示的最大範圍時,也不會向上一個字段進位
void set(int field,int value):將給定的日曆字段設置爲給定值
void set(int year,int month,int date):設置Calendar對象的年、月、日三個字段的值
void set(int year,int month,int date,int hourOfDay,int minute,int second):設置Calendar對象的年、月、日、時、分、秒6個字段的值
field是Calendar的類變量,如:Calendar.MONTH
  • add()與roll()的區別
    roll當被修改字段超出它允許的範圍時,上級字段不會增大,而add則會
Calendar cal = Calendar.getInstance();
cal.set(2003,7,31,0,0,0);//2003-8-31
->cal.roll(MONTH,6);// 2003-2-28
->cal.add(MONTH,6);// 2004-2-29
  • Calendar的容錯性
    設置大於最大值的參數會向上一個字段進位,如果不希望自動進位,可以設置爲cal.setLenient(false);
  • Calendar轉化爲Date
Date date = Calendar.getInstance().getTime();
  • set()方法延遲修改
    set(f,value)方法將日曆字段f更改爲value,該Calendar所代表的時間卻不會立即修改,直到下次調用get()、getTime()、getTimeInMillis()、add()或roll()時纔會重新計算日曆時間,這被稱爲set()方法的延遲修改
  • add和set方法的微妙區別
Calendar cal = Calendar.getInstance();
cal.set(2017,7,31);//2017-08-31
->cal.add(Calendar.MONTH, 1);//2017-09-30
->cal.set(Calendar.MONTH, 8);//2017-09-30

8、Java8新增java.time

  • Clock:獲取指定時區的當前日期、時間
Clock clock = Clock.systemUTC();
clock.instant();//當前時刻
clock.millis();
clock.currentTimeMillis();
  • Duration:該類代表持續時間,可以獲取一段時間
Duration d = Duration.ofSeconds(6000);
d.toMinutes();
d.toHours();
d.toDays();
Clock clock = Clock.offset(clock,d);
clock.instant();//當前時刻+6000秒
  • Instant:代表一個具體的時刻,可以精確到納秒
Instant instant = Instant.now();//獲取當前時間
instant.plusSeconds(6000);//獲取當前時間+6000秒
Instant.parse("2014-02-23T10:12:35.342Z");//根據字符串解析Instant對象,只能用此格式,用“2017-01-01”報錯
  • LocalDate:該類代表不帶時區的日期
LocalDate.now();//獲取當前日期
LocalDate.ofYearDay(2014,146);//獲取2014年的第146天
LocalDate.of(2014,Month.MAY,21);
  • LocalTime:代表不帶時區的時間
LocalTime.now();//獲取當前時間
LocalTime.of(22,23);//22:33
LocalTime.ofSecondOfDay(5503);
  • LocalDateTime:代表不帶時區的日期、時間
  • MonthDay:代表月日,如:–04-12
  • Year:代表年,如:2014
Year year = Year.now();//當前年份
year.plusYears(5);//當前年份再加5年
  • YearMonth:代表年月
YearMonth ym = year.atMonth(10);
ym = ym.plusYears(5).minusMonths(3);//當前年月再加年、減3個月
MonthDay md = MonthDay.now();//當前年月
md = md.with(Month.MAY).withDayOfMonth(23);//輸出--05-23
  • ZonedDateTime:代表一個時區化的日期、時間
  • ZoneId:代表一個時區
  • DayOfWeed:枚舉類,定義了週日到週六的枚舉值
  • Month:枚舉類,定義了一月到十二月的枚舉類

9、正則表達式

  • 正則表達式是一個強大的字符串處理工具,可以對字符串進行查找、提取、分割、替換等操作
boolean mathches(String regex):判斷該字符串是否匹配指定的正則表達式
String replaceAll(String regex,String replacement):將該字符串中所有匹配regex的子串替換成replacement
String replaceFirst(String regex,String replacement):將該字符串中第一個匹配regex的子串替換成replacement
String split(String regex):以regex作爲分隔符,把該字符串分割成多個子串
  • 正則表達式就是一個用於匹配字符串的模板,可以匹配一批字符串,所以創建正則表達式就是創建一個特殊的字符串
    x:代表任何合法的字符
    \t:製表符’\u0009’
    \n:新行(換行)符(‘\u000A’)
    \r:回車符
    \f:換頁符
    \a:報警符
    \e:escape符
    \cx:x對應的控制符,如:\cM匹配Ctrl-M,x必須爲A~Z或a~z之一
  • 特殊字符需要在前面添加一個反斜槓(\)
$:匹配一行的結尾
^:匹配一行的開頭
():標記子表達式的開始和結束位置
[]:用於確定中括號表達式的開始和結束位置
{}:用於標記前面字表達式的出現頻度
*:指定前面子表達式可以出現零次或多次
+:指定前面字表達式可以出現一次或多次
?:指定前面子表達式可以出現零次或一次
.:匹配除換行符\n之外的任何單字符
\:用於轉義下一個字符
|:指定兩項之間任選一項
  • 預定義字符(通配符)
.:可以匹配任何字符
\d:匹配0~9的所有數字
\D:匹配非數字
\s:匹配所有的空白字符,包括空格、製表符、回車符、換頁符、換行符等
\S:匹配所有非空白字符
\w:匹配所有的單詞字符,包括0~9所有數字、26個英文字母和下畫線
\W:匹配所有非單詞字符
s代表space,d代表digit,w代表word
  • 方括號表達式
表示枚舉:[abc],表示a、b、c其中任意一個字符
表示範圍:[a-f]表示a~f範圍內的任意字符,[a-cx-z]表示a~c、x~z範圍內的任意字符
表示求否:abc表示非a、b、c的任意字符,a-f表示不是a~f範圍內的任意字符
表示“與”運算:[a-z&&[def]],求a~z和[def]的交集,表示d、e或f
表示“並”運算:[a-d[m-p]]表示[a-dm-p]
- 邊界匹配符
^:行的開頭
$:行的結尾
\b:單詞的邊界
\B:非單詞的邊界
\A:輸入的開頭
\G:前一個匹配的結尾
  • Pattern和Matcher
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaab");
boolean b = m.mathches();//返回true
// 上面的Pattern可以多次使用,如果某個正則表達式僅需使用一次,可以:
boolean b = Pattern.mathches("a*b","aaaab");//返回true
// 但這樣的方式每次都要重新編譯新的Pattern對象,效率不高
Pattern是不可變類,可供多個併發線程安全使用
  • Matcher常用API
find():返回目標字符串中是否包含於Pattern匹配的子串
group():返回上一次與Pattern匹配的子串
start():返回上一次與Pattern匹配的子串在目標字符串中的開始位置
end():返回上一次與Pattern匹配的子串在目標字符串中結束位置+1
lookingAt():返回目標字符串前面部分與Pattern是否匹配
mathches():返回整個目標字符串與Pattern是否匹配
reset():將現有的Matcher對象應用於一個新的字符序列
  • 用法
String regStr = "Java is very easy!";
Matcher m = Pattern.compile("\w+").matcher(regStr);
while (m.find()) {
    System.out.println(m.group() + "起始位置:" + m.start() + "結束位置:" + m.end());
}
// Java起始位置:0結束位置:4
// is起始位置:5結束位置:7
// very起始位置:8結束位置:12
// easy起始位置:13結束位置:17
  • matches()和lookingAt()方法有點相似,區別在於前者要求整個字符串匹配時才返回true,而lookingAt()只要字符串以Pattern開頭就返回true

10、格式化

  • 使用NumberFormat格式化數字
NumberFormat是一個抽象基類,提供以下API
getCurrencyInstance():返回默認Locale的貨幣格式器
getIntegerInstance():返回默認Locale的整數格式器
getPercentInstance():返回默認Locale的百分數格式器
// 123,456.7
NumberFormat.getNumberInstance(Locale.CHINA).format(123456.70);
// 123,457
NumberFormat.getIntegerInstance(Locale.CHINA).format(123456.70);
// 12,345,670%
NumberFormat.getPercentInstance(Locale.CHINA).format(123456.70);
// $123,456.70
NumberFormat.getCurrencyInstance(Locale.US).format(123456.70);
  • DateFormat格式化日期、時間
getDataInstance():返回一個日期格式器
getTimeInstance():返回一個時間格式器
getDateTimeInstance():返回一個日期、時間格式器
// 18-3-13
DateFormat.getDateInstance(DateFormat.SHORT).format(new Date());
// 2018-3-13
DateFormat.getDateInstance(DateFormat.MEDIUM).format(new Date());
// 2018年3月13日
DateFormat.getDateInstance(DateFormat.LONG).format(new Date());
// 2018年3月13日 星期二
DateFormat.getDateInstance(DateFormat.FULL).format(new Date());
// 下午4:41
DateFormat.getTimeInstance(DateFormat.SHORT).format(new Date());
// 16:41:45
DateFormat.getTimeInstance(DateFormat.MEDIUM).format(new Date());
// 下午04時41分45秒
DateFormat.getTimeInstance(DateFormat.LONG).format(new Date());
// 下午04時43分17秒 CST
DateFormat.getTimeInstance(DateFormat.FULL).format(new Date());
// 2018-3-13 16:41:45
DateFormat.getDateTimeInstance().format(new Date());
DateFormat的parse()方法可以把一個字符串解析成Date對象
// Fri Dec 12 00:00:00 CST 2014
DateFormat.getDateInstance().parse("2014-12-12");
// Wed Dec 10 00:00:00 CST 2014,因爲2014年12月10日是一個Long樣式的日期字符串,所以必須用LONG解析
DateFormat.getDateInstance(DateFormat.LONG).parse("2014年12月10日")
- SimpleDateFormat格式化日期
SimpleDateFormat可以非常靈活地格式化Date,也可以用於解析各種格式的日期字符串
// 公元2018年中第72天
new SimpleDateFormat("Gyyyy年中第D天").format(new Date());
// 2018-03-13 16:55:02
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
// Tue Mar 13 16:54:14 CST 2018
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2018-03-13 16:54:14");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章