Java程序設(shè)計(jì)基礎(chǔ)教程第4章--字符串_第1頁
Java程序設(shè)計(jì)基礎(chǔ)教程第4章--字符串_第2頁
Java程序設(shè)計(jì)基礎(chǔ)教程第4章--字符串_第3頁
Java程序設(shè)計(jì)基礎(chǔ)教程第4章--字符串_第4頁
Java程序設(shè)計(jì)基礎(chǔ)教程第4章--字符串_第5頁
已閱讀5頁,還剩78頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、新一代信息技術(shù)“十三五”系列規(guī)劃教材 Java 程序設(shè)計(jì)基礎(chǔ)教程(慕課版)劉剛 劉偉 編著第4章 字符串 如果將編程比作建樓房,那么字符串就相當(dāng)于一塊磚,沒有了基本類型,樓還是可以蓋起來,只是會(huì)稍微費(fèi)力些。但是如果沒有了字符串,這棟樓或許就真的無法建造了。 字符串是重要的類型,在目前許多開發(fā)語言中,它的身影隨處可見。目前流行的跨語言、跨平臺(tái)的開發(fā)中,字符串扮演了重要的角色,就其重要性而言,再怎么稱贊也不為過。4.1 String 類及其常用 API 字符串由一連串的字符組成,在 Java 中使用雙引號(hào)包裹表示,它可以是一個(gè)字符,也可以是一個(gè)字符序列或者由多個(gè)字符序列組成。Java 核心的類庫中

2、定義了 String 類用于字符串的常用操作,同時(shí)也定義了 StringBuffer 和 StringBuilder 類用于字符串的復(fù)雜操作。 想要使用字符串,首先需要對(duì)其進(jìn)行初始化,字符串的初始化可以使用字面量(字符串常量)直接定義,或者使用構(gòu)造函數(shù)進(jìn)行初始化。1字面量初始化 String str = adc; 字面量是指一個(gè)固定的值,此處“abc”就是字面量。因?yàn)樽址A砍卮嬖诘脑?,此處可以通過簡(jiǎn)化初始化的方式,直接將字面量賦值給一個(gè)字符串對(duì)象。2使用構(gòu)造函數(shù)初始化字符串 String str_1 = new String(); / 無參數(shù)構(gòu)造方法 String str_2 = new

3、 String(adc); / 使用字符串作為參數(shù)的構(gòu)造方法 String str_3 = new String(new char3); / 使用字符數(shù)組作為參數(shù)的構(gòu)造方法 Java 中 String 類中定義了這 3 種基本的初始化構(gòu)造函數(shù),從第 3 種使用一個(gè)字符數(shù)組初始化的構(gòu)造函數(shù)中不難發(fā)現(xiàn),其實(shí)字符串就是一組字符。字符串初始化的實(shí)現(xiàn)如案例 4-1 所示。案例 4-1 字符串的初始化 運(yùn)行結(jié)果如圖 4-1 所示。圖 4-1 運(yùn)行結(jié)果 由運(yùn)行結(jié)果可知,字符串的無參數(shù)構(gòu)造方法是將一個(gè)空字符串賦值給了字符串對(duì)象,而空字符串并不等于null,在開發(fā)的過程中千萬不要將這兩者混淆了。4.1.1 字符

4、串常量池 常量是指在程序運(yùn)行過程中不會(huì)改變的量,一般從字面形式就可以進(jìn)行判斷,也被稱為字面量。如果將池的概念簡(jiǎn)單地理解為池塘,字符串常量池則是擁有很多字符串常量的池塘,包含著諸如“a”“BGK”“123”等字符串常量。 Java虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令來執(zhí)行,這種執(zhí)行方式讓它有了極大的自由來提升性能,字符串常量池就是用來減少字符串對(duì)象創(chuàng)建分配過程中對(duì)時(shí)間和空間的消耗。字符串常量池是在 Java 虛擬機(jī)中單獨(dú)開辟的一塊特殊內(nèi)存,這塊內(nèi)存用于存放程序在運(yùn)行中使用到的字符串常量。每當(dāng)程序需要?jiǎng)?chuàng)建字符串常量的時(shí)候,Java 虛擬機(jī)會(huì)先從字符串常量池中去找,如果找到了,則

