一、字符串相關的類:String
1.String的特性
●String類:代表字符串。Java程序中的所有字符串字面值(如"abc" )都作為此類的實例實現。
●String是一個final類,代表不可變的字符序列。
●字符串是常量,用雙引號引起來表示。它們的值在創建之后不能更改。
●String對象的字符內容是存儲在一個字符數組value[]中的。
2.String的使用
●String聲明為final的,不可被繼承
●String實現了Serializable接口:表示字符事是支持序列化的。
實現了Comparable接口:表示String 可以比較大小
●String內部定義了final char[] value用於存儲字符串數據
●String:代表不可變的字符序列。簡稱:不可變性。
體現:
➢當對字符串重新賦值時,需要重寫指定內存區域賦值,不能使用原有”的value進行賦值
➢當對現有的字符串進行連接操作時,也需要重新指定內存區域賦值,不能使用原有的value進行賦值
➢當調用String的replace()方法 修改指定字符或字符串時,也需要重新指定內存區域
●通過字面量的方式(區別於new)給一個字符串賦值,此時的字符串值聲明在字符串常量池中。
●字符串常量池中是不會存儲相同內容的字符串的。
字符串對象的存儲位置
面試題: String s = new String("abc");方式創建對象,在內存中創建了幾個對象?
兩個:一個是堆空間中new結構,另一個是char[]對應的常量池中的數據: "abc"
結論:
●常量與常量的拼接結果在常量池。且常量池中不會存在相同內容的常量。
●只要其中有一個是變量,結果就在堆中
●如果拼接的結果調用intern()方法,返回值就在常量池中
3.String常用方法
●int length():返回字符串的長度: return value.length
●char charAt(int index):返回某索引處的字符return value[index]
●boolean isEmpty():判斷是否是空字符串: return value.length == 0
●String toLowerCase():使用默認語言環境,將String中的所有字符轉換為小寫
●String toUpperCase():使用默認語言環境,將String中的所有字符轉換為大寫
●String trim():返回字符串的副本,忽略前導空白和尾部空白
●boolean equals(Object obj): 比較字符串的內容是否相同
●boolean equalsIgnoreCase(String anotherString):與equals方法類似, 忽略大小寫
●String concat(String str):將指定字符串連接到此字符串的結尾。等價於用“+”
●int compare To(String anotherString):比較兩個字符串的大小
●String substring(int beginlndex):返回一個新的字符串,它是此字符串的從beginIndex開始截取到最后的一個子字符串。
●String substring(int beginIndex, int endIndex):返回一個新字符串,它是此字符串從beginIndex開始截取到endIndex(不包含)的一個子字符串。
●boolean endsWith(String suffix):測試此字符串是否以指定的后綴結束
●boolean startsWith(String prefix):測試此字符串是否以指定的前綴開始
●boolean startsWith(String prefix, int toffset):測試此字符串從指定索引開始的子字符串是否以指定前綴開始
●boolean contains(CharSequence s):當且僅當此字符串包含指定的char值序列時,返回true
●int indexOf(String str):返回指定子字符串在此字符串中第一次出現 處的索引
●int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第次出現處的索引,從指定的索引開始
●int lastIndexOf(Stringstr):返回指定子字符串在此字符串中最右邊出現處的索引
●int lastIndexOf(String str, int fromIndex): 返回指定子字符串在此字符串中最后一次出現處的索引,從指定的索引開始反向搜索。注: indexOf和lastIndexOf方法 如果未找到都是返回-1
●String replace(char oldChar, char newChar):返回一個新的字符串,它是通過用newChar替換此字符串中出現的所有oldChar得到的。
●String replace(CharSequence target, CharSequence replacement):使用指定的字面值替換序列替換此字符串所有匹配字面值目標序列的子字符串。
●String replaceAll(String regex, String replacement):使用給定的replacement替換此字符串所有匹配給定的正則表達式的子字符串。
●String replaceFirst(String regex, String replacement): 使用給定的replacement替換此字符串匹配給定的正則表達式的第一個子字符串。
●boolean matches(String regex): 告知此字符串是否匹配給定的正則表達式。
●String[] split(String regex):根據給定正則表達式的匹配拆分此字符串。
●String[] split(String regex, int limit): 根據匹配給定的正則表達式來拆分此字符串,最多不超過limit個,如果超過了,剩下的全部都放到最后一個元素中。
4.String 與字符數組之間的轉換
●字符數組→字符串
➢String類的構造器: String(char[]) 和String(char[],int offset, intlength)分別用字符數組中的全部字符和部分字符創建字符串對象。
●字符串→字符數組
➢public char[] toCharArray():將字符串中的全部字符存放在一個字符數組中的方法。
➢public void getChars(int srcBegin, int srcEnd, char[] dst,int dstBegin):提供了將指定索引范圍內的字符串存放到數組中的方法。
5.String 與字節數組之間的轉換
●字節數組→字符串
➢String(byte[]):通過使用平台的默認字符集解碼指定的byte數組,構造一個新的String。
➢String(byte[], int offset, int length) :用指定的字節數組的一部分,即從數組起始位置offset開始取length個字節構造一個字符串對象。
●字符串→字節數組
➢public byte[] getBytes() :使用平台的默認字符集將此String編碼為byte序列,並將結果存儲到一個新的byte數組中。
➢public byte[] getBytes(String charsetName) :使用指定的字符集將此String編碼到byte序列,並將結果存儲到新的byte數組。
二、StringBuffer 與 StringBuilder 的使用
String、StringBuffer、StringBuilder三者區別:
String:不可變的字符序列。底層使用char[]存儲。
StringBuffer:可變的字符序列。底層使用char[]存儲。線程安全的,效率低。
StringBuilder:可變的字符序列。底層使用char[]存儲。線程不安全,效率高。
StringBuffer 與 StringBuilder 的擴容問題:
如果要添加的數據底層數組盛不下了,那就需要擴容底層的數組。默認情況下,擴容為原來容量的2倍+ 2,同時將原有數組中的元素復制到新的數組中。
指導意義:開發中建議大家使用: StringBuffer(int capacity) 或StringBuilder(int capacity)
StringBuffer類的常用方法
●StringBuffer append(xx):提供了很多的append()方法,用於進行字符串拼接
●StringBuffer delete(int start,int end):刪除指定位置的內容
●StringBuffer replace(int start, int end, String str):把[start,end)位 置替換為str
●StringBuffer insert(int offset, XXX):在指定位置插入xXx
●StringBuffer reverse():把當前字符序列逆轉
➢當append和insert時, 如果原來value數組長度不夠,可擴容。
➢如上這些方法支持方法鏈操作。
➢方法鏈的原理:
●public int indexOf(String str)
●public String substring(int start,int end)
●public int length()
●public char charAt(int n )
●public void setCharAt(int n ,char ch)
三、日期時間API
1. java.lang.System類
System類提供的public static long currentTimeMillis()用來返回當前時間與1970年1月1日0時0分0秒之間以毫秒為單位的時間差。
➢此方法適於計算時間差。
●計算世界時間的主要標准有:
➢UTC(Coordinated Universal Time)
➢GMT(Greenwich Mean Time)
➢CST(Central Standard Time)
2. java.util.Date類
表示特定的瞬間,精確到毫秒
●構造器:
➢Date(): 使用無參構造器創建的對象可以獲取本地當前時間。
➢Date(long date)
●常用方法
➢getTime():返回自 1970年1月1日00:00:00 GMT以來此Date對象表示的毫秒數。
➢toString():把此 Date對象轉換為以下形式的String: dow mon ddhh:mm:ss zzz yyy其中: dow 是一周中的某一天(Sun, Mon, Tue,Wed, Thu, Fri, Sat),zzz 是時間標准。
➢其它很多方法都過時了。
java.sql.Date
將java.util.Date對象轉換為java.sql.Date對象
情況一:
Date date = new java.sql.Date(54156465456131L);
java.sql.Date date1 = (java.sql.Date) date;
情況二:
Date date2 = new Date();
java.sql.Date date3 = new java.sql.Date(date2.getTime());
3.java.text.SimpleDateFormat類
●Date類的API不易於國際化,大部分被廢棄了,java.text.SimpleDateFormat類是一個不與語言環境有關的方式來格式化和解析日期的具體類。
●它允許進行格式化:日期→文本、解析:文本→日期
●格式化:
➢SimpleDateFormat() :默認的模式和語言環境創建對象
➢public SimpleDateFormat(String pattern):該構造方法可 以用參數pattern指定的格式創建一個對象,該對象調用:
➢public String format(Date date):方法格式化時間對象date
●解析:
➢public Date parse(String source):從給定字符串的開始解析文本,以生成一個日期。
4. java.util.Calendar(日歷)類
●Calendar是一個抽象基類,主用用於完成日期字段之間相互操作的功能。
●獲取Calendar實例的方法
➢使用Calendar.getInstance()方法
➢調用它的子類GregorianCalendar的構造器。
●一個Calendar的實例是系統時間的抽象表示,通過get(int field)方法來取得想要的時間信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、MINUTE、SECOND
➢public void set(int field,int value)
➢public void add(int field,int amount)
➢public final Date getTime()
➢public final void setTime(Date date)
●注意:
➢獲取月份時: 一月是0, 二月是1,以此類推,12月是11
➢獲取星期時:周日是1,周二是2,。。。。周六是7
5.新時間日期API
java.time 包含值對象的基礎包
java.time.chrono 提供對不同的日歷系統的訪問
java.time.format 格式化和解析時間和日期
java.time.temporal 包括底層框架和擴展特性
java.time.zone 包含時區支持的類
LocalDate、LocalTime、LocalDateTime類
●LocalDate、LocalTime、LocalDateTime類是其中較重要的幾個類,它們的實例是不可變的對象,分別表示使用IS0-8601日歷系統的日期、時間、日期和時間。它們提供了簡單的本地日期或時間,並不包含當前的時間信息,也不包含與時區相關的信息。
➢LocalDate代表IOS格式(yyyy-MM-dd) 的日期,可以存儲生日、紀念日等日期。
➢LocalTime表示一個時間, 而不是日期。
➢LocalDateTime是用來表示日期和時間的,這是一個最常用的類之一。
瞬時:Instant
●Instant:時間線上的一個瞬時點。這可能被用來記錄應用程序中的事件時間戳。
●在處理時間和日期的時候,我們通常會想到年,月,日,時,分,秒。然而,這只是時間的一一個模型,是面向人類的。第二種通用模型是面向機器的,或者說是連續的。在此模型中,時間線中的一一個點表示為一個很大的數,這有利於計算機處理。在UNIX中,這個數從1970年開始,以秒為的單位;同樣的,在Java中,也是從1970年開始,但以毫秒為單位。
●java.time包通過值類型Instant提供機器視圖,不提供處理人類意義上的時間單位。Instant表示時間線上的一點,而不需要任何上下文信息,例如,時區。概念上講,它只是簡單的表示自1970年1月1日0時0分0秒(UTC)開始的秒數。因為java .time包是基於納秒計算的,所以Instant的精度可以達到納秒級。
●1秒= 1000毫秒=106微秒=109納秒
格式化與解析日期或時間
java.time.format.Date TimeFormatter類:該類提供了三種格式化方法:
●預定義的標准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
●本地化相關的格式。如: ofLocalizedDate Time(FormatStyle.LONG)
●自定義的格式。如: ofPattern("yyyy-MM-dd hh:mm:ss E")
// 重點:自定義的格式。如: ofPattern("yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str = formatter.format(LocalDateTime.now());
System.out.println(str);//2019-02-18 03:52:09
//解析
TemporalAccessor accessor = formatter.parse("2019-02-18 03:52:09");
System.out.println(accessor);
其他API
●Zoneld: 該類中包含了所有的時區信息,一個時區的ID,如Europe/Paris
●ZonedDateTime: 一個在IS0-8601日歷系統時區的日期時間,如2007-12-03T10:15:30+01:00 Europe/Paris。
➢其中每個時區都對應着ID,地區ID都為“{區域}/{城市}”的格式,例如:Asia/Shanghai等
●Clock:使用時區提供對當前即時、日期和時間的訪問的時鍾。
●持續時間: Duration, 用於計算兩個“時間”間隔
●日期間隔: Period, 用於計算兩個“日期”間隔
●TemporalAdjuster :時間校正器。有時我們可能需要獲取例如:將日期調整到“下一個工作日”等操作。
●TemporalAdjusters:該類通過靜態方法(firstDayOfXxx()/lastDayOfXxx()/nextXx())提供了大量的常用TemporalAdjuster的實現。
與傳統日期處理的轉換
四、Java比較器
●在Java中經常會涉及到對象數組的排序問題,那么就涉及到對象之間的比較問題。
●Java實現對象排序的方式有兩種:
自然排序: java.lang.Comparable
●Comparable接口強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序。
●實現Comparable的類必須實現compareTo(Object obj)方法,兩個對象即通過compare To(Object obj)方法的返回值來比較大小。如果當前對象this大於形參對象obj,則返回正整數,如果當前對象this小於形參對象obj,則返回負整數,如果當前對象this等於形參對象obj,則返回零。
●實現Comparable接口的對象列表(和數組)可以通過Collections.sort或Arrays.sort進行自動排序。實現此接口的對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。
●對於類C的每一個e1和e2來說,當且僅當e1.compareTo(e2)==0與e1.equals(e2)具有相同的boolean值時,類C的自然排序才叫做與equals一致。建議(雖然不是必需的)最好使自然排序與equals一致。
定制排序: java.util.Comparator
●當元素的類型沒有實現java.lang.Comparable接口而又不方便修改代碼,或者實現了java.lang.Comparable接口的排序規則不適合當前的操作,那么可以考慮使用Comparator的對象來排序,強行對多個對象進行整體排序的比較。
●重寫compare(Object o1 ,Object o2)方法,比較o1和o2的大小:如果方法返回正整數,則表示01大於o2;如果返回0,表示相等;返回負整數,表示o1小於o2。
●可以將Comparator傳遞給sort方法(如Collections.sort或Arrays.sort) ,從而允許在排序順序上實現精確控制。
●還可以使用Comparator來控制某些數據結構(如有序set或有序映射)的順序,或者為那些沒有自然順序的對象collection提供排序。
Comparable接口與Comparator的使用的對比:
Comparable接口的方式一旦指定,保證Comparable接口實現類的對象在任何位置都可以比較大小
Comparator接口屬於臨時性的比較。
五、System類
●System類代表系統,系統級的很多屬性和控制方法都放置在該類的內部。該類位於java.lang包。
●由於該類的構造器是private的, 所以無法創建該類的對象,也就是無法實例化該類。其內部的成員變量和成員方法都是static的,所以也可以很方便的進行調用。
●成員變量
➢System類內部包含in、out和err三個成員變量,分別代表標准輸入流(鍵盤輸入),標准輸出流(顯示器)和標准錯誤輸出流(顯示器)。
●成員方法
➢native long currentTimeMillis():該方法的作用是返回當前的計算機時間,時間的表達格式為當前計算機時間和GMT時間(格林威治時間)1970年1月1號0時0分0秒所差的毫秒數。
➢void exit(int status):該方法的作用是退出程序。其中status的值為0代表正常退出,非零代表異常退出。使用該方法可以在圖形界面編程中實現程序的退出功能等。
➢void gc():該方法的作用是請求系統進行垃圾回收。至於系統是否立刻回收,則取決於系統中垃圾回收算法的實現以及系統執行時的情況。
➢String getProperty(String key):該方法的作用是獲得系統中屬性名為key的屬性對應的值。
系統中常見的屬性名以及屬性的作用如下表所示:
六、Math類
java.lang.Math提供了一系列靜態方法用於科學計算。其方法的參數和返回值類型一般為double型。
abs 絕對值
acos, asin,atan,cos,sin,tan 三角函數
sqrt平方根
pow(double a,doble b) a的b次冪
log 自然對數
exp e為底指數
max(double a,double b)
min(double a,double b)
random() 返回0.0到1.0的隨機數
long round(double a) double型數據a轉換為long型(四舍五入)
toDegrees(double angrad) 弧度→角度
toRadians(double angdeg) 角度→弧度
七、BigInteger 與 BigDecimal
1.BigInteger類
●Integer類作為int的包裝類,能存儲的最大整型值為231-1,Long類也是有限的,最大為263-1。如果要表示再大的整數,不管是基本數據類型還是他們的包裝類都無能為力,更不用說進行運算了。
●java.math包的BigInteger可以表示不可變的任意精度的整數。BigInteger提供所有Java的基本整數操作符的對應物,並提供java.lang.Math的所有相關方法。另外,BigInteger 還提供以下運算:模算術、GCD計算、質數測試、素數生成、位操作以及一些其他操作。
●構造器
➢BigInteger(String val):根據字符串構建BigInteger對象
2.BigDecimal類
●一般的Float類和Double類可以用來做科學計算或工程計算,但在商業計算中,要求數字精度比較高,故用到java.math.BigDecimal類。
●BigDecimal類 支持不可變的、任意精度的有符號十進制定點數。
●構造器
➢public BigDecimal(double val)
➢public BigDecimal(String val)
●常用方法
➢public BigDecimal add(BigDecimal augend)
➢public BigDecimal subtract(BigDecimal subtrahend)
➢public BigDecimal multiply(BigDecimal multiplicand)
➢public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)