整理下這一周的最后一些內容。雖然東西不多,但以后也可以常回來看看。
個人感覺還是代碼最好表達自己想要記憶的東西,不夠的話再把注釋加上。亂七八糟的概念百度上大同小異,只有代碼是屬於你自己的,是唯一的,也是你應該留下的。
包裝類
我們所使用的一般數據類型,又稱為值類型。這種數據類型存儲在棧中,不屬於對象的范疇。但Java是一門面向對象的語言,萬物皆對象,自然不能把這些值類型排除在外,所以有了包裝類。
所謂包裝類,就是把我們所用到的值類型變量進行一個包裝,使我們能通過對象的方式對其進行操作,讓其有自己的屬性和方法。把值類型數據包裝成引用數據類型的這一過程又稱為裝箱,而這一逆過程則稱之為拆箱。
包裝類的對應關系:

一般情況,我們的編譯器會對數據進行自動裝箱拆箱:
1 int aInt = 0; 2 Integer aInteger = aInt; //自動裝箱 3 int aI2i = aInteger; //自動拆箱
常用的一些方法及與字符串之間的相互轉換(以Integer為例)
static intparseInt(String s) 將字符串轉成相應int數據類型的數staticIntegervalueOf(int i) 裝箱方法
同樣,String類提供了各基本數據類型轉換成String的相應方法:static String valueOf(int i)
日期工具類
1、類 Date
常用的方法:
Date(long date) 默認無參構造函數就不說了,其獲取的是系統當前時間。這個帶參構造函數傳入一個long類型的值,代表着時間戳,即1970.1.1開始計算的毫秒數after(Date when) 跟另外一個Date對象比較,返回是否在when之后。before(Date when) 跟另外一個Date對象比較,返回是否在when之前。getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數。
Date類的操作方法十分之少,主要是由於Calendar類和DateFormat類的出現,使其只作為一個很雞肋的存在,除了獲取毫秒數,基本沒有別的功能,對Date對象的操作都交由DateFormat來處理。
2、類 SimpleDateFormat
從名字我們就可以看出,這是一個對時間進行格式化處理的類,通過該類我們可以指定Date對象以特定的格式顯示,也可以使特定格式的字符串轉成一個Date對象。
一些模式字母:
- y 年
- M 月
- d 天
- w 年中的周數
- W 月中的周數
- E (星期中的天數)星期
- H 小時(0~23)
- h 小時(1~12)
- s 秒數
- S 毫秒數
常用到的方法:
SimpleDateFormat() 用默認的模式和默認語言環境的日期格式符號構造SimpleDateFormat。SimpleDateFormat(String pattern) 用給定的模式和默認語言環境的日期格式符號構造SimpleDateFormat。applyPattern(String pattern) 將給定模式字符串應用於此日期格式。format(Date date) 將日期格式化成日期/時間字符串。(jdk1.8)parse(String text) 從給定字符串的開始解析文本以生成日期。(jdk1.8)
1 Date date = new Date(); 2 //實例化SimpleDateFormat對象並傳入特定格式 3 SimpleDateFormat spdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E"); 4 //將date格式化后轉成字符串 5 String nowDateString = spdf.format(date); 6 //打印格式化日期字符串 7 System.out.println(nowDateString);
1 2018-07-22 20:20:24 星期日
1 //將spdf應用新的格式 2 spdf.applyPattern("yyyy-MM"); 3 try { 4 //將特定格式字符串轉成Date對象,拋出ParseException 5 Date str2Date = spdf.parse("2018-9"); 6 //獲取轉換后的時間戳 7 long str2DateMills = str2Date.getTime(); 8 System.out.println(str2DateMills); 9 } catch (ParseException e) { 10 System.out.println("日期格式錯誤!"); 11 }
1 1535731200000
3、類 Calendar(abstract)
日歷類比日期類功能要豐富很多,它提供了很多對時間字段的獲取和操作方法,但它不能被SimpleDateFormat操作,所以只能自己寫算法實現對其時間的格式輸出和與字符串之間的相互轉換。
一些事件字段(靜態常量,在get、set等方法中被使用):
DATE 指示一個月中的某天。DAY_OF_MONTH 指示一個月中的某天。DAY_OF_YEAR 指示當前年中的天數。HOUR 指示上午或下午的小時(1~12)。HOUR_OF_DAY 指示一天中的小時(0~23)。YEAR 年MONTH 月DAY_OF_WEEK 指示一個星期中的某天。
常用方法:
add(int field, int amount) 對某個時間字段進行增減操作get(int field) 返回給定日歷字段的值getActualMaximum(int field) 返回給定時間字段的當前最大值getActualMinimum(int field) 返回給定時間字段的當前最小值getInstance() 返回一個Calendar實例。由於Calendar是抽象類,不能被實例化,所以只能通過該方法來獲取實例getTime() 返回一個與當前Calendar對象時間相同的Date對象getTimeInMillis() 返回時間戳set(int field, int value) 將給定的日歷字段設置為給定值setTime(Date date) 使用給定的Date設置此 Calendar 的時間setTimeInMillis(long millis) 用給定的 long 值設置此 Calendar 的當前時間值
使用比較簡單,這里只演示一個將字符串轉換為Calendar格式方法: 先通過SimpleDateFormat將字符串轉成Date對象,再通過setTime方法來對Calendar進行設置。
1 System.out.println("請輸入一個日期(xxxx-xx-xx):"); 2 String str = scanner.next(); 3 try { 4 //字符串轉Date並通過Date設置Calendar 5 calendar.setTime(sdf.parse(str)); 6 } catch (ParseException e) { 7 System.out.println("時間格式錯誤!"); 8 return; 9 }
Arrays 工具類
常用方法
binarySearch(byte[] a, byte key) 使用二分搜索法來搜索指定的 byte 型數組,以獲得指定的值。binarySearch(byte[] a, int fromIndex, int toIndex, byte key)使用二分搜索法來搜索指定的 byte 型數組的范圍,以獲得指定的值。copyOf(byte[] original, int newLength)復制指定的數組,截取或用 0 填充(如有必要),以使副本具有指定的長度。copyOfRange(boolean[] original, int from, int to)將指定數組的指定范圍復制到一個新數組。equals(byte[] a, byte[] a2)如果兩個指定的 byte 型數組彼此相等,則返回 true。fill(byte[] a, byte val)將指定的 byte 值分配給指定 byte 節型數組的每個元素。sort(byte[] a)對指定的 byte 型數組按數字升序進行排序。sort(byte[] a, int fromIndex, int toIndex)對指定 byte 型數組的指定范圍按數字升序進行排序。toString(byte[] a) 返回指定數組內容的字符串表示形式。
在使用Arrays工具類的二分法查找時,由於二分法的原理(先將數組一分為二,再與其中間元素進行對比,按對比結果判斷要查找的元素在哪一半,直到找到該元素,返回下標),所以必須先將該數組進行排序,否則所找到的結果並無意義。
public int myBinarySearch(int[] arr, int obj) { //查找長度 int len = arr.length; //要進行比較的元素 int index = (len-1)/2; //數組邊界(元素所在位置為arr[bound, arr.length - 1]) int bound = 0; while (true) { if (arr[index]<obj) { //例如查找的元素為5, 而arr[index] = 3,arr[index + 1] = 6,說明5並不存在數組中 if(arr[index+1]>obj) { return -1; } bound = index; index = len - index; index /= 2; index = bound + index; } else if (arr[index]>obj) { //與arr[index]<obj情況相同 if(arr[index-1]<obj) { return -1; } index /= 2; } else { //判斷元素是否重復,重復則找到第一個出現的元素 while (arr[index-1]==obj) { index--; } return index; } //判斷查找范圍是否越界 if (index<0 || index>arr.length-1) { return -1; } //判斷元素首部和尾部是否為該元素,是則返回index if (index==0 || index==arr.length-1) { if(arr[index]==obj) { return index; } else { return -1; } } } }
Collections 工具類
常用方法
addAll(Collection<? super T> c, T... elements) 將所有指定元素添加到指定 collection 中。binarySearch(List<? extends Comparable<? super T>> list, T key) 使用二分搜索法搜索指定列表,以獲得指定對象(實現Comparable接口)。binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 使用二分搜索法搜索指定列表,以獲得指定對象(傳入Comparator比較器)。copy(List<? super T> dest, List<? extends T> src) 將所有元素從一個列表復制到另一個列表。fill(List<? super T> list, T obj) 使用指定元素替換指定列表中的所有元素。max(Collection<? extends T> coll) 根據元素的自然順序,返回給定 collection 的最大元素。max(Collection<? extends T> coll, Comparator<? super T> comp) 根據指定比較器產生的順序,返回給定 collection 的最大元素。min(Collection<? extends T> coll) 根據元素的自然順序 返回給定 collection 的最小元素。min(Collection<? extends T> coll, Comparator<? super T> comp)根據元素的自然順序 返回給定 collection 的最小元素。reverse(List<?> list) 反轉指定列表中元素的順序。sort(List<T> list) 根據元素的自然順序 對指定列表按升序進行排序。sort(List<T> list, Comparator<? super T> c) 根據元素的自然順序 對指定列表按升序進行排序。swap(List<?> list, int i, int j) 在指定列表的指定位置處交換元素。
由於Collection集合所存元素皆為對象,所以要進行比較,必須實現Comparable接口或者傳入Comparator比較器,否則無法進行比較。進行二分法查找時,同樣需要現將集合進行排序后再進行查找,否則查找結果無意義。