5、會(huì)返回池中的實(shí)例引用,如果找不到則會(huì)實(shí)例化一個(gè)字符串并將其放入常量池中。 字符串常量池這個(gè)概念太過于抽象,結(jié)合案例 4-2 會(huì)更便于我們理解。案例 4-2 字符串不同創(chuàng)建方式耗時(shí)比較 運(yùn)行結(jié)果如圖 4-2 所示。圖 4-2 運(yùn)行結(jié)果 從運(yùn)行結(jié)果可以看出,創(chuàng)建一個(gè)空的字符串和只聲明一個(gè)字符串消耗的時(shí)間幾乎一樣,而使用常量池的方式幾乎不需要耗費(fèi)創(chuàng)建的時(shí)間,由此可見字符串常量池的存在意義。4.1.2 字符串常用 API 字符串操作是計(jì)算機(jī)程序設(shè)計(jì)中最常見的行為,字符串對(duì)應(yīng)的操作方法也是很豐富的,常用的方法如表 4-1所示。表 4-1 String 類的常用方法續(xù)表 String 類的常用方法很多,但

6、可以總體歸為 4 類:字符串查詢操作、字符串修改操作、字符串分割操作以及字符串比較操作。 在學(xué)習(xí)這些功能性的方法之前,先通過案例 4-3 了解字符串的通用功能性方法,例如長(zhǎng)度和是否為空。案例 4-3 字符串非空判斷與長(zhǎng)度返回 運(yùn)行結(jié)果如圖 4-3 所示。圖 4-3 運(yùn)行結(jié)果 在案例中不難發(fā)現(xiàn),isEmpty 對(duì)于為 null 的字符串是沒有返回的,length 亦是如此,isEmpty 僅當(dāng) length為 0 時(shí)返回 true,否則返回 false。而 length 則是對(duì)字符個(gè)數(shù)的統(tǒng)計(jì),空格和標(biāo)點(diǎn)也被當(dāng)作一個(gè)字符,且索引從 0 開始計(jì)算。1字符串查詢操作 在互聯(lián)網(wǎng)快速發(fā)展的今天,網(wǎng)購(gòu)已經(jīng)成

7、為人們生活中不可或缺的一部分。在將商品準(zhǔn)確送達(dá)客戶的過程中,詳細(xì)地址起了重要的作用??爝f員通過街道小區(qū)名稱可以到達(dá)住戶所在的大致位置,然后根據(jù)建筑的標(biāo)號(hào)和門牌號(hào)快速定位并將商品送達(dá)。在字符串操作中,同樣可以根據(jù)地址(字符所在的索引)查找字符,同時(shí)還能查找特定字符對(duì)應(yīng)的地址。 字符串的查詢操作主要有按索引位置查詢和按值查詢兩種,前者是通過字符的索引位置獲取對(duì)應(yīng)位置的值,后者是通過值來獲取其所對(duì)應(yīng)的位置索引。查詢的順序可以是從前向后,也可以是從后向前,還可以指定開始查詢的索引位置。字符串查詢操作如案例 4-4 所示。案例 4-4 字符串的查詢操作 運(yùn)行結(jié)果如圖 4-4 所示。圖 4-4 運(yùn)行結(jié)果

