1. 程式人生 > 實用技巧 >Java-常用類

Java-常用類

一、字串相關的類: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類內部包含inouterr三個成員變數,分別代表標準輸入流(鍵盤輸入),標準輸出流(顯示器)和標準錯誤輸出流(顯示器)。

成員方法

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)