【給小白看的Java教程】第二十八章,認識Java的一些常用類
###BigDecimal(掌握) float和double都不能表示精確的小數,使用BigDecimal類可以解決該問題,BigDecimal用於處理金錢或任意精度要求高的資料。 BigDecimal不能直接把賦值和運算操作,只能通過構造器傳遞資料,而且必須使用字串型別的構造器,操作BigDecimal主要是加減乘除四個操作。
// 使用double型別: System.out.println(0.09 + 0.01);// ? // 使用BigDecimal型別double型別的構造器: BigDecimal num1 = new BigDecimal(0.09); BigDecimal num2 = new BigDecimal(0.01); System.out.println(num1.add(num2));// ? // 使用BigDecimal型別String型別的構造器: BigDecimal num3 = new BigDecimal("0.09"); BigDecimal num4 = new BigDecimal("0.01"); System.out.println(num3.add(num4));// ?
結果為:
0.09999999999999999
0.09999999999999999687749774324174723005853593349456787109375
0.10
加減乘除操作:
BigDecimal num1 = new BigDecimal("10"); BigDecimal num2 = new BigDecimal("3.1415926"); BigDecimal ret1 = num1.add(num2); BigDecimal ret2 = num1.subtract(num2); BigDecimal ret3 = num1.multiply(num2).setScale(2, RoundingMode.HALF_UP); BigDecimal ret4 = num1.divide(num2, 2 , RoundingMode.HALF_UP);
上述藍色區域程式碼分別表示乘法和除法按照四捨五入方式保留兩位小數。
###隨機數
####Math(瞭解) Math 類包含用於執行數學運算的方法,如初等指數、對數、平方根和三角函式等,該類的方法都是static修飾的,在開發中其實運用並不是很多,裡面有一個求隨機數的方法,偶爾會用到。
public class MathDemo { public static void main(String[] args) { System.out.println(Math.max(99, 10));// 返回最大值 System.out.println(Math.min(99, 10));// 返回最小值 // 返回一個[0,1)之間的隨機小數 double num = Math.random(); System.out.println(num); // 得到一個[0,100)之間的隨機整數 int intNum1 = (int) (num * 100); System.out.println(intNum1); //得到23~104之間的隨機數等價於0~81之間隨機數+23 int intNum2 = (int)(Math.random() * 81 + 23); System.out.println(intNum2); } }
####Random(瞭解) Random類用於生產一個偽隨機數(通過相同的種子,產生的隨機數是相同的),Math類的random方法底層使用的就是Random類的方式。
public class RandomDemo {
public static void main(String[] args) {
Random r = new Random();
int intNum1 = r.nextInt(100);// 100以內隨機數
System.out.println(intNum1);
// 隨機獲取A~Z之間的5個字母組成的字串
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++) {
int intNum2 = 65 + r.nextInt(25);
char ch = (char) intNum2;
sb.append(ch);
}
System.out.println(sb);
}
}
###UUID (瞭解) UUID表示通用唯一識別符號 (Universally Unique Identifier) ,其演算法通過電腦的網絡卡、當地時間、隨機數等組合而成,優點是真實的唯一性,缺點是字串太長了。
public class UUIDDemo {
public static void main(String[] args) {
//UUID隨機字串
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
//獲取UUID前5個字母作為驗證碼
String code = uuid.substring(0, 5);
System.out.println(code);
System.out.println(code.toUpperCase());//把驗證碼轉為大寫字母
}
}
字串
字串(字元序列),表示把多個字元按照一定得順序排列起來。
字串的分類(根據同一個物件,內容能不能改變而區分):
-
不可變的字串——String:當String物件建立完畢之後,該物件的內容是不能改變的,一旦內容改變就變成了一個新的物件。
-
可變的字串——StringBuilder/StringBuffer:當StringBuilder物件建立完畢之後,物件的內容可以發生改變,當內容發生改變的時候,物件保持不變。
字串的本質是char[],char表示一個字元,char[]表示同一種類型的多個字元。
String str = "ABCD"; 等價於 char[] cs = new char[]{'A','B','C','D'};
String(掌握)**
String概述
String類,表示不可變的字串,當String物件建立完畢之後,該物件的內容是不能改變的,一旦內容改變就變成了一個新的物件,看下面程式碼。
String str = "龍哥";
str = "龍哥17";
String物件的建立的兩種方式:
1、直接賦一個字面量: String str1 = "ABCD";
2、通過構造器建立: String str2 = new String("ABCD");
兩種方式有什麼區別,分別在記憶體中如何分佈?
String物件的空值:
-
表示引用為空(null) : String str 1 = null ; 沒有初始化,沒有分配記憶體空間.
-
內容為空字串 : String str2 = “”; 已經初始化,分配記憶體空間,不過沒有內容
判斷字串非空:字串不為null並且字元內容不能為空字串(“”)
判斷一個字串非空:
public static boolean hasLength(String str) {
return str != null && !"".equals(str.trim());
}
字串的比較操作:
-
使用”==”號:比較兩個字串引用的記憶體地址是否相同
-
使用equals方法:比較兩個字串的內容是否相同
System.out.println("ABCD" == "ABCD"); //true
System.out.println("ABCD" == new String("ABCD")); //false
System.out.println("ABCD".equals("ABCD")); //true
System.out.println("ABCD".equals(new String("ABCD"))); //true
常用方法(要記住)
-
int length() 返回此字串的字元個數
-
char charAt(int index) 返回指定索引位置的字元
-
int indexOf(String str) 返回指定子字串在此字串中第一次出現處的索引位置
-
boolean equals(Object anObject) 比較內容是否相同
-
boolean equalsIgnoreCase(String anotherString) 忽略慮大小寫,比較內容是否相同
-
String toUpperCase() 把當前字串轉換為大寫
-
String toLowerCase() 把當前字串轉換為小寫
-
String substring(int beginIndex):從指定位置開始擷取字串
-
String substring(int beginIndex, int endIndex):擷取指定區域的字串
public class StringDemo{
public static void main(String[] args) {
String str = "HelloWorld";
System.out.println(str.length());// 10
char ch = str.charAt(3);
System.out.println(ch);// l
int index = str.indexOf("lo");
System.out.println(index);// 3
System.out.println("helloworld".equals(str));// false
System.out.println("helloworld".equalsIgnoreCase(str));// true
System.out.println(str.toLowerCase());// helloworld
System.out.println(str.toUpperCase());// HELLOWORLD
String str1 = str.substring(3);
System.out.println(str1);// loWorld
String str2 = str.substring(3, 6);
System.out.println(str2);// loW
}
}
StringBuilder(掌握)
Sting是不可變的,每次內容改變都會在記憶體中建立新的記憶體區域,如果現在要把N個字串連線起來,此時需要在記憶體中建立N塊記憶體空間,效能很低。此時要解決多個字串做拼接效能低的問題,我們可以使用StringBuilder來搞定。
StringBuffer和StringBuilder都表示可變的字串,功能方法相同的,區別是:
-
StringBuffer:StringBuffer中的方法都使用了synchronized修飾,保證執行緒安全但效能較低
-
StringBuilder:StringBuilder中的方法沒有使用synchronized修飾,執行緒不安全但但是效能較高
開發中建議使用StringBuilder,具體用法如下:
- 如果事先知道需要拼接多少個字元,可以在建立StringBuilder物件時指定字元陣列容量,預設為16
StringBuilder sb = new StringBuilder(40);
使用append方法在原字串後面繼續拼接字串
sb.append("ABC").append(123).append("will");
程式碼:
public class StringBuilderDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer(40);
sb.append("abc").append("will").append(17);
String str = sb.toString();
System.out.println(str); //abcwill17
}
}
日期
Date(掌握)
Date類,時期時間類,表示特定的瞬間,可以解釋為年、月、日、小時、分鐘和秒值。
注意:我們使用的是java.util.Date類,而不是java.sql.Date。
Date類中的大量方法都標記為已經時的,即官方不建議使用。在開發中,我們要表示日期(年月日)或時間(時分秒)型別都使用Date類來表示。
public class DateDemo {
public static void main(String[] args) {
java.util.Date d = new java.util.Date();
System.out.println(d);// 歐美人的時間風格
System.out.println(d.toLocaleString());// 本地區域時間風格
long time = d.getTime();// 獲取當前系統時間距離1970 年 1 月 1 日 00:00:00 以來的毫秒數
System.out.println(time);
}
}
輸出結果:
Thu May 17 14:25:12 CST 2018
2018-5-17 14:25:12
1526538312866
SimpleDateFormat(掌握)
列印Date物件時,預設列印的是歐美人的日期時間風格,如果需要輸出自定義的時間格式,比如2020年12月12日 12:12:12格式或者2020-12-12 12:12:12,此時可以使用SimpleDateFormat類。
SimpleDateFormat類,顧名思義是日期的格式化類,主要包括兩個功能的方法:
-
格式化(format):Date型別轉換為String型別:String format(Date date)
-
解析(parse):String型別轉換為Date型別:Date parse(String source)
無論是格式化還是解析都需要設定日期時間的模式,所謂模式就是一種格式。
日期模式舉例:
yyyy-MM-dd 如2020-12-12
HH:mm:ss 如20:12:12
yyyy-MM-dd HH:mm:ss 如2020-12-12 20:12:12
yyyy/MM/dd HH:mm:ss 如2020/12/12 20:12:12
yyyy年MM月dd日 HH時mm分ss秒 如2020年12月12日 20時12分12秒
格式化和解析程式碼如下:
public class SimpleDateFormatDemo {
public static void main(String[] args) throws Exception {
java.util.Date d = new java.util.Date();
// 建立SimpleDateFormat物件,設定日期時間轉換模式
SimpleDateFormat sdf = new SimpleDateFormat();
String pattern = "yyyy-MM-dd HH:mm:ss";
sdf.applyPattern(pattern);
// 格式化(format):Date型別轉換為String型別:String format(Date date)
String str = sdf.format(d);
System.out.println(str);//2018-05-17 14:48:38
// 解析(parse):String型別轉換為Date型別:Date parse(String source)
java.util.Date dd = sdf.parse(str);
System.out.println(dd);//Thu May 17 14:48:38 CST 2018
}
}
程式碼中public static void main(String[] args) throws Exception表示丟擲異常,在main方法中不作任何處理,在異常章節再細講。
Calendar(瞭解)
Calendar是日曆類,主要用來對日期做相加減,重新設定日期時間功能,Calendar本身是一個抽象類,通過getInstance方法獲取物件,其底層建立的是Calendar的子類物件。
public class CalendarDemo1 {
public static void main(String[] args) throws Exception {
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = 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);
System.out.println(year);//2018
System.out.println(month);//5
System.out.println(date);//17
System.out.println(hour);//15
System.out.println(minute);//1
System.out.println(second);//38
c.add(Calendar.YEAR, 100);//在當前年份上增加100
System.out.println(c.get(Calendar.YEAR));//2118
}
}
需求:查詢某個時間最近一週的資訊,如何表示最近這一週的開始時間和結束時間
假如給出時間為:2018-05-18 15:05:30,那麼最近一週的開始和結束時間分別為:
開始時間:2018-05-12 00:00:00
結束時間:2018-05-18 23:59:59
public class CalendarDemo2 {
public static void main(String[] args) throws Exception {
String input = "2018-05-18 15:05:30";// 輸入時間
String pattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern(pattern);
Date d = sdf.parse(input);
// -------------------------------------------
Calendar c = Calendar.getInstance();
c.setTime(d);// 把當前輸入時間轉換為Calendar物件
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.MINUTE, 59);
c.set(Calendar.SECOND, 59);
Date endDate = c.getTime();
System.out.println(endDate.toLocaleString());
c.add(Calendar.SECOND, 1);// 秒數增加1
c.add(Calendar.DAY_OF_MONTH, -7);// 天數減去7
Date beginDate = c.getTime();
System.out.println(beginDate.toLocaleString());
}
}
正則表示式
正則表示式,簡寫為regex和RE。
正則表示式用來判斷某一個字串是不是符合某一種正確的規則,在開發中通常用於判斷操作、替換操作、分割操作等。
正則表示式規則
正則表示式匹配規則一:
正則表示式匹配規則二:
正則表示式練習
判斷一個字串是否全部有數字組成
判斷一個字串是否是手機號碼
判斷一個字串是否是18位身份證號碼
判斷一個字串是否6到16位,且第一個字必須為字母
public class REDemo {
public static void main(String[] args) throws Exception {
// 判斷一個字串是否全部有數字組成
System.out.println("12345678S".matches("\\d"));// false
System.out.println("12345678".matches("\\d"));// false
System.out.println("12345678".matches("\\d*"));// true
System.out.println("1234".matches("\\d{5,10}"));// false
System.out.println("12345678".matches("\\d{5,10}"));// true
// 判斷一個字串是否是手機號碼
String regex1 = "^1[3|4|5|7|8][0-9]{9}$";
System.out.println("12712345678".matches(regex1));// false
System.out.println("13712345678".matches(regex1));// true
// 判斷一個字串是否是18位身份證號碼
String regex2 = "\\d{17}[[0-9]X]";
System.out.println("511123200110101234".matches(regex2));// true
System.out.println("51112320011010123X".matches(regex2));// true
System.out.println("51112320011010123S".matches(regex2));// false
// 判斷一個字串是否6到16位,且第一個字必須為字母
String regex3 = "^[a-zA-Z]\\w{5,15}$";
System.out.println("will".matches(regex3));// false
System.out.println("17will".matches(regex3));// false
System.out.println("will17willwillwill".matches(regex3));// false
System.out.println("will17".matches(regex3));// true
}
}
若要獲得最好的學習效果,需要配合對應教學視訊一起學習。需要完整教學視訊,請參看https://ke.qq.com/course/272077。