8、此案例僅僅是一些簡(jiǎn)單方法的使用,在實(shí)際應(yīng)用中,多個(gè)方法可以嵌套使用,用于達(dá)成實(shí)際的目的。例如案例 4-4 中,有一個(gè)從 12 位置開始查詢第一個(gè) Java 所在位置的操作,就可以多個(gè)查詢方法一起使用。 首先觀察字符串“Hello Java, Hello Java String”,想要反向查詢?cè)谧址谐霈F(xiàn)的第一個(gè) Java,只要定位在最后一個(gè)“Hello”之前就可以。同理,因?yàn)椤埃币苍诘谝粋€(gè) Java 之前,利用“,”所在的位置來查詢也能達(dá)到同樣的目的,代碼如下。str.lastIndexOf(Java, str.lastIndexOf(H) str.lastIndexOf(Java, st

9、r.indexOf(,)2字符串修改操作 字符串的修改操作在 String 類中只有一些簡(jiǎn)單的截取、分割和連接,較為復(fù)雜的字符串操作方法在 StringBuffer和 StringBuilder 中,一般在不需要考慮性能的情況下,String 類提供的方法已經(jīng)足夠,如案例 4-5 所示。案例 4-5 字符串的修改操作 運(yùn)行結(jié)果如圖 4-5 所示。圖 4-5 運(yùn)行結(jié)果 字符串的替換操作有 replace、replaceAll 和repalceFirst。replace 類似 repalceAll,唯一的區(qū)別是 replaceAll支持正則表達(dá)式的替換方式,但是 repalce 只支持字符或者字符

10、串替換,這兩個(gè)方法都是全局替換的。如果只想替換其中一個(gè),repalceFirst 是個(gè)不錯(cuò)的選擇,在實(shí)際開發(fā)過程中,結(jié)合其他幾種字符串操作方法可以達(dá)到復(fù)雜的處理邏輯。 在字符串中,兩個(gè)字符串相加,例如:String str = Hello; System.out.println(str + David!); System.out.println(str.concat( David!); 運(yùn)行結(jié)果如圖 4-6 所示。圖 4-6 運(yùn)行結(jié)果 從運(yùn)行結(jié)果可以看出,“+”可以實(shí)現(xiàn)與 concat 相同的功能,這是字符“+”重載的原因,可便于簡(jiǎn)單的字符串的拼接操作。如果只是少量使用的簡(jiǎn)單字符串拼接操作,直

11、接使用“+”來實(shí)現(xiàn)更易于閱讀與維護(hù)。3字符串分割操作 之前提到,字符串其實(shí)就是一組字符的集合,那么,字符串理應(yīng)可以分割成一個(gè)個(gè)字符序列或是一組組字符序列。事實(shí)也正是如此,字符串操作類 String 提供了這些功能,如案例 4-6 所示。案例 4-6 字符串的分割操作 運(yùn)行結(jié)果如圖 4-7 所示。圖 4-7 運(yùn)行結(jié)果 此案例中結(jié)合了查詢操作與修改操作,將獲取的子串中的所有 e 替換成了下劃線,在子串替換時(shí)直接調(diào)用了replace()方法,這是因?yàn)檫@些方法在調(diào)用后返回的也是一個(gè)字符串對(duì)象,因此這個(gè)對(duì)象仍可以繼續(xù)調(diào)用字符串的操作方法。 在獲取子串時(shí),e 后面是一個(gè)空格,結(jié)合其父字符串,可以發(fā)現(xiàn)字符串

12、的截取是含頭不含尾的截取方式,例如:String str = Hello; str.substring(0, 1); / 返回H,不返回He 這是字符串比較特殊的一點(diǎn),在截取字符串的時(shí)候用 indexOf 需要格外小心,這個(gè)索引位置在開始截取位置和結(jié)束截取位置時(shí)需要區(qū)別對(duì)待。4字符串比較操作 字符串的比較是字符串中最常見的操作,例如之前網(wǎng)絡(luò)上很火的“4396”在某些公司的一些應(yīng)用中被限制使用了,這就涉及字符串的比較和替換操作。案例 4-7 字符串的比較操作 運(yùn)行結(jié)果如圖 4-8 所示。圖 4-8 運(yùn)行結(jié)果 比較字符串的值使用 equals,是否含有該字符串的比較使用 contains。值得一提

13、的是,compareTo 方法在比較長(zhǎng)度相同的字符串的時(shí)候,會(huì)返回第一個(gè)不相同的字符的字典值的差值,該差值可能為正也可能為負(fù);如果兩個(gè)字符串的長(zhǎng)度不相同,那么該方法會(huì)返回兩個(gè)字符串的長(zhǎng)度差。另外,equals 和 compareTo 都包含不區(qū)分大小寫的比較方法,equalsIgnoreCase 和 compareToIgnoreCase 也是需要注意的。 在 Java 中字符是嚴(yán)格區(qū)分大小寫的,我們從“字符串 SUN 和字符串 sun 是否相等:false”和“字符串 SUN 和字符串 sun 是否忽略大小寫相等:true”的輸出中就能得出這個(gè)結(jié)論。所以在實(shí)際開發(fā)中,如果不需要考慮大小寫的情

14、況,可以使用 IgnoreCase 結(jié)尾的方法,或者全部轉(zhuǎn)換成大寫或小寫之后再進(jìn)行比較。4.1.3 拓展:不變的字符串 String 是 Java 中最常用的類之一,同時(shí) String 類也是 final 關(guān)鍵字限定的類。在 Java 中,字符使用 unicode 編碼,每個(gè)字符占兩位,漢字也只占用兩位,但是屬于一個(gè)字符。1關(guān)鍵字:final final 在 Java 中是一個(gè)保留的關(guān)鍵字,可以聲明成員變量、方法、類以及本地變量。一旦你將引用聲明作 final,你將不能改變這個(gè)引用了,編譯器會(huì)檢查代碼,如果你試圖將變量再次初始化的話,編譯器會(huì)報(bào)編譯錯(cuò)誤。(1)限定變量:凡是對(duì)成員變量或者本地變

15、量(在方法中的或者代碼塊中的變量稱為本地變量)聲明為 final的都叫作 final 變量。final 變量經(jīng)常和 static 關(guān)鍵字一起使用,作為常量,例如:public static final String ZERO = “0”;(2)限定方法:final 也可以聲明方法。方法前面加上 final 關(guān)鍵字,代表這個(gè)方法不可以被子類的方法重寫。如果你認(rèn)為一個(gè)方法的功能已經(jīng)足夠完整了,子類中不需要改變的話,你可以聲明此方法為 final。final 方法比非final 方法要快,因?yàn)樵诰幾g的時(shí)候已經(jīng)靜態(tài)綁定了,不需要在運(yùn)行時(shí)再動(dòng)態(tài)綁定,例如:public final String getN

16、ame() return “Name”; (3)限定類:使用 final 來修飾的類叫作 final 類。final 類的功能通常是完整的,它們不能被繼承。Java 中有許多類是 final 的,譬如 String、Interger 以及其他包裝類。例如:public final class GlassCup / 此處省略 final 類型的優(yōu)點(diǎn)如下。提高性能,JVM 和 JAVA 應(yīng)用均會(huì)緩存 final 限定的變量。final 變量在多線程環(huán)境下無須額外開銷即可共享。會(huì)對(duì) final 類型的變量、方法和類進(jìn)行優(yōu)化。2字符串不可變性 String str = “Hello”; System.

17、out.println(str.substring(0, 1); System.out.println(str); 以上的代碼會(huì)輸出什么呢?str.replace(“H”, “h”); System.out.println(str); 這次輸出是什么呢? 輸出結(jié)果如圖 4-9 所示。圖 4-9 運(yùn)行結(jié)果 控制臺(tái)仍然輸出“Hello”是什么原因呢?原來,字符串的方法在返回時(shí)返回的是另外一個(gè)字符串,而其本身并沒有改變,所以無論如何修改,只要不對(duì)對(duì)象重新賦值,那么該對(duì)象就不會(huì)改變。也正是這一點(diǎn),使得字符串在使用的時(shí)候無須額外的開銷就能實(shí)現(xiàn)共享。4.2 StringBuffer 類 字符串類 Stri

18、ng 是 final 限定的類型,在多線程編程的時(shí)候因?yàn)槠洳蛔冃缘奶攸c(diǎn),使得其在多線程中共享時(shí)不會(huì)有額外的開銷,這極大地提升了性能,同時(shí)也帶來了問題。不變的對(duì)象有時(shí)候會(huì)極大地提升程序的性能,但也可能會(huì)耗盡系統(tǒng)資源。如下面的代碼:String str = abc + bcs; 這段代碼看似簡(jiǎn)單,但實(shí)際上程序創(chuàng)建了 3 個(gè)字符串對(duì)象,分別是“abc”“bcs”和“abcbcs”。如果這樣的拼接數(shù)量不斷增加,會(huì)使程序系統(tǒng)產(chǎn)生極大的性能消耗,這是需要極力避免的情況。Java 使用了 StringBuffer 和StringBuider 兩個(gè)類來處理這個(gè)問題。4.2.1 StringBuffer 的應(yīng)用

19、 StringBuffer 在字符串的操作上克服了 String 拼接會(huì)產(chǎn)生多個(gè)對(duì)象的問題。它可以以一個(gè)字符串作為參數(shù)進(jìn)行初始化。其常用初始化方式有以下 3 種。StringBuffer strBuffer = new StringBuffer(); / 無參構(gòu)造函數(shù)初始化 StringBuffer stringBuffer = new StringBuffer(123); / 使用字符串對(duì)象初始化 StringBuffer stBuffer = new StringBuffer(strBuffer); / 使用另一個(gè)StringBuffer對(duì)象初始化1字符串拼接插入 StringBuffer

20、 主要使用 append()方法進(jìn)行字符串的拼接操作,同時(shí),也可以使用 insert()方法有針對(duì)性地進(jìn)行插入。在操作完成之后,可以使用 toString()方法返回字符串對(duì)象。案例 4-8 StringBuffer 的字符串拼接插入 運(yùn)行結(jié)果如圖 4-11 所示。圖 4-11 運(yùn)行結(jié)果 從運(yùn)行結(jié)果可知,StringBuffer 的append()方法可以追加任何類型的值,并將之轉(zhuǎn)換成字符串添加到StringBuffer對(duì)象的末尾。StringBuffer 將 boolean 類型的變量的值當(dāng)成是字面量追加到末尾,而其他類型則直接當(dāng)成一個(gè)字符進(jìn)行追加。 StringBuffer 還有 inse

21、rt 方法可以在指定位置插入傳入的值,insert 也會(huì)將 boolean 類型的變量以字面量值插入到指定的索引位置,該索引位置的值依次向后移動(dòng)。Insert 還可以接受一個(gè)字符序列作為參數(shù),從指定的字符序列索引位置取出指定長(zhǎng)度的字符序列,插入到 StringBuffer 對(duì)象的指定索引位置,該索引位置及之后的字符依次向后移動(dòng)。 在案例中,打印 StringBuffer 對(duì)象的時(shí)候并沒有使用 toString()方法,這是因?yàn)橄到y(tǒng)的輸入輸出方法會(huì)把傳入的參數(shù)轉(zhuǎn)換成字符串后輸出,這相當(dāng)于對(duì)所有的打印目標(biāo)都添加了一個(gè)toString()方法,因此,在此處可以省去toString()方法。2字符串修

