1、system:(系統相關類)
常用方法:
a)?????? : system.arraycopy(制定數組,開始復制的位置,目標數組,開始粘貼的位置,需要復制的長度) 。
將指定源數組中的數組從指定位置復制到目標數組的指定位置。
a)?????? :System.currentTimeMIllis返回當前時間(以毫秒為單位)。
該方法返回值類型為long 所以調用結果用long類型變量接收。
b)?????? :System.exit(int status)終止當前最正在運行的Java虛擬機,參數作狀態碼,按照慣例非0表示異常終止。
2、(數學相關類)
一 . Math類
a)?????? Math:Math類包含執行基本數字運算的方法,如基本指數,對數,平方根和三角函數。
隨機數生成: double random();返回帶正號的 double 值,該值大于等于 0.0 且小于 1.0。返回值是一個偽隨機選擇的數,在該范圍內(近似)均勻分布。需要生成隨機數的范圍0-X,便在隨機數后面*X然后進行強制轉換.
b)?????? BigDecimal:float/double都不能表示精確的小數,此時使用BigDecimal,用于處理經前和精度要求較高的數據。
c)?????? BigInteger:表示大整數,如果兩個long類型的足大指運算,結果long儲存不下,此時使用BigInteger,一般不用。(因為long的數據范圍已經夠大了)
加減乘除方法和bigdecimal相同。
二 . Random類
?
隨機數生成: nextInt(int n) 返回一個偽隨機數,它是取自此隨機數生成器序列的、在 0(包括)和指定值(不包括)之間均勻分布的 int 值。
?
3、字符串相關類
字符串的分類:
不可變的字符串:(String)當對象創建完畢之后,該對象的內容是不可改變的。一旦內容改變就是一個新的對象。
可變的字符串:(StringBuilder/StringBuffer),當對象創建完畢之后,該對象的內容發生改變的時候,對象保持不變。
一、:String類:不可變的字符串。內容改變后相對應的內存地址也改變了。所以就相當于一個新的對象。
常量池:抓們儲存常量的地方,都指的方法區中。
編譯常量池:把字節碼加載進JVM的時候,儲存的是字節碼的相關信息。
運行常量池:儲存常量數據(研究)。
-------------------------------------------------------------------------------
面試題:
1、下列代碼中分別創建了幾個String對象
String? str?? =? “asdf”;?????
最多創建一個String對象,最少不創建String對象
如果在常量池中已經存在“asdf”,那么str直接引用,此時不創建String對象。
否則,現在常量池創建“asdf”內存空間,在引用。
String? str1? =? new? String(“asdf”);
最多創建兩個String對象,至少創建一個string對象。
New關鍵字:絕對會在堆空間創建內存區域,所以至少創建一個對象。
2、:判斷下列代碼創建了幾個String對象,彼此直接是否相等.
?? String str1 = "ABCD";
?? String str2 = "A" +"B"+"C"+"D";? 編譯器優化之后,該代碼等價于 str1.
?? String str3 = "AB"+"CD";
?? String c = "CD";
?? String str4 = "AB" + c;
?? String str5 = "AB" + getXX();? (備注:getXX方法返回"CD");
?? String str6 = new String(“ABCD”)
用==判斷:?? str1 == str2 ? // true
str1 == str3 ??? //true
str1 == str4 ??? //false
str1 == str5 ??? //false
str1 == str6 ??? //false
-----------------------------
?
String對象比較:
?1):單獨使用""引號創建的字符串都是直接量,編譯期就已經確定存儲到常量池中;
?2):使用new String("")創建的對象會存儲到堆內存中,是運行期才創建;
?3):使用只包含直接量的字符串連接符如"aa" + "bb"創建的也是直接量編譯期就能確定,已經確定存儲到常量池中;
?4):使用包含String直接量(無final修飾符)的字符串表達式(如"aa" + s1)創建的對象是運行期才創建的,存儲在堆中;
通過變量/調用方法去連接字符串,都只能在運行時期才能確定環境變量的值和方法的返回值,不存在編譯優化操作。
-----------------------------
比較字符串: ?==:只能比較內存地址,若要比較內容:equals.
?
String類中的常用方法:
?
public class StringDome { private static String getXX() { --------------------------------------------------------------------------------------------------------------------------------- public class StringDome2 { public static void main(String[] args) { } private static void testString() { } |
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
判斷字符串是否包含指定字符串
??????? boolean contains(CharSequence?s)//CharSequence此處代表字符串
??????? int indexOf(String str);返回字符串出現的第一次的索引,字符串里沒有指定的字符串則返回-1.
?
分別用String、StringBuider、StringBuffer拼接50000次字符串,對比各自損耗的時間。
經過測試:
String做字符拼接的時候性能極低,原因是string是不可變的,內次內容改變都會在內存中創建新的對象。
String 耗時1315ms
StringBuider 耗時 1ms
StringBuffer 耗時 3ms
結論:以后拼接字符,統統使用StringBuider / StringBuffer,不要使用string.
?
StringBuider 和 StringBuffer都表示可變的字符串,功能方法都是相同的。
唯一區別:
StringBuffer :StringBuffer中的方法名都使用了synchronized修飾符,表示同步的,在多線程并發的時候可以保證線程安全。(保證線程安全,性能也就降低了)
StringBuider(建議使用):StringBuider中的方法沒有使用synchronized修飾。不安全,但是性能較高。
使用StringBuider無參數構造器,在底層創建了一個長度為16的char數組。
Char [] array = new StringBuider(16);
此時該數組只能儲存16個字符,如果超過了得自動擴容。
自動擴容(創建長度更大的數組,在把之前的數組拷貝到新數組)
用Stringbuider創建一個長度為60的char數組:
char [] arr = new StringBuider(60);
---------------------------
常用方法:
1、append(Object obj):表示增加任意數據類型。
2、insert(int offset,Object obj)將 Object 參數的字符串表示形式插入此字符序列中。
3、StringBuffer delete(int start,int end) 刪除此序列的子字符串中的字符。 子串開始于指定start并延伸到字符索引end - 1 ,或如果沒有這樣的字符存在的序列的結束。 如果start等于end ,則不作任何更改。
?