###### tags: `Tibame-java入門班`,`StringBuffer`,`StringBuilder`,`StringTokenizer`,`Calendar`,`GregorianCalendar`,`java.util.Date`,`java.sql.Date` # 20220305-java假日班筆記-CH02:Text-base Applications、取得日期與時間 ●**String類別與StringBuffer類別** --- String類別→immutable(記憶體空間不可變動) StringBuffer類別→mutable、thread-safe(記憶體可變動、速度慢) →串接英雄(字串要串接用這個比較好) ●字串串接-append **((串接英雄))** (方法越多越好,因為overroding,怎麼用都會過) ![](https://i.imgur.com/hAlUNBo.png) String與StringBuffer因記憶體位置不同,不可比較。 ●用StringBuffer的append串接字串 ![](https://i.imgur.com/UviNMRc.png) ●用insert插入字串 第一個數字為索引,由0起算。 ![](https://i.imgur.com/9FtqiEm.png) ●用delete刪除字串 第一個是刪除的開始索引值,第二個數字則是結束的索引值(但是最後的那個位置並不刪除) 如範例的話,刪除的索引為6~9的字串(所以是java的字串被刪除) ![](https://i.imgur.com/kFbLZkz.png) ●用replace取代字串 ![](https://i.imgur.com/kDljQRq.png) String與StringBuffer兩者比較 ``` /*額外額外2: -StringBuffer類別是在原字串所在記憶體位置改變字串內容 -未覆寫(Override) Object類別的 equals() 及 hashCode() 方法*/ StringBuffer sb1 = new StringBuffer("AB"); System.out.println("sb1="+sb1); //AB StringBuffer sb2 = sb1.append("CD"); System.out.println("sb1="+sb1); //ABCD(同記憶體空間) System.out.println("sb2="+sb2); //ABCD System.out.println(sb1==sb2); //true System.out.println(sb2.equals(sb1)); //true ``` ``` String sb1 = new String("AB"); System.out.println("sb1="+sb1); //AB String sb2 = sb1+"CD"; System.out.println("sb1="+sb1); //AB System.out.println("sb2="+sb2); //ABCD System.out.println(sb1==sb2); //false System.out.println(sb2.equals(sb1)); //false ``` ●**StringBuilder類別**(可變、執行緒不安全)(速度快) --- →JDK1.5新類別(為StringBuffer的新類別) 特性除了執行緒變得不安全、速度變快(因為變成沒有控制存取)外,其餘特性相同。 ![](https://i.imgur.com/LxqsuzV.png) ![](https://i.imgur.com/WKpiLyW.png) --- ●小整理: 老類別內有三支由JVM鎖定的API→ 1.StringBuffer 2.Vector 3.Hashtable --- ●**StringTokenizer類別**(標記解析者) --- →將字串分成數個字串(token)<程式碼較複雜時很強大> 此標記有兩個方法: 1、hasMoreTokens(有更多的標記嗎? ) → 會回傳布林值,為TRUE的話,就會往2移動。 ![](https://i.imgur.com/OgjtFK7.png) ![](https://i.imgur.com/KsHQs7t.png) 2、nextToken →第一個位子為要判別的字串內容,第二個位子則是以什麼來判定的符號。 就會自動幫忙拆好印出。 ![](https://i.imgur.com/1N692Ft.png) ![](https://i.imgur.com/Xbajdpc.png) 與String的split的分割做比較。 答案是相同的。 (最好的方法 [ ]+>>任意多個字元 ![](https://i.imgur.com/33KlOk9.png) 用StringTokenizer去除多餘的空格 ![](https://i.imgur.com/fBRJWxF.jpg) ``` import java.util.*; public class TestTokenizer_String{ public static void main(String args[]) { StringTokenizer st = new StringTokenizer("This is a book");//以空格當預設符號,不用指定 while (st.hasMoreTokens()) { System.out.println(st.nextToken()); } StringTokenizer st1 = new StringTokenizer("That-is-a-pen","-");//在" "內的內容做為分割標準,隨便的字元都能自動判斷。 //但是最方便的方法就是用[]+打包任意字元就能分割。 while (st1.hasMoreTokens()) { System.out.println(st1.nextToken()); } } } ``` ![](https://i.imgur.com/qSJZD1l.png) ------ **●取得日期和時間** ----- | 常數名 | 值 | |:--------------------------------------- |:------:| | | | | Calendar.YEAR | 年 | | Calendar.MONTH(陣列) ( +1) | 月 | | Calendar.DATE | 日 | | Calendar.HOUR_OF_DAY | 24時制 | | Calendar.MINUTE | 分 | | Calendar.SECOND | 秒 | | Calendar.DAY_OF_WEEK (-1) | 星期幾 | **①Calendar(父類別)**-單純列印出現在時間(抽象方法,不可new) --- →取得今天的日期與現在時間 (星期天為第一天為基準,所以需要-1) 只能取當下的時間 是抽象類別,不能建立new ![](https://i.imgur.com/20KawfY.png) ``` import java.util.*; class Calendar_Time_Week { static String[] week = {"日","一","二","三","四","五","六"}; //1 2 3 4 5 6 7(天) //0 1 2 3 4 5 6(索引值) public static void main(String args[]) { Calendar cal = Calendar.getInstance();//取當下值 int y = cal.get(Calendar.YEAR); int m = cal.get(Calendar.MONTH) + 1; int d = cal.get(Calendar.DATE); int h = cal.get(Calendar.HOUR_OF_DAY); int min = cal.get(Calendar.MINUTE); int sec = cal.get(Calendar.SECOND); System.out.print("今天是: "); System.out.println(y + "年" + m + "月" + d + "日"); System.out.print("現在是: "); System.out.println(h + "點" + min + "分" + sec + "秒"); int w = cal.get(Calendar.DAY_OF_WEEK)-1; System.out.println("星期" + week[w]); } } ``` **②GregorianCalendar(子類別)** --- →可以指定想要印出什麼時間 ●要指定日期去尋找星期幾 ![](https://i.imgur.com/YfldoGc.png) ![](https://i.imgur.com/AV4GQZd.png) ![](https://i.imgur.com/4aYQ5r0.png) ![](https://i.imgur.com/kPelVB8.png) **③java.util.Date類別** --- 可直接new。 一樣是抓現在的時間。 ★利用java.util.Date的**getTime()** 方法,可得到自1970年1月1日午夜起起算的時間毫秒 (毫秒在手,世界都有) (可以轉換為資料庫需要的時間模式) **java江湖口訣>>要什麼給什麼~** ●程式碼原始型態(無法進資料庫) ![](https://i.imgur.com/LAPXPCe.png) ●取出毫秒 ![](https://i.imgur.com/AlOiR6T.png) ![](https://i.imgur.com/2oJpeBj.png) 可以進入DB ![](https://i.imgur.com/5hOCK5T.jpg) ④java.sql.Date --- 30天候的後面需加L,才不會超過int的範圍 ![](https://i.imgur.com/mroaAES.png) 轉成毫秒、轉成DB可讀取的時間格式、時分秒、與日期跟時分秒的結合 ![](https://i.imgur.com/dY3HiTg.jpg) ![](https://i.imgur.com/Dazk1rE.png) 此程式碼可以互轉(比較囉嗦) >>產出結果,可以跟資料庫交談 ![](https://i.imgur.com/w3yeWhG.png) ![](https://i.imgur.com/N5jUH4C.png) 此程式碼比較精簡,但比較適用於取現在時間 ![](https://i.imgur.com/5Akr0LH.png)