22、改 相較于字符串類,StringBuffer 添加了一些新的功能,它不僅可以拼接字符串或者在特定的位置插入字符串,還可以刪除指定索引上的字符,使用起來相當(dāng)方便。案例 4-9 StringBuffer 的常用操作方法 運(yùn)行結(jié)果如圖 4-12 所示。圖 4-12 運(yùn)行結(jié)果 從案例 4-9 可知,StringBuffer 中的 delete 方法能夠很靈活地刪除字符串中的數(shù)據(jù),配合 insert()方法可以快速實(shí)現(xiàn)字符串的修改操作。從輸出結(jié)果可以看出,StringBuffer 對(duì)象的修改是持久的。 很有意思的是,其 replace 方法與 String 的replace 方法有所不同。在 Strin

23、g 中,replace()方法會(huì)替換符合條件的所有字符,其參數(shù)是兩個(gè)字符串:一個(gè)匹配項(xiàng)和一個(gè)匹配后需要將其匹配項(xiàng)替換的字符串。 在 StringBuffer 中,replace()則是三個(gè)參數(shù),分別是起始索引位置、結(jié)束索引位置和需要將此索引區(qū)間替換成的字符串項(xiàng)。在需要替換預(yù)定格式的字符串的固定位置序列時(shí),該方法非常方便。 在StringBufer的這些輸出中不難看出,StringBuffer 對(duì)于字符串的操作也是“含頭不含尾”的處理方式。在替換索引位置 0 至索引位置 2 的操作里,替換操作只替換了索引位置 0 和索引位置 1。這種處理方式一定要牢記。4.2.2 StringBuilder 與

