2015年11月11日 星期三

Java基礎-常用API(上)

為什麼要寫這篇呢?因為吃飽太閒嗎,當然不是=_=,因為人的記憶力是有限的,好啦,其實是我的記憶力是有限的 冏,有些東西真的是每天用,很自然就會記得了,比如if和for,但,有些大概一個星期用到一次,或是一陣子沒用…就很自然的忘記了,不過,有些人記憶力是真的蠻好的就是了,但,我不行,所以整理了一下,我覺得常用的Java API。

不過呢,Java是物件導向的程式語言,何謂物件導向呢…其實,這個問題可以說三天三夜,但,不是這裏的重點,重點是,相同類別的function,很可能會被記到同一個類別上,所以,常常會利用IDE的auto instance功能,來協助查詢可用的api,不過,基本上這樣也就夠了嘛,要用再查嘛,但,其實另一個重點就是速度,天下武功,唯快不破(根本在亂用XD),要當一個產值高的Progamer還是記一下常用的API吧 冏

大概列一下我覺得常用的API類型好了
型別轉換-
在強型別的世界,應該是幾乎每天都在使用吧,但,我也常常一沒寫就忘光光了 冏

日期運算-
沒那麼常用,但我敢保證,如果你有在寫程式,你這輩子一定會用到

正規化-
就我個人的經驗,不常用,有的人可能不會用到,但,我每次用都要重查,也蠻麻煩的=_=

IO處理-
這個嘛,常用到,但通常的情況是,用過一次之後,就掛在那邊了XD



型別轉換

為什麼要用型別轉換呢?怎麼不用弱型別就好了呢?這當然有不同的利幣可以討論,不過,這也不是我的重點XD,我覺得重點呢,就是在商用軟體的世界,主要可以把型別簡單區分成三個區塊,數值,文字和日期,但遇爾還是會用到byte啦,不過又有點不太一樣了,因為使用的場景不同,不過現在就對這三大類,進行記錄就好了

// 字串轉數值
System.out.println(Integer.parseInt("123"));
System.out.println(Integer.valueOf("1").intValue());
parseInt是轉成基本型別,valueOf是基本型別的封裝物件
轉成封裝物件之後,其實也可以很方便的轉成基本型別或是字串
不過,效能上還是基本型別會比較有優勢就是了

// 數值轉字串
System.out.println(String.valueOf(123));
System.out.println(Integer.valueOf(123).toString());
基本上valueOf是多載(overload)的型式存在的,所以可以各個類別都可以使用

// 字串格式化
System.out.println(String.format("%1$010d", 0));
這個使用方式有點像c的printf,基本上,還有蠻多種方式可以做到字串格式化的…,不過目前對這個方式印象比較深格就是了

再來大概寫一下byte的轉換好了…,因為日期的轉換也蠻多的,所以把日期的操作都留到下一小節好了,最近比較又常常用到了,基本上比較常用在加解密,或是傳檔上

// 字串轉byte array
System.out.println("123".getBytes()[0]);
// byte array轉字串(目前還沒找到什麼好辦法就是了?)
new String("123".getBytes())

其實關於字串的轉換,還需要注意到編碼的問題,不過中文主要就UTF-8和Big5這二個類別比較常見,不過,基本上Java會根據你的系統進行轉換,所以用不擔心這個問題就是了,除非你的資料來源是來自檔案、資料庫或是網路,才需要自行處理編碼的問題,可以看一下IDE的提示,如果是在程式中自行輸入的資料,可以不用那麼在意編碼的問題就是了

其實,這些功能真的還蠻常用的…,請牢牢的記住 冏,不過很多開發的環境,可能已經把這些常用的轉換包成工具類別了(Utility Class),不過,不代表就不需要去了解,因為,很多時候,那些類別實在寫的不是很好丫 冏…

日期運算

日期的處理也是蠻常出現的,也常常被包進工具類別就是了,不過還是大概了解一下怎麼做的吧 冏

// 字串轉日期,日期轉字串
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
try {
       Date today = dateFormat.parse("2005/12/25");
       DateFormat chtDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
       System.out.println(chtDateFormat.format(today));     
       
} catch (ParseException e) {
       e.printStackTrace();
}

這段其實是參考這個文章的

不過,聽說DateFormat蠻吃資源的

有幾個解法,一個是single instance的方式,不過,這個方法的缺點是,當我們的format是多變的時候…,就沒辦法使用了,因一個方法是使用別的class,不過,這個解法就交給各位去研究了,畢竟這篇的主要目的是常用API丫,而且,就實務面而言,data fomat,也很難超過十種吧(大誤)

至於java 8聽說有出新的日期物件,有興趣可以研究下面這篇看看,目前還是無緣使用那新的JDK就是了

//日期的運算
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String str = "20110823";
Date dt = sdf.parse(str);
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(dt);
rightNow.add(Calendar.YEAR, -1);// 日期减1年
rightNow.add(Calendar.MONTH, 3);// 日期加3个月
rightNow.add(Calendar.DAY_OF_YEAR, 10);// 日期加10天
Date dt1 = rightNow.getTime();
String reStr = sdf.format(dt1);
System.out.println(reStr);

這個主要參考這篇的程式碼

看到了沒!超麻煩的=_=,所以java一定會自製或是手工作符合自已使用的DateUtil.java ...
主要是使用Calendar來使用運算的動作就是了

另一個蠻常用的就是System.currentTimeMillis(),主要是用來抓系統時間的,比效能用,不過也可能用不到就是了啦=_=

另外,推一下這一篇

可以了解到,這種麻煩的做法,到了java8才有解決的辦法,當然也可找一些非原生的solution,但個人覺得可能會引外其它的問題,比如無法和ORM Framework的日期進行對應的操作…,或是使用其它的class,如joda-time,不過,算了不說了

另外,要比較日期大小的話,就用Date的getTime來取得數值然後,比數字大小就行了
另外,要計算相差的天數…,可以看一下這一篇

基本上,就舊有原生的作法上,根本就沒有好用的API存在,來解決日期運算的問題
java感覺真的蠻不人性化的
工程式應該追求的就是高產值的人生丫 冏
好啦,至少java 8有改善了,但…目前使用java8的地方似乎還不普遍(有時不是你能選擇的),可能只能尋求外部的資源,或是自已造輪子了吧=_=

日期的部分就到這裏了…

之後再寫寫IO和正規化的部分吧=_=


Resourece:
日期轉換相關



沒有留言:

張貼留言