回顧總結12
常用類
Math
常用方法
- bas:絕對值
- pow:求冪
- ceil:向上取整
- floor:向下取整
- round:四捨五入
- sqrt:開方
- random:隨機數[0~1)之間
- max:最大值
- min:最小值
Arrays
常用方法
arrays類包含了一系列靜態方法,用於管理或運算元組(排序和搜尋)
-
toString:返回陣列的字串形式
-
sort:自然排序,預設為升序
還可以定製排序,通過傳入一個介面Comparator實現匿名內部類,如果返回大於0,升序,返回小於0,降序 -
binarySearch:二分搜尋法進行查詢,要求有序,如果存在返回陣列所在下標,如果不存在,返回-(該資料應該所在的位置下標+1)
-
copyOf(arr,newArr.length):當newArr.length > arr.length時,增加null,newArr.length < arr.length時,只拷貝前newArr.length個數據。
-
fill(arr,填充值):陣列填充,把陣列用給的引數填充
-
equals:陣列元素一樣時,返回true
-
asList:將陣列轉換成List
List asList = Arrays.asList(2,3,4,5,6,1);
asList的編譯型別是List,執行型別是Arrays下的靜態內部類ArraysList
System
常用方法
-
exit:退出當前程式,0表示正常退出
-
arraycopy:複製陣列元素,比較適合底層呼叫,一般使用Arrays.copyOf方法完成陣列複製
System.arraycopy(src,0,dest,0,3); //引數1:源陣列,被拷貝的 //引數2:拷貝的源陣列的起始位置(索引下標) //引數3:目標陣列,拷貝到 //引數4:拷貝的目標陣列的起始位置(索引下標) //引數5:拷貝個數
-
currentTimeMillens:返回當前時間距離1970-1-1的毫秒數
-
gc:執行垃圾回收機制
BigInteger和BigDecimal
BigInteger
比較大的整數
BigInteger bigIntrger = new BigInteger(String s) //s就是需要儲存的數字
BigDecimal
比較大的小數
BigDecimal bigDecimal = new BigDecimal(String s)
//s就是需要儲存的數字
常用方法
- add:加
- subtract:減
- multiply:乘
- divide:除
- BigDecimal的devide方法可能會丟擲異常,因為無限小數。所以我們可以為它指定精度,如bigDecimal1.divide(bigDecimal2, BigDecimal.ROUND_CEILING),會保留分子的精度
日期類
Date(日期)
第一代日期類
獲取當前系統時間
java.util包下
日期格式直接輸出是國外的方式,所以要對格式進行轉換,使用SimpleDateFormat類 ,把日期轉換成相應的字串形式輸出。
SimpleDateFormat物件是用來轉換日期格式的
Date d1 = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");//分別輸出年月日,時分秒,星期
String format = sdf.format(d1);
Calendar(日曆)
第二代日期類
是一個抽象類,構造器是protected的,通過getInstance方法來獲取例項。主要提供大量欄位和方法
為特定瞬間與一組如YEAR、MONTH、DAY_OF_MONTH、HOUR等日曆欄位之間的轉換提供了一些方法,併為操作日曆欄位(如獲取下星期的日期)提供了一些方法
Calendar c = Calendar.getInstance();
c.get(Calendaer.YEAR);
c.get(Calendaer.MONTH)+1;//MONTH是從0開始計算
c.get(Calendaer.DAY_OF_MONTH);
c.get(Calendaer.HOUR);//12小時制,24小時制是HOUR_OF_DAY
c.get(Calendaer.MINURE);
c.get(Calendaer.SECOND);
Calendar沒有專門的格式化類,所以需要程式設計師自己來組合顯示
LocalDate、LocalTime、LocalDateTime
第三代日期,JDK8時加入
彌補前兩代日期的不足
歷史:JDK1.0中包含了一個java.util.Date類,但是它的大多數方法已經在JDK1.1引入Calendar類後被棄用了。Calendar存在的問題
- 可變性:像日期和時間這樣的類應該是不可變的。
- 偏移性:Date中的年份是從1900開始的,而月份都是從0開始
- 格式化:格式化只對Date有用,Calendar沒有
- 安全性:它們不是執行緒安全的,不能處理潤秒等(每隔兩天,多出1秒)
LocalDate(日期)
LocalDate只包含日期,可以獲取日期欄位(年月日)
LocalTime(時間)
LocalTime只包含時間,可以獲取時間欄位(時分秒)
LocalDateTime(時間日期)
LocalDateTime包含日期和時間,可以獲取日期和時間欄位(年月日 時分秒)
//1
LocalDateTime ldt = LocalDateTime.now();//返回當前日期時間的物件例項
ldt.getYear();
ldt.getMonth();
ldt.getMonthValue();
ldt.getDayOfMonth();
ldt.getHour();
ldt.getMinute();
ldt.getSecond();
//2
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = dtf.format(ldt);
Instant時間戳
java.time.Instant類
可以和第一代的Date進行轉換
類似於Date,提供了一系列和Date類轉換的方式
Instant------------>Date:Date date = Date.from(instant)
Date------------>Instant:Instant instant = Date.toInstant()
//3
Instant now = Instant.now();
Date date = Date.from(now);
Instant instant = date.toInstant();
總結
第一代Date是通過new獲取的日期和格式類,不安全。第二代Calendar改進,通過靜態類呼叫getInstance方法獲取日期,但是沒能處理潤秒等的問題,而且沒有對應的格式化類。第三代LocalDate、LocalTime、LocalDateTime通過靜態類呼叫now方法獲取日期,處理了以上幾代的缺陷。有格式化類DateTimeFormatter,通過靜態類呼叫ofPattern方法進行日期的格式化操作
常用類作業
1. String_toCharArray
要求:將字串中指定部分進行反轉,比如將"abcdef"反轉為"aedcbf",編寫方法public static String reverse(String str, int start,int end)
思考:使用String的substring擷取子串,用一個String接收,然後定義一個相同長度的新的String,進行互動資料,最後把反轉過的String用StringBuffer的replace替換掉原有的資料。
優化:直接在原有的String上操作,只用生成一個新的String物件。先使用String的toCharArray把字串轉換成字元陣列,然後在數組裡操作。也不用新建陣列進行end-start次交換,在原有陣列上進行交換,能減少一半的次數。有兩個變數記錄開始和結束,每一次交換結束就前進一步,當差值不大於1的時候,說明交換完畢。然後新建一個String接收轉換後的陣列輸出即可。
public static void main(String[] args) { String str1 = reverse("abcdef",1,4); System.out.println(str1.toString()); }public static String reverse(String str,int start,int end){ char[] chars = str.toCharArray(); char temp = ' '; for(;start < end;start++,end--){ temp = chars[start]; chars[start] = chars[end]; chars[end] = temp; }}
2. 異常處理
要求:輸入使用者名稱、密碼、郵箱,如果資訊錄入正確,則提示註冊成功,否則生成對應的異常物件
- 使用者名稱長度為2或3或4
- 密碼長度為6,並且要求全是數字
- 郵箱中包含@和.符號,並且@要在.的前面
編寫一個驗證方法userRegister
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); do { System.out.print("請輸入使用者名稱"); String name = scanner.next(); System.out.print("請輸入密碼"); String pwd = scanner.next(); System.out.print("請輸入郵箱"); String email = scanner.next(); try { userRegister(name,pwd,email); System.out.println("註冊成功"); return; } catch (Exception e) { System.out.println(e.getMessage()); return; } }while(true);}public static void userRegister(String name ,String pwd ,String email){ //第一關 使用者名稱 if(!(name.length() >=2 && name.length() <= 4)){ throw new RuntimeException("賬戶名長度要在2到4之間"); } //第二關 密碼 這裡出現了要判斷字元是否為數字,程式碼太長,不便於寫在這, //我們封裝成一個方法,專門用來判斷是不是數字,然後在這裡呼叫它 if(!(pwd.length() == 6 && isDigital(pwd))){ throw new RuntimeException("密碼必須為數字組合"); } //第三關 郵箱 int i = email.indexOf("@"); int j = email.indexOf("."); if(!(i >0 && j > i)){ throw new RuntimeException("郵箱@和.的格式不對"); }}public static boolean isDigital(String pwd){ for (int i = 0; i < pwd.length(); i++) { if(Character.isDigit(pwd.charAt(i))){ return true; } } return false;}
3. String_split
要求:輸入形式為:"Willian Jefferson Clinton",輸出形式為:Clinton,Willian .J
public static void main(String[] args) { printName("Willian Jefferson Clinton");}public static void printName(String str){ if(str == null){ System.out.println("不能為空"); return; } String[] names = str.split(" "); if(!(names.length == 3)){ //(names.length != 3) System.out.println("輸入的字串格式不對"); return; } //System.out.println(names[2]+","+names[0]+" ."+names[1].charAt(0)); String format = String.format("%s,%s.%c",names[2],names[0],names[1].toUpperCase().charAt(0)); System.out.println(format); }