24、 StringBuffer 的比較 StringBuilder 也是官方 API 中設(shè)計(jì)的用來操作字符串的方法類,StringBuilder 到底有哪些方法呢?下面我們通過一個(gè)案例來學(xué)習(xí)這個(gè)類。案例 4-10 StringBuilder 的常用方法 運(yùn)行結(jié)果如圖 4-13 所示。圖 4-13 運(yùn)行結(jié)果 StringBuffer 和 StringBuilder 的直接父類都是 AbstractStringBuilder。它們唯一的區(qū)別就是,StringBuffer 的每個(gè)方法上都多了一個(gè)synchronized 關(guān)鍵字。synchronized 關(guān)鍵字相當(dāng)于給跑道設(shè)置了邊界,選手不會(huì)出現(xiàn)因?yàn)椴恍?/p>

25、心跑到其他選手的跑道而導(dǎo)致比賽混亂的情況。 StringBuffer 是線程安全的,而 StringBuilder 則不是。在編寫程序的時(shí)候如果判定不需要考慮多線程環(huán)境,那么首選StringBuilder,因?yàn)闊o須考慮多線程,也就如同避免了選手會(huì)跑錯(cuò)跑道而需要設(shè)置的柵欄,那么速度自然會(huì)更快一些。4.3 常用的 JavaAPI Java 為了方便編程人員的快速開發(fā),提供了大量的通用 API,其中最常用到的就是System.out.println(),這個(gè)方法是 System 類下的一個(gè)方法。除了 System 類以外,還有諸如數(shù)學(xué)計(jì)算方面的 Random 類、Math 類等。4.3.1 Syst

