常用类(二)
10.3 可變字符序列:字符串緩沖區
10.3.1 StringBuffer、StringBuilder、String的區別
?
1、一個類似于 String 的字符串緩沖區,但能被修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容,所有對StringBuffer或StringBuilder對象的字符序列的修改不會產生新的StringBuffer或StringBuilder對象,這點和String很大的不同。
?
value沒有final聲明,value可以不斷擴容,count記錄有效字符的個數。
2、StringBuilder:線程安全,效率低;StringBuffer:線程不安全,效率高
10.3.2 StringBuffer和StringBuilder不同的API
1、構造器
StringBuffer或StringBuilder對象的創建必須用new+構造器。
StringBuffer()?? 初始容量為16的字符串緩沖區
StringBuffer(int size)?? 構造指定容量的字符串緩沖區
StringBuffer(String str)? 將內容初始化為指定字符串內容
2、和字符序列改變有關的方法
而且所有這些方法支持方法鏈
StringBuffer append(xx):提供了很多的append()方法,用于進行字符串拼接
StringBuffer delete(int start,int end):刪除指定位置的內容
StringBuffer insert(int offset, xx):在指定位置插入xx
StringBuffer replace(int start, int end, String str):把[start,end)位置替換為str
StringBuffer reverse() :把當前字符序列逆轉
| ??? public static void main(String[] args) { ??????? StringBuffer sf = new StringBuffer(); ??????? sf.append("hello").append("world").append("java"); ??????? System.out.println(sf); ??? } |
?
方法鏈的原理
?
當append和insert時,如果原來value數組長度不夠,可擴容
?
?
?
10.3.3 效率測試
| package com.api.string; ? public class TestStringBuilder { ? ??? public static void main(String[] args) { ??????? testStringBuilder(); ??????? testStringBuffer(); ??????? testString(); ??? } ??? public static void testString(){ ??????? long start = System.currentTimeMillis(); ??????? String s = new String("0"); ??????? for(int i=1;i<=10000;i++){ ??????????? s += i; ??????? } ??????? System.out.println(s); ??????? long end = System.currentTimeMillis(); ??????? System.out.println("String拼接+用時:"+(end-start)); ??????? long memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); ??????? System.out.println("String拼接+memory: " + memory); ??? } ??? public static void testStringBuilder(){ ??????? long start = System.currentTimeMillis(); ??????? StringBuilder s = new StringBuilder("0"); ??????? for(int i=1;i<=10000;i++){ ??????????? s.append(i); ??????? } ??????? System.out.println(s); ??????? long end = System.currentTimeMillis(); ??????? System.out.println("StringBuilder拼接+用時:"+(end-start)); ??????? long memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); ??????? System.out.println("StringBuilder拼接+memory: " + memory); ??? } ??? public static void testStringBuffer(){ ??????? long start = System.currentTimeMillis(); ??????? StringBuffer s = new StringBuffer("0"); ??????? for(int i=1;i<=10000;i++){ ??????????? s.append(i); ??????? } ??????? System.out.println(s); ??????? long end = System.currentTimeMillis(); ??????? System.out.println("StringBuffer拼接+用時:"+(end-start)); ??????? long memory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); ??????? System.out.println("StringBuffer拼接+memory: " + memory); ??? } } |
10.4 System系統類
System 類包含一些有用的類字段和方法。它不能被實例化。
在 System 類提供的設施中,有標準輸入、標準輸出和錯誤輸出流;對外部定義的屬性和環境變量的訪問;加載文件和庫的方法;還有快速復制數組的一部分的實用方法。
10.4.1 標準輸入、標準輸出和錯誤輸出流對象
PrintStream err:“標準”錯誤輸出流。
InputStream in:“標準”輸入流。
PrintStream out:“標準”輸出流。
| import java.util.Scanner; ? class TestSystem{ ???????? public static void main(String[] args){ ?????????????????? Scanner input = new Scanner(System.in); ?????????????????? System.out.print("請輸入成績:"); ?????????????????? int score = input.nextInt(); ?????????????????? ?????????????????? if(score>=0 && score<=100){ ??????????????????????????? System.out.println("成績是:" + score); ?????????????????? }else{ ??????????????????????????? System.err.println("輸入有誤,成績應該在[0,100]"); ?????????????????? } ???????? } } |
10.4.2 常用方法
l? void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :從指定源數組中復制一個數組,復制從指定的位置開始,到目標數組的指定位置結束。
l? long currentTimeMillis() :返回以毫秒為單位的當前時間。?
l? void exit(int status) :終止當前正在運行的 Java 虛擬機。
l? void gc():運行垃圾回收器。?
l? Properties getProperties():確定當前的系統屬性。
l? String getProperty(String key):獲取指定鍵指示的系統屬性。
l? void setErr(PrintStream err) :重新分配“標準”錯誤輸出流。
l? void setIn(InputStream in):重新分配“標準”輸入流。
l? void setOut(PrintStream out):重新分配“標準”輸出流。
l? String setProperty(String key, String value) :設置指定鍵指示的系統屬性。
?
?
?
10.5 JDK1.8之前日期時間類
?
10.5.1 java.lang.System類
?
System類提供的public static long currentTimeMillis()用來返回當前時間與1970年1月1日0時0分0秒GMT之間以毫秒為單位的時間差。此方法適于計算時間差。
10.5.2 java.util.Date
它的對象表示一個特定的瞬間,精確到毫秒。
Java中時間的表示說白了也是數字,是從標準紀元1970年1月1日0時0分0秒GMT到某個時刻的毫秒數,類型是long
理解:一維的時間軸,選擇1970年1月1日0時0分0秒時間為0刻度,1毫秒一刻度
構造方法:
l? Date():????? 源代碼:this(System.currentTimeMillis());
l? Date(long date)
常用方法:
l? getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數。
l? toString():把此 Date 對象轉換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中:
?? dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat), zzz是時間標準。
?
已過時的方法:
l? public Date(int year,int month,int date,int hrs,int min,int sec)
參數:
year - 減 1900 的年份。
month - 0-11 之間的月份。
date - 一月中 1-31 之間的某一天。
hrs - 0-23 之間的小時數。
min - 0-59 之間的分鐘數。
sec - 0-59 之間的秒數。
l? getYear() 從 JDK 1.1 開始,由 Calendar.get(Calendar.YEAR) - 1900 取代。
l? getMonth()從 JDK 1.1 開始,由 Calendar.get(Calendar.MONTH) 取代。返回的值在 0 和 11 之間,值 0 表示 1 月。
l? getDate() JDK 1.1 開始,由 Calendar.get(Calendar.DAY_OF_MONTH) 取代。返回的值在 1 和 31 之間
l? getDay()從 JDK 1.1 開始,由 Calendar.get(Calendar.DAY_OF_WEEK) 取代。 返回值 (0 = Sunday, 1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = Thursday, 5 = Friday, 6 = Saturday) 表示一周中的某一天
l? getHours()從 JDK 1.1 開始,由 Calendar.get(Calendar.HOUR_OF_DAY) 取代。返回值是一個數字(0 至 23)
l? getMinutes()從 JDK 1.1 開始,由 Calendar.get(Calendar.MINUTE) 取代。 返回值在 0 和 59 之間。
l? getSeconds()從 JDK 1.1 開始,由 Calendar.get(Calendar.SECOND) 取代。回的值在 0 和 61 之間。值 60 和 61 只可能發生在考慮了閏秒的 Java 虛擬機上。
10.5.3 java.util.TimeZone和Locale
Locale 對象表示了特定的地理、政治和文化地區。需要 Locale 來執行其任務的操作稱為語言環境敏感的 操作,它使用 Locale 為用戶量身定制信息。例如,顯示一個數值,日期就是語言環境敏感的操作,應該根據用戶的國家、地區或文化的風俗/傳統來格式化該數值。
獲取Locale對象:
?Locale(String language)
?Locale(String language, String country)
?Locale.CHINA、Locale.US等
| ???????? public static void main(String[] args) { ?????????????????? Locale loc = Locale.CHINA; ?????????????????? System.out.println(loc);//zh_CN ?????????????????? System.out.println(Locale.US);//en_US ?????????????????? System.out.println(Locale.JAPAN);//ja_JP ?????????????????? ?????????????????? Locale c = new Locale("zh","CN"); ?????????????????? System.out.println(c); ???????? } |
通常,使用 TimeZone的getDefault 獲取 TimeZone,getDefault 基于程序運行所在的時區創建 TimeZone。例如,對于在日本運行的程序,getDefault 基于日本標準時間創建 TimeZone 對象。
?
也可以用TimeZone的 getTimeZone 及時區 ID 獲取 TimeZone 。例如美國太平洋時區的時區 ID 是 "America/Los_Angeles"。因此,可以使用下面語句獲得美國太平洋時間 TimeZone 對象:
?
?TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
| ???????? public static void main(String[] args) { ?????????????????? TimeZone t = TimeZone.getDefault(); ?????????????????? System.out.println(t); ?????????????????? ?????????????????? TimeZone t1 = TimeZone.getTimeZone("America/New_York"); ?????????????????? System.out.println(t1); ?????????????????? ?????????????????? TimeZone t2 = TimeZone.getTimeZone("Asia/Shanghai"); ?????????????????? System.out.println(t2); ???????? } |
| ?????????????????? String[] all = TimeZone.getAvailableIDs(); ?????????????????? for (String id : all) { ??????????????????????????? System.out.println(id); ?????????????????? } |
轉載于:https://www.cnblogs.com/sunpengblog/p/10321392.html
總結
- 上一篇: 1698 -Access denied
- 下一篇: Hadoop Mapreduce 调优