一、引言 Oracle為Java提供了豐富的基礎類庫,Java 8 提供了4000多個基礎類庫,熟練掌握這些基礎類庫可以提高我們的開發效率,當然,記住所有的API是不可能也沒必要的,我們可以通過API文檔或直接網上搜索來逐漸熟悉大部分類的功能和方法,下麵我們來學習一些基礎類庫。 二、Scanner ...
一、引言
Oracle為Java提供了豐富的基礎類庫,Java 8 提供了4000多個基礎類庫,熟練掌握這些基礎類庫可以提高我們的開發效率,當然,記住所有的API是不可能也沒必要的,我們可以通過API文檔或直接網上搜索來逐漸熟悉大部分類的功能和方法,下麵我們來學習一些基礎類庫。
二、
Scanner類可以很方便的獲取用戶的鍵盤輸入,是一個基於正則表達式的文本掃描器,可以從文件、輸入流、字元串中解析出字元串和基本類型值,構造器也是以文件、輸入流、字元串為數據源進行構造,主要有兩種方法:
-
hasNextXxx():是否還有下一個Xxx類型輸入項。
//鍵盤輸入 Scanner scanner = new Scanner(System.in); //回車作為分隔符 scanner.useDelimiter("\n"); while (scanner.hasNext()) { System.out.println(scanner.next()); }
預設使用空白(空格、tab空白、回車)來進行項之間的分隔符。我們也可以直接按照行來進行分隔,調用下麵方法:
-
hasNextLine
-
nextLine
Scanner 還可以讀取文件輸入
try { Scanner scannerfile=new Scanner(new File("123.txt")); } catch (FileNotFoundException e) { e.printStackTrace(); }
三、
//鍵盤輸入 Scanner scanner = new Scanner(System.in); //回車作為分隔符 scanner.useDelimiter("\n"); while (scanner.hasNext()) { System.out.println(scanner.next()); } try { Scanner scannerfile=new Scanner(new File("123.txt")); } catch (FileNotFoundException e) { e.printStackTrace(); }
Runtime runtime = Runtime.getRuntime(); System.out.println("處理器數量:" + runtime.availableProcessors()); System.out.println("可用最大記憶體數:"+runtime.maxMemory()); System.out.println("空閑記憶體:"+runtime.freeMemory()); System.out.println("總記憶體數:"+runtime.totalMemory());
四、
Object 是所有類、數組、枚舉類的父類,任何類型都可以賦給Object,有以下常用的一些方法:
-
boolean equals(Object obj) 判斷指定對象與該對象是否相等。
-
void finalize() 垃圾回收器調用此方法來清理對象資源。
-
Class<?> getClass() 返回該對象運行時類。
-
int hashCode() 返回該對象的hash值。
-
Object還有控制線程的幾個方法,wait()、notify()、notifyAll()。
Java 7 之後新增了Objects方法,裡面提供了工具方法來操作對象,這些工具方法大多是空指針安全的,使用更安全。
字元串就是一連串字元序列,Java提供了String、StringBuffer、StringBuilder 三個類進行字元串封裝和處理。其中StringBuffer、StringBuilder基本相似,只是StringBuffer線程安全而StringBuilder線程不安全。
String類是不可變類,一旦創建,就不可改變,直至被銷毀。String類的不可變性,後面有機會再詳解。
String類提供了很多構造器:
String也提供了大量的方法來操作字元串對象,我們學習一些常用的方法:
String s = new String("abcdefg"); //獲取字元串中指定位置的字元 System.out.println(s.charAt(1)); //比較字元串的大小 System.out.println(s.compareTo("adasd")); //將該字元串與str連接在一起 s.concat("higk"); System.out.println(s); //與StringBuffer對象比較,值相等則返回true System.out.println(s.contentEquals(new StringBuffer("abcd"))); //將字元數組連綴成字元串 System.out.println(String.copyValueOf(new char[]{'a', 'b'})); //將字元數組的子數組連綴成字元串 System.out.println((String.copyValueOf(new char[]{'a', 'b', 'c', 'd', 'e'}, 2, 3))); //將字元串與指定對象比較 System.out.println(s.equals("abcdefg")); //忽略大小寫字元串與指定對象比較 System.out.println(s.equalsIgnoreCase("ABcdefg")); //將string對象轉換成Byte數組 byte[] bytes = s.getBytes(); for (int i = 0; i < bytes.length; i++) { System.out.println(bytes[i]); } char[] s1 = new char[]{'晚', '安', '!', '世', '界'}; String s2 = new String("。!?"); //將字元串從srcBegin開始,到srcEnd結束複製到字元串數組串中,dstBegin為字元串數組的初始位置 s2.getChars(0, 2, s1, 2); for (int i = 0; i < s1.length; i++) { System.out.println(s1[i]); } //查詢字元在字元串中第一次出現的位置 System.out.println(s.indexOf('b')); //查詢字元在字元串中從fromIndex後第一次出現在的位置 System.out.println(s.indexOf('b', 2)); //查詢子字元串在字元串中第一次出現的位置 System.out.println(s.indexOf("bc")); //查詢子字元在字元串中從fromIndex後第一次出現在的位置 System.out.println(s.indexOf("bc", 2)); //查詢字元在字元串中最後一次出現的位置 System.out.println(s.lastIndexOf('b')); //查詢字元在字元串中從fromIndex後最後一次出現在的位置 System.out.println(s.lastIndexOf('b', 2)); //查詢子字元串在字元串中最後一次出現的位置 System.out.println(s.lastIndexOf("bc")); //查詢子字元在字元串中從fromIndex後最後一次出現在的位置 System.out.println(s.lastIndexOf("bc", 2)); //字元串長度 System.out.println(s.length()); //替換字元串 s.replace('a', 'b'); System.out.println(s); //對象是否以某字元串結尾 System.out.println(s.startsWith("ab")); //String 對象是以某字串結尾 System.out.println(s.endsWith("fg")); //獲取從beginIndex位置開始到結束的子字元串 String substring = s.substring(4); System.out.println(substring); //獲取從beginIndex位置開始到endIndex結束的子字元串 String substring1 = s.substring(4, 6); System.out.println(substring1); char[] chars = s.toCharArray(); //轉換成char數組 for (int i = 0; i <chars.length ; i++) { System.out.println(chars[i]); } //將字元串轉換成小寫 String lowerCase = s.toLowerCase(); System.out.println(lowerCase); //將字元串轉換成大寫 String upperCase = s.toUpperCase(); System.out.println(upperCase);
由於String的不可變性,頻繁操作String時會產生大量的臨時變數,這時我們可以使用StringBuilder和StringBuffer,兩個類的用戶基本一致,在不需要線程安全時,建議使用StringBuilder。
StringBuilder sb=new StringBuilder(); //追加 sb.append("java"); System.out.println(sb); //插入 sb.insert(0,"hello "); System.out.println(sb); //替換 sb.replace(5,6,","); System.out.println(sb); //反轉 sb.reverse(); System.out.println(sb); //長度與容量 System.out.println(sb.length()+ sb.capacity());
//返回小於目標數的最大整數 System.out.println(Math.floor(-1.57)); //返回大於目標數的最小整數 System.out.println(Math.ceil(1.57)); //四捨五入 System.out.println(Math.round(2.3)); //取絕對值 System.out.println(Math.abs(-4.6)); //取最大數 System.out.println(Math.max(1,3));
Random random = new Random(); //生成一個int範圍內的隨機數 System.out.println(random.nextInt()); //生成0-30範圍的隨機數 System.out.println(random.nextInt(30)); //生成0.0-1.0 的隨機數 System.out.println(random.nextDouble());
五、日期、時間類
ava提供了Date和Calendar來處理日期和時間,但Date不僅不支持國際化,而且不同屬性也使用了前後矛盾的偏移量,Java 8 又提供了全新的日期時間庫。
Date 現在在用的有兩個構造器:
-
Date() :生成一個代表當前日期時間的date對象
-
Date(long date):指定的long型整數來生成一個Date對象
Date 還在使用的方法也很少:
Date date = new Date();
Date date1 = new Date(System.currentTimeMillis()+100);
//測試該日期是否在指定日期之後
System.out.println(date.after(date1));
//比較日期大小
System.out.println(date.compareTo(date1));
Date類設計的並不好,對日期的操作推薦使用Calendar。
5.2
Calendar calendar = Calendar.getInstance(); Date date2 = calendar.getTime(); Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(date2);
Calendar 類提供了大量訪問、修改日期時間的方法,常用方法如下:
//給指定的欄位增加或者減去時間量,如果指定量超過最大值,則進位 calendar.add(Calendar.YEAR,1); //獲取指定的欄位值 System.out.println(calendar.get(Calendar.YEAR)); System.out.println(calendar.get(Calendar.MONTH)); System.out.println(calendar.get(Calendar.DATE)); //設置日期值 calendar.set(2003,10,2,10,50,10); //給指定的欄位增加或者減去時間量,如果指定量超過最大值,不進位 calendar.roll(Calendar.YEAR,13);
5.3
Java 8 提供了java.time 包來處理日期和時間,常用的類:
-
Clock:獲取指定時區的當前日期、時間。
-
Duration:代表持續時間,可以方便的獲取一段時間。
-
Instant:代表具體時刻,可以精確到納秒。
-
LocalDate:該類代表不帶時區的日期。
-
LocalTime:該類代表不帶時區的時間。
-
LocalDateTime:該類代表不帶時區的日期、時間。
-
MonthDay:該類代表月日。
-
Year:代表年。
-
YearMonth:代表年月。
正則表達式是強大的字元串處理工具,可以對字元串進行查找、提取、分隔、替換等操作。
Java提供了Pattern和Matcher來使用正則表達式
//將字元串編譯成Pattern對象 Pattern pattern = Pattern.compile("a*b"); //使用Pattern創建Matcher對象 Matcher matcher = pattern.matcher("aaaaab"); System.out.println(matcher.matches()); //只能使用一次,效率不高 Pattern.matches("a*b", "aaabbb"); String s = "XXX:13892329111,XXX:18922121231,XXX:13824322341"; Matcher matcher1 = Pattern.compile("1\\d{10}").matcher(s); //返回目標字元串中是否包含匹配的字串 while (matcher1.find()) { //返回上一次匹配的字串 System.out.println(matcher1.group()); }
七、
//將日期轉換成固定格式 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); System.out.println(simpleDateFormat.format(date)); //日期字元串 String str = "14###三月##21"; SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("y###MMM##d"); //將日期字元串解析成日期,主要格式要匹配的上,不然會報錯 System.out.println(simpleDateFormat.format(simpleDateFormat1.parse(str)));
7.2
我們可以通過常量來創建格式化器,也可以使用不同風格的枚舉值來創建
DateTimeFormatter[] formatters=new DateTimeFormatter[]{ //常量創建 DateTimeFormatter.ISO_DATE_TIME, DateTimeFormatter.ISO_LOCAL_DATE, DateTimeFormatter.ISO_DATE, //枚舉值創建 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL,FormatStyle.MEDIUM), //模式字元串 DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd") }; LocalDateTime localDate = LocalDateTime.now(); for (int i = 0; i <formatters.length ; i++) { //兩種方式格式化日期 System.out.println(formatters[i].format(localDate)); System.out.println(localDate.format(formatters[i])); }
DateTimeFormatter 也可以將字元串直接轉成日期,用法與SimpleDateFormat 相同。