26、em 類 System 字面意思是系統(tǒng),顧名思義,這個(gè)類是和系統(tǒng)屬性相關(guān)的,可以用來改變當(dāng)前的系統(tǒng)環(huán)境變量來實(shí)現(xiàn)某些功能。因?yàn)檫@些都是靜態(tài)的方法,所以它們可以直接使用類名調(diào)用,省去了初始化該類的步驟。1系統(tǒng)屬性 在第 1 章中配置系統(tǒng)環(huán)境變量的步驟就是在配置 Java 的編譯和運(yùn)行環(huán)境,當(dāng)時(shí)配置的是 JAVA_HOME 這個(gè)系統(tǒng)變量。如果想手動(dòng)修改,除了可以在系統(tǒng)內(nèi)通過高級(jí)系統(tǒng)設(shè)置選項(xiàng)卡去配置,還可以使用 System 類對(duì)這些環(huán)境變量進(jìn)行修改,當(dāng)然前提是你知道這些環(huán)境變量的 KEY 值,JAVA_HOME 就是一個(gè) KEY 值。案例 4-11 系統(tǒng)環(huán)境變量 運(yùn)行結(jié)果如圖 4-14 所示。圖

27、4-14 運(yùn)行結(jié)果 此處因內(nèi)容較多,僅截取了部分內(nèi)容。具體的輸出會(huì)因?yàn)檫\(yùn)行的系統(tǒng)不同而有所差別,有興趣的讀者可以自己運(yùn)行后查看。 Java可以通過System類來獲取當(dāng)前系統(tǒng)的環(huán)境變量,如案例4-11中的System. getProperties()方法。同時(shí)System類還可以根據(jù)環(huán)境變量的名稱來獲取該值。在需要的時(shí)候,也可以通過 System 來修改甚至添加系統(tǒng)環(huán)境變量的值,同時(shí)也能將其刪除。如案例 4-11 中的 DEBUG_HOME 這個(gè)環(huán)境變量就可以通過 System 來修改、添加甚至刪除。如果該環(huán)境變量不存在,獲取時(shí)會(huì)返回 null。2當(dāng)前時(shí)間 有時(shí)候在編寫代碼的時(shí)候需要考慮代碼的

28、性能,使用人工計(jì)時(shí)的方式不僅不可靠,還會(huì)比較煩瑣,為了能夠精確地計(jì)算程序執(zhí)行耗費(fèi)的時(shí)間,System 類提供了相應(yīng)的方法以供使用。案例 4-12 系統(tǒng)當(dāng)前時(shí)間 運(yùn)行結(jié)果如圖 4-15 所示。圖 4-15 運(yùn)行結(jié)果 計(jì)算機(jī)的元年是 1970 年 1 月 1 日 0 時(shí) 0 分 0 秒,所以 System 在獲取時(shí)間的時(shí)候會(huì)用當(dāng)前時(shí)間跟元年進(jìn)行比較,這也可以看作是對(duì)計(jì)算機(jī)元年的時(shí)間偏移量。一般使用 currentTimeMillis()就可以滿足需要了,這是當(dāng)前時(shí)間對(duì)元年的毫秒時(shí)間偏移量,是一個(gè) long 類型的數(shù)值。但當(dāng)時(shí)間需要更加精確的時(shí)候,我們可以使用納秒來計(jì)算,即 nanoTime()。n

29、anoTime 同樣是對(duì)元年的納秒時(shí)間偏移量,它會(huì)返回一個(gè) long 類型的數(shù)值。 在簡(jiǎn)單的方法性能測(cè)試的時(shí)候,一般會(huì)選擇毫秒作為單位進(jìn)行方法調(diào)用耗時(shí)統(tǒng)計(jì),System 類獲取當(dāng)前時(shí)間的方法大大簡(jiǎn)化了這種簡(jiǎn)單測(cè)試的難度。在測(cè)試時(shí)可以選擇測(cè)試內(nèi)容塊來進(jìn)行耗時(shí)統(tǒng)計(jì),可以在開發(fā)階段就去發(fā)現(xiàn)那些性能較差的代碼塊。3數(shù)組拷貝 System 類還提供了一個(gè)常用的方法,即數(shù)組內(nèi)容拷貝,該方法可以將指定的數(shù)組內(nèi)容拷貝到目標(biāo)數(shù)組中去。案例 4-13 數(shù)組拷貝 運(yùn)行結(jié)果如圖 4-16 所示。圖 4-16 運(yùn)行結(jié)果 arraycopy()方法接口的 5 個(gè)參數(shù)分別是:源數(shù)組、復(fù)制起始位置、目標(biāo)數(shù)組、存放起始位置、復(fù)

30、制長(zhǎng)度。在案例 4-13 中,第二次復(fù)制操作拋出了異常,原因是數(shù)組下標(biāo)越界。這說明復(fù)制不是隨心所欲的,必須保證目標(biāo)數(shù)組從開始位置起有足夠的容量存放將要復(fù)制的數(shù)據(jù)。同時(shí),也要保證源數(shù)組中從復(fù)制起始位置起有足夠長(zhǎng)度的數(shù)據(jù)可供復(fù)制。如果源數(shù)組和目標(biāo)數(shù)據(jù)其中之一沒有足夠的數(shù)據(jù)或容量,都會(huì)拋出數(shù)組下標(biāo)越界的錯(cuò)誤。 System 類還有 gc()方法來調(diào)用垃圾回收器,但是這個(gè)方法并不是調(diào)用后立即執(zhí)行的,有興趣的讀者可以查看官方的 API 去學(xué)習(xí)。同時(shí),該類還有 exit()方法來終止當(dāng)前的 Java 虛擬機(jī),參數(shù)是整型類型 0,則表示系統(tǒng)正常退出,想要進(jìn)一步了解的讀者可以查閱相關(guān)的文檔。4.3.2 Ran

31、dom 類與 Math 類 除了 System 類,Java 還提供了 Random 類和 Math 類來處理相應(yīng)的操作。Random 類顧名思義是隨機(jī)數(shù)生成類,該類可以隨機(jī)生成一些數(shù)字,我們稱之為隨機(jī)數(shù),而 Math 類則是處理一些簡(jiǎn)單的數(shù)學(xué)運(yùn)算的函數(shù),例如正弦、余弦等。1Random 隨機(jī)數(shù) 案例 4-14 Random 隨機(jī)生成隨機(jī)數(shù) 運(yùn)行結(jié)果如圖 4-17、圖 4-18 所示。圖 4-17 運(yùn)行結(jié)果 1圖 4-18 運(yùn)行結(jié)果 2 Random 類是隨機(jī)數(shù)類,它可以隨機(jī)生成一個(gè)整型、浮點(diǎn)類型的隨機(jī)數(shù),甚至可以產(chǎn)生一個(gè)隨機(jī)的 boolean 值。 Random 的 nextInt()方法用

32、于生成一個(gè)在 int 有效值以內(nèi)的數(shù)值,nextInt(int range)則生成一個(gè)在 0range 范圍以內(nèi)的整數(shù)。double 類型和 float 類型隨機(jī)數(shù)生成方式與 int 類型一致。因?yàn)?boolean 類型只有兩個(gè)值,所以 nextBoolean()方法只會(huì)生成 false 或者 true。 在案例 4-14 中有個(gè)特殊的地方,就是在代碼的后半部分重新初始化了 rm 對(duì)象,這次初始化的時(shí)候使用了有參構(gòu)造函數(shù)的方式。在 Random 類中,這個(gè)參數(shù)成為隨機(jī)種子,一旦使用了隨機(jī)種子,那么該對(duì)象生成的隨機(jī)數(shù)就會(huì)固定不變,無論使用多少次,相同的方法只會(huì)返回相同的值。在運(yùn)行結(jié)果圖中經(jīng)對(duì)比即

33、可發(fā)現(xiàn)。2Math 數(shù)學(xué)類 數(shù)學(xué)類是為了簡(jiǎn)便一些常用的數(shù)學(xué)計(jì)算的類,例如平方根、正弦、余弦等,Math 類還提供了角度和弧度轉(zhuǎn)換、求取兩數(shù)之間的較大數(shù)或較小數(shù)等。案例 4-15 數(shù)學(xué)類 運(yùn)行結(jié)果如圖 4-19 所示。圖 4-19 運(yùn)行結(jié)果4.4 動(dòng)手任務(wù):猜數(shù)字游戲 【任務(wù)介紹】 1任務(wù)描述 在春節(jié)期間,移動(dòng)推出了一元搶流量包活動(dòng)。移動(dòng)用戶可以使用一元錢購(gòu)買流量包,購(gòu)買后可以多人共享,每個(gè)移動(dòng)號(hào)碼可以猜一次,如果猜中了,則所有人都會(huì)有流量獎(jiǎng)勵(lì),購(gòu)買者獲得 70%的總流量值,其余的流量由參加猜值的用戶分得。 活動(dòng)中,移動(dòng)用戶通過分享鏈接進(jìn)入猜流量頁面,輸入一個(gè)移動(dòng)號(hào)碼即有一次猜值資格,如果猜中了,提示用戶已猜中,如果未猜中,則提示用戶猜測(cè)值是大了還是小了,用戶可以根據(jù)之前的提示縮小范圍繼續(xù)猜值。 參考移動(dòng)的活動(dòng),我們可以將其簡(jiǎn)化成一個(gè)動(dòng)手任務(wù):猜數(shù)字游戲。系統(tǒng)隨機(jī)生成一個(gè) 1100 的隨機(jī)數(shù),玩家鍵入自己猜測(cè)的數(shù)字,如果猜中了,則提示玩家贏了,游戲結(jié)束,否則提示用戶猜測(cè)的數(shù)字是大了或者小了,讓玩家繼續(xù)猜,玩家有十次猜測(cè)機(jī)會(huì)。2運(yùn)行結(jié)果 猜測(cè)失敗的運(yùn)行結(jié)果如圖 4-20 所示。圖 4-20 運(yùn)行結(jié)果 1 猜測(cè)成功的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論