Java程序設(shè)計(jì)基礎(chǔ) 課件 (羅剛)第3章 Java面向過程編程、第4章 Java數(shù)組與字符串_第1頁
Java程序設(shè)計(jì)基礎(chǔ) 課件 (羅剛)第3章 Java面向過程編程、第4章 Java數(shù)組與字符串_第2頁
Java程序設(shè)計(jì)基礎(chǔ) 課件 (羅剛)第3章 Java面向過程編程、第4章 Java數(shù)組與字符串_第3頁
Java程序設(shè)計(jì)基礎(chǔ) 課件 (羅剛)第3章 Java面向過程編程、第4章 Java數(shù)組與字符串_第4頁
Java程序設(shè)計(jì)基礎(chǔ) 課件 (羅剛)第3章 Java面向過程編程、第4章 Java數(shù)組與字符串_第5頁
已閱讀5頁,還剩122頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第三章Java面向過程編程3.1Java的順序結(jié)構(gòu)3.2Java的分支結(jié)構(gòu)3.3循環(huán)結(jié)構(gòu)3.4結(jié)構(gòu)嵌套3.5函數(shù)本章小結(jié)

3.1Java的順序結(jié)構(gòu)

面向過程編程中,我們采用結(jié)構(gòu)化的方式進(jìn)行編程,每個(gè)結(jié)構(gòu)具有一個(gè)入口和一個(gè)出口,按照解決問題的步驟一個(gè)一個(gè)結(jié)構(gòu)順序地執(zhí)行,直到程序結(jié)束。這些結(jié)構(gòu)內(nèi)部包括各種基本語句,比如定義變量、變量賦值、分支、循環(huán)、輸入/輸出等,或者包括這些語句的嵌套。

相對于分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),順序結(jié)構(gòu)主要是指定義變量、變量賦值、表達(dá)式運(yùn)算、輸入/輸出等語句。這里用一個(gè)C語言的程序示例來說明。該程序的功能是求兩個(gè)正整數(shù)的最大公約數(shù)。過程描述:從鍵盤輸入2個(gè)整數(shù),判斷是否為正數(shù),如果否,則結(jié)束函數(shù),返回0;如果都為正數(shù),則使用循環(huán)結(jié)構(gòu)來求兩個(gè)數(shù)的最大公約數(shù),最后輸出結(jié)果。

★與C語言的比較:

(1)?C語言的變量定義都要在程序開始處,而Java可以在程序需要的地方定義變量。

(2)?C語言的輸入/輸出使用scanf()和printf(),而Java的輸入使用Scanner類對象及相應(yīng)的成員函數(shù)進(jìn)行,輸出使用System.out.println()。

(3)?C語言的main函數(shù)使用return語句來結(jié)束函數(shù)運(yùn)行,而Java使用“System.exit(0);”語句來終止程序。

程序結(jié)果:

3.2Java的分支結(jié)構(gòu)分支結(jié)構(gòu)主要有單分支、雙分支和多分支三種結(jié)構(gòu),程序運(yùn)行到該結(jié)構(gòu)時(shí)根據(jù)分支條件來判斷走哪條“路”:(1)單分支:分支條件成立,執(zhí)行分支語句,否則不執(zhí)行。(2)雙分支:分支條件成立,執(zhí)行第一條分支語句,否則執(zhí)行第二條分支語句。(3)多分支:從第一個(gè)分支條件開始自上向下判斷分支條件,哪個(gè)分支條件成立就執(zhí)行哪條分支語句,然后退出整個(gè)多分支結(jié)構(gòu)。

3.2.1if語句

if語句的三種結(jié)構(gòu)形式如下:

(1)單分支結(jié)構(gòu):

(2)雙分支結(jié)構(gòu):

(3)多分支結(jié)構(gòu):

下面以雙分支的if-else結(jié)構(gòu)為例進(jìn)行說明,圖3-1是雙分支結(jié)構(gòu)的流程圖,程序從a進(jìn)入到該結(jié)構(gòu)碰到分支條件,當(dāng)條件為真時(shí)執(zhí)行S2語句(或語句塊),條件為假時(shí)執(zhí)行S1語句(或語句塊),不管執(zhí)行哪條語句,都要從b出口退出該分支結(jié)構(gòu)。簡單來說就是條件為真走S2這條“路”,條件為假走S1這條“路”,S1和S2這兩條路,只能選擇一條。圖3-1選擇結(jié)構(gòu)

分支條件說明:

(1)條件可以由關(guān)系表達(dá)式、邏輯表達(dá)式或布爾邏輯變量等構(gòu)成。

(2)關(guān)系表達(dá)式是由==、!=、<、>、>=、<=等這些關(guān)系運(yùn)算符連接起來的運(yùn)算式。

(3)邏輯表達(dá)式是由邏輯非(!)、邏輯與(&&)、邏輯或(||)三個(gè)邏輯運(yùn)算符連接起來的運(yùn)算式。

各運(yùn)算符的優(yōu)先級別為:

!>算術(shù)運(yùn)算符>關(guān)系運(yùn)算符>&&>||>賦值運(yùn)算符

(4)?&&?和?||?運(yùn)算符的結(jié)合性是從左到右。

(表達(dá)式1)&&(表達(dá)式2)若表達(dá)式1為假,則表達(dá)式2不會(huì)被運(yùn)行

(表達(dá)式1)||(表達(dá)式2)若表達(dá)式1為真,則表達(dá)式2不會(huì)被運(yùn)行

(5)?0<x<10在數(shù)學(xué)中表示x大于0且小于10,但是在程序中表達(dá)這個(gè)條件時(shí)應(yīng)該寫為

x>0&&x<10

程序結(jié)果:

(3)不管使用哪種分支結(jié)構(gòu),程序的邏輯要正確,不要有漏洞。if只能管制一條語句,可以使用花括號將多條語句構(gòu)成一個(gè){語句塊}歸屬if管制,if和else后面固定使用{}包圍分支語句(不管是一條還是多條)是一個(gè)良好的編程習(xí)慣。

3.2.2switch語句

Java與C語言一樣可以使用switch的多分支結(jié)構(gòu),switch語句的一般形式如下:

switch語法說明:

(1)?switch語句中的表達(dá)式類型只能是byte、short、int、char和枚舉等類型,在JDK1.7后可以有string表達(dá)式類型。

(2)?case后面的值1、值2、…、值n必須是整型、字符型常量以及字符串,各個(gè)case后面的常量值不能相同。

(3)?switch語句的主要流程是把表達(dá)式的值依次與各個(gè)case子句中的值比較,如果值相等,表示匹配成功,找到對應(yīng)的分支,執(zhí)行該case后面的子句。

(4)可以把switch后面的表達(dá)式看成選路的依據(jù),case后面的值是分支路徑的路標(biāo),如果表達(dá)式的值與路標(biāo)相同,表示找到了分支路徑,開始執(zhí)行該路徑下的語句。

(5)一般在每條分支最后都有break語句,作用是執(zhí)行完一個(gè)case分支后,使程序跳出switch語句,不再執(zhí)行其它語句;如果某個(gè)子句后不使用break語句,則繼續(xù)向下執(zhí)行后面的語句,直至碰到下一個(gè)break或運(yùn)行到switch的右花括號結(jié)束。

(6)關(guān)于default語句,當(dāng)switch表達(dá)式的值與所有case語句中的值都不匹配時(shí),就會(huì)找到default,開始執(zhí)行default分支的語句。

程序結(jié)果:

3.3循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)示意圖如圖3-2所示,當(dāng)滿足循環(huán)條件時(shí)就執(zhí)行循環(huán)語句,執(zhí)行完循環(huán)語句后,再進(jìn)行條件判斷,如果條件還為真,則繼續(xù)執(zhí)行循環(huán)語句,直到條件為假時(shí)退出循環(huán)體。

圖3-2循環(huán)結(jié)構(gòu)

3.3.1while循環(huán)結(jié)構(gòu)

while循環(huán)結(jié)構(gòu),又稱為當(dāng)型循環(huán):當(dāng)條件成立時(shí),進(jìn)入循環(huán)體;當(dāng)條件不成立時(shí),退出循環(huán)體。當(dāng)型結(jié)構(gòu)如圖3-2所示,一般結(jié)構(gòu)形式如下:

程序結(jié)果:

3.3.2for循環(huán)結(jié)構(gòu)

如果清楚知道循環(huán)次數(shù),或者循環(huán)的步進(jìn)變化很明確,這時(shí)使用for循環(huán)更為方便。從for循環(huán)的頭部就能很直觀地讀出循環(huán)的次數(shù),其結(jié)構(gòu)形式如下:

for循環(huán)的結(jié)構(gòu)如圖3-3所示。圖3-3for循環(huán)結(jié)構(gòu)

程序結(jié)果:

3.3.3循環(huán)控制語句

break語句:“break;”如果在循環(huán)體中被執(zhí)行,則退出整個(gè)循環(huán)結(jié)構(gòu);在多層嵌套循環(huán)中被執(zhí)行,則只能跳出本層循環(huán)結(jié)構(gòu)。

continue語句:“continue;”如果在循環(huán)體中被執(zhí)行,表示本次循環(huán)結(jié)束,進(jìn)入下一次循環(huán)。

break語句和continue語句在循環(huán)體中出現(xiàn)時(shí)一般都需要放入一個(gè)if分支結(jié)構(gòu)中,即在某個(gè)條件成立時(shí),break語句用于退出所在循環(huán),continue語句則結(jié)束本次循環(huán)而繼續(xù)下一次循環(huán)。

3.4結(jié)構(gòu)嵌套結(jié)構(gòu)嵌套主要指的是順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)語句相互嵌套,比如在循環(huán)結(jié)構(gòu)中有循環(huán)結(jié)構(gòu),循環(huán)結(jié)構(gòu)中有分支結(jié)構(gòu),分支結(jié)構(gòu)中有循環(huán)結(jié)構(gòu)等,如何正確地完成這些結(jié)構(gòu)的嵌套呢?這需要根據(jù)解決問題的算法來進(jìn)行,在編程之前需要對問題進(jìn)行解讀,對算法進(jìn)行分解,分解的步驟邏輯要正確,思路要清晰,從而才能規(guī)劃好程序的結(jié)構(gòu),有條不紊地進(jìn)行編程。分解好算法步驟之后要用正確的語法來實(shí)現(xiàn)這些步驟,并通過運(yùn)行、調(diào)試解決程序中出現(xiàn)的問題,直到得到正確的程序。

程序示例3-8從鍵盤輸入一個(gè)正整數(shù)n(n>2),求小于n的所有素?cái)?shù)之和。

如圖3-4所示,對這個(gè)問題進(jìn)行算法分解,將程序分為兩個(gè)主要結(jié)構(gòu):1是如何判斷一個(gè)數(shù)是否為素?cái)?shù),2是一個(gè)循環(huán)結(jié)構(gòu),對2~n-1所有的數(shù)依次進(jìn)行判斷。首先要能完成1結(jié)構(gòu),然后將1結(jié)構(gòu)嵌入到2循環(huán)結(jié)構(gòu)中。下面我們將依次完成這個(gè)程序。圖3-4結(jié)構(gòu)嵌套

(2)求小于n的所有素?cái)?shù)之和(結(jié)構(gòu)2)

將上述程序段1嵌入到2~n-1循環(huán)中,重新分配變量?,F(xiàn)在是對2~n-1中的每個(gè)數(shù)i進(jìn)行判斷,如果是素?cái)?shù)則加入到sum中,否則循環(huán)繼續(xù)。

程序結(jié)果:

3.5函數(shù)

3.5.1函數(shù)的定義與調(diào)用在面向過程編程中,函數(shù)是非常重要的。如何定義和調(diào)用函數(shù),對于C語言和Java都是必須掌握的重要知識點(diǎn)。函數(shù)定義時(shí)要注意的三個(gè)要素(圖3-5):(1)函數(shù)參數(shù):調(diào)用該函數(shù)時(shí)要傳入什么數(shù)據(jù)。(2)函數(shù)返回值類型:函數(shù)調(diào)用結(jié)束,返回一個(gè)什么類型的數(shù)據(jù)。(3)函數(shù)體:代表了該函數(shù)要完成的任務(wù)或提供的功能。

圖3-5函數(shù)三要素

可以將上一節(jié)判斷一個(gè)數(shù)是否為素?cái)?shù)的結(jié)構(gòu)1程序,寫成一個(gè)函數(shù)isPrime,聲明為

publicstaticbooleanisPrime(intn)

說明:

(1)?main函數(shù)如果要直接調(diào)用該函數(shù),該函數(shù)也需要static修飾。

(2)該函數(shù)傳入一個(gè)正整數(shù)n,用于判斷該n是否為素?cái)?shù)。

(3)該函數(shù)返回值為布爾類型,返回true則表示n是素?cái)?shù),返回false則表示n不是素?cái)?shù)。

(4)函數(shù)體功能如函數(shù)名isPrime所示,用以判斷某個(gè)數(shù)是否為素?cái)?shù)。

程序結(jié)果:

3.5.2Java函數(shù)與幫助文檔

1.?Java編程接口

應(yīng)用程序編程接口(ApplicationProgrammingInterface,API)是一組預(yù)定義函數(shù)總和,目的是提供應(yīng)用程序,以方便開發(fā)人員訪問這些函數(shù)的聲明和功能,而無需訪問源碼或理解內(nèi)部工作機(jī)制的細(xì)節(jié)。Java具有一個(gè)很龐大的API,Java程序員能夠使用這些函數(shù)來構(gòu)建自己的程序,減輕工作量。

打開JDK1.6API幫助文檔,如圖3-6所示。

圖3-6JDK幫助文檔

2.包和類的概念

Java的基本程序組織單位是類,類中可以有多個(gè)函數(shù)(成員方法)。由于Java編程面向各個(gè)領(lǐng)域,預(yù)定義的類非常多,JDK1.6版本大概有3700多個(gè)類。為了方便管理這么多類,這些類被分類放在不同的包中,包就是文件夾。比如java.io包,就是java/io文件夾,其中有與Java輸入/輸出相關(guān)的類80多個(gè),如File文件類、FileReader文件輸入類、FileWriter文件輸出類、BufferedReader帶緩沖的輸入類、BufferedWriter帶緩沖的輸出類等等,這些類中有很多成員函數(shù),提供了相應(yīng)的函數(shù)功能供程序員使用。

點(diǎn)擊圖3-6的“顯示”按鈕,可以展開“索引”和“搜索”選項(xiàng)卡,其中用的比較多的是“索引”,在“索引”中輸入想要查詢的類名,找到類才能找到想要找的函數(shù),如圖3-7所示。

圖3-7JDK幫助文檔索引

3.幫助文檔的使用

以字符串類String為例(該類在后面要詳細(xì)說明),輸入String后點(diǎn)擊進(jìn)入,可以看到對String類的描述,如圖3-8所示。圖3-8查詢String類

雙擊左邊的String,右邊出現(xiàn)String類的具體描述,向下拉動(dòng)右邊的滾動(dòng)條,可以看到對字符串處理的函數(shù)說明在“方法摘要”里,如圖3-9所示。

圖3-9查詢String類的函數(shù)

點(diǎn)擊第一個(gè)函數(shù)鏈接,可以進(jìn)一步看到該函數(shù)的詳細(xì)說明,如圖3-10所示。圖3-10charAt函數(shù)說明

API中的兩種函數(shù)為對象成員函數(shù)和類成員函數(shù)。

(1)對象成員函數(shù)。上述第一個(gè)函數(shù)charAt就是對象成員函數(shù),即首先由String類產(chǎn)生字符串對象,再由對象來調(diào)用的函數(shù)。

charAt函數(shù)使用時(shí)需要傳入一個(gè)整數(shù),表示字符串的下標(biāo)索引,某個(gè)字符串對象調(diào)用該函數(shù),能夠?qū)⒃撟址畬ο笾付ㄏ聵?biāo)索引處的字符返回,如charc="abcdef".charAt(3)返回字符'd'。(注:字符串下標(biāo)從0開始計(jì)數(shù),字符串常量也是一個(gè)字符串對象。)

"abcdef"是一個(gè)字符串對象,該對象采用成員運(yùn)算符(.)調(diào)用charAt函數(shù),找到第四個(gè)字符返回,所以該函數(shù)的調(diào)用返回字符?'d'?賦值給c變量。

我們可以看到圖3-9中charAt后面的函數(shù)全是對象成員函數(shù),直到最后一個(gè)copyValueOf函數(shù)。

(2)類成員函數(shù)。圖3-9的最后一個(gè)函數(shù)copyValueOf和上面函數(shù)的不同之處在于它有一個(gè)static靜態(tài)修飾符,如圖3-11所示,這種帶static修飾符的函數(shù)稱為類成員函數(shù)。調(diào)用該函數(shù)可以不用產(chǎn)生對象,直接由類名調(diào)用:

Strings=String.copyValueOf(ch);

上述語句表示,調(diào)用字符串類的copyValueOf函數(shù),將字符數(shù)組ch中的所有字符構(gòu)造成為一個(gè)字符串對象返回給s對象。圖3-11copyValueOf函數(shù)說明

從上述兩個(gè)函數(shù)的查詢可以看出,要使用Java預(yù)定義的函數(shù),首先要找到類,類中的函數(shù)分為對象成員函數(shù)和類成員函數(shù),對象成員函數(shù)的使用必須要先產(chǎn)生對象,由對象來調(diào)用函數(shù),而類成員函數(shù)可以使用類名,也可以使用對象名來調(diào)用。

查詢幫助文檔,使用Java的預(yù)定義函數(shù)來幫助構(gòu)建程序,使得Java編程者更多關(guān)注如何解決問題和如何構(gòu)建程序,而屏蔽了一些具體函數(shù)的編寫,這樣大大減輕了Java程序員的工作量,也是Java和C語言編程方式的一個(gè)不同之處。

本章小結(jié)

1.Java面向過程編程源于C語言,同樣是結(jié)構(gòu)化的編程,具有順序、分支和循環(huán)三種結(jié)構(gòu)。2.順序結(jié)構(gòu)是面向過程編程的主要方式,每一個(gè)結(jié)構(gòu)都有一個(gè)入口和一個(gè)出口,程序由多個(gè)結(jié)構(gòu)構(gòu)成,按一個(gè)結(jié)構(gòu)一個(gè)結(jié)構(gòu)的順序運(yùn)行。3.Java的分支語句分為單分支if、雙分支if-else、多分支if-elseif和switch語句。

4.Java中作為分支、循環(huán)結(jié)構(gòu)條件的只能是關(guān)系表達(dá)式、邏輯表達(dá)式或者邏輯變量。

5.Java循環(huán)主要有while語句、do-while語句以及for語句循環(huán)。在不清楚循環(huán)次數(shù)時(shí)多用while循環(huán),在明確了循環(huán)次數(shù)時(shí)多用for循環(huán),二者是可以相互轉(zhuǎn)換的。

6.在循環(huán)中可以使用break語句來強(qiáng)制退出循環(huán),可以使用continue語句來結(jié)束本次循環(huán)而繼續(xù)下一次循環(huán),一般需要和if語句一起使用。

7.分支、循環(huán)結(jié)構(gòu)的嵌套是本章的難點(diǎn),需要一定量的編程練習(xí)才能掌握。對于問題的解決,要對算法進(jìn)行分析,分解算法步驟,使用正確的語法實(shí)現(xiàn)各個(gè)步驟,調(diào)試運(yùn)行。

8.函數(shù)定義需要注意函數(shù)的三個(gè)要素,即函數(shù)參數(shù)、函數(shù)返回值類型和函數(shù)體。

9.Java函數(shù)主要分為自定義函數(shù)和Java預(yù)定義的函數(shù),要會(huì)根據(jù)要求定義函數(shù),也要學(xué)會(huì)查詢JavaAPI幫助文檔,使用Java定義好的函數(shù)來構(gòu)建程序。

10.Java類中的函數(shù)分為兩種,帶static修飾符的稱為靜態(tài)函數(shù)/類函數(shù),可以由類名進(jìn)行調(diào)用;不帶static修飾符的稱為成員函數(shù),需要先定義類對象,再由對象來調(diào)用。第四章Java數(shù)組與字符串4.1數(shù)組4.2字符串本章小結(jié)

4.1數(shù)組

4.1.1數(shù)組的基本概念數(shù)組是一組類型相同、在內(nèi)存中連續(xù)存放的數(shù)據(jù)集合。數(shù)組中的每個(gè)數(shù)據(jù)稱為一個(gè)數(shù)組元素,例如定義了一個(gè)具有10個(gè)元素的整數(shù)數(shù)組a,則內(nèi)存中的情況如圖4-1所示。圖4-1數(shù)組示意圖

(1)?a數(shù)組有10個(gè)元素,每個(gè)元素都是一個(gè)int變量,在內(nèi)存中地址連續(xù)。

(2)數(shù)組的元素使用數(shù)組下標(biāo)元素符[]標(biāo)識,下標(biāo)索引i從0開始,到9結(jié)束,a[i]是a數(shù)組的第i+1個(gè)數(shù)組元素,i必須在0~n-1之間(n是a數(shù)組的長度)。如果i>=n或者i<0,在Java中都屬于越界行為,是不允許的,程序會(huì)終止運(yùn)行并報(bào)異常。

(3)數(shù)組一旦定義長度n,就不可改變長度(數(shù)組的容量固定)。

4.1.2數(shù)組的定義與初始化

1.?C語言的數(shù)組情況

Java的數(shù)組與C語言的具有很多不同,首先來看一下C語言中對數(shù)組的定義,例如定義一個(gè)數(shù)組為“inta[5];”,內(nèi)存如圖4-2所示。圖4-2C語言數(shù)組示意圖

C語言數(shù)組的語法規(guī)則:

(1)?a是數(shù)組名,代表了這個(gè)數(shù)組的首地址,是一個(gè)不可改變的量,不能對a進(jìn)行賦值。

(2)“inta[5];”定義之后,就可以對a數(shù)組的各個(gè)元素進(jìn)行賦值和運(yùn)算了。

(3)可以在定義的時(shí)候整體賦值,即“inta[5]={1,2,3,4,5};”,而定義之后就只能夠?qū)?shù)組的單個(gè)元素進(jìn)行賦值操作。

(4)?C語言對于數(shù)組的下標(biāo)越界的處理態(tài)度是“后果自負(fù)”。

2.?Java的數(shù)組情況

Java的數(shù)組定義語句為

int[]a=newint[5];

(1)等號左邊定義了一個(gè)整數(shù)數(shù)組類型(int[]視為一個(gè)類型)的變量a。a是數(shù)組名,同時(shí)a的本質(zhì)是一個(gè)引用變量,類似于一個(gè)能夠指向整數(shù)數(shù)組的指針變量。既然是變量,就可以對a進(jìn)行賦值操作,讓它指向另外一個(gè)整數(shù)數(shù)組,即“a=b;”。

(2)等號右邊使用new在內(nèi)存中分配了一段空間,即5*4→20字節(jié),a就指向該內(nèi)存空間的首地址。

(3)?Java在定義a數(shù)組的時(shí)候也可以使用花括號進(jìn)行數(shù)組的初始化:

int[]b={1,2,3,4,5}; //根據(jù)花括號里面的值,b的長度為5

(4)整體賦值只能發(fā)生在定義的時(shí)候,定義語句之后就只能對b的單個(gè)元素進(jìn)行賦值。

(5)該數(shù)組在內(nèi)存中的情況與上述C語言的一致,如圖4-2所示。

3.棧內(nèi)存與堆內(nèi)存

Java中定義一個(gè)數(shù)組會(huì)在內(nèi)存中兩個(gè)區(qū)域進(jìn)行操作,一個(gè)區(qū)域是棧內(nèi)存,保存了引用變量a;另一個(gè)區(qū)域是堆內(nèi)存,保存了數(shù)組的實(shí)際元素集合,如圖4-3所示。

1)棧內(nèi)存

當(dāng)函數(shù)被調(diào)用時(shí),函數(shù)進(jìn)入棧內(nèi)存空間,即函數(shù)得到分配的內(nèi)存空間。棧內(nèi)存空間具有棧的特性:先進(jìn)后出,后進(jìn)先出。main函數(shù)是程序入口,最先進(jìn)棧,被壓入棧底;如果main函數(shù)調(diào)用fun函數(shù),則fun函數(shù)進(jìn)棧,壓在main函數(shù)上面;只有fun函數(shù)運(yùn)行結(jié)束后出棧了,main函數(shù)才能繼續(xù)運(yùn)行,直到運(yùn)行結(jié)束后退棧(即釋放函數(shù)得到棧內(nèi)存空間)。圖4-3Java數(shù)組內(nèi)存示意圖

2)堆內(nèi)存

在C語言中也有堆內(nèi)存的概念。在標(biāo)準(zhǔn)C語言中,使用malloc等內(nèi)存分配函數(shù)從堆內(nèi)存中獲取內(nèi)存空間,從堆中分配的內(nèi)存需要程序員手動(dòng)釋放,如果不釋放,而系統(tǒng)內(nèi)存管理器又不自動(dòng)回收這些內(nèi)存空間,這樣很容易產(chǎn)生內(nèi)存溢出的情況。

Java中同樣也有堆內(nèi)存的概念,Java定義的對象、數(shù)組等存放在堆內(nèi)存空間中。堆的優(yōu)勢是可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因?yàn)樗窃谶\(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存的。Java的堆內(nèi)存是由Java的垃圾回收機(jī)制*來負(fù)責(zé)的,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù),釋放內(nèi)存。其缺點(diǎn)是由于要在運(yùn)行時(shí)動(dòng)態(tài)管理內(nèi)存,需要消耗一定的資源,對程序速度有一定影響。

程序結(jié)果:

4.1.3數(shù)組遍歷

1.數(shù)組的遍歷

數(shù)組的遍歷即對數(shù)組的每個(gè)元素訪問一次,這是數(shù)組最常見的操作,一般是用for循環(huán)進(jìn)行,采用三個(gè)表達(dá)式的形式,i從0開始步進(jìn)變化到n-1。

程序結(jié)果:

程序示例4-3對程序示例4-1進(jìn)行改造,將上述程序的功能寫成一個(gè)函數(shù)。

函數(shù)的功能是對傳入的整數(shù)數(shù)組找尋最大值及下標(biāo),由main函數(shù)初始化數(shù)組,將數(shù)組傳入該函數(shù),調(diào)用該函數(shù)完成尋找最大值及下標(biāo)的功能。我們都知道函數(shù)只能返回一個(gè)值,如何讓一個(gè)函數(shù)傳回兩個(gè)及以上的值給調(diào)用函數(shù)呢?方法是再將一個(gè)數(shù)組傳入該函數(shù),作為結(jié)果數(shù)組,將函數(shù)找到的多個(gè)值賦值給該數(shù)組的多個(gè)元素即可,如圖4-4所示。

圖4-4數(shù)組作為函數(shù)參數(shù)

具體的內(nèi)存示意圖如圖4-5所示,該圖是main函數(shù)調(diào)用fun函數(shù)的內(nèi)存瞬時(shí)示意圖。圖4-4數(shù)組作為函數(shù)參數(shù)

程序結(jié)果:

2.?foreach語法

對數(shù)組進(jìn)行遍歷,除了常規(guī)的for循環(huán)之外,還有一種較為簡潔的foreach寫法,例如要輸出a數(shù)組的數(shù)組元素,寫法如下:

4.1.4二維數(shù)組

Java對二維數(shù)組的處理方式是將二維數(shù)組看成多個(gè)一維數(shù)組的一維數(shù)組。這與C語言處理二維數(shù)組的方式是相同的,但是Java的二維數(shù)組可以是m行n列的矩陣形式,也可以是不規(guī)則的矩陣形式。

1.定義形式1

例如:

int[][]a=newint[4][5];

該形式定義了一個(gè)4行5列的二維數(shù)組,可以將這個(gè)二維數(shù)組(圖4-6)看成一個(gè)具有4個(gè)元素的一維數(shù)組,每個(gè)元素又是一個(gè)一維數(shù)組,每個(gè)一維數(shù)組具有5個(gè)元素。

a[0]、a[1]、a[2]、a[3]分別是這4個(gè)一維數(shù)組的數(shù)組名。

這樣的定義是兼容了C語言的二維數(shù)組定義方式,該語句被執(zhí)行,就得到了20個(gè)元素,如圖4-6所示。

圖4-6Java二維數(shù)組形式

2.定義形式2

定義的時(shí)候只說明有幾個(gè)一維數(shù)組,即說明有幾行,但是每行有幾列不說明,之后再對每個(gè)一維數(shù)組進(jìn)行初始化,例如:

int[][]a=newint[4][];

a[0]=newint[4];

a[1]=newint[3];...

Java的這種處理方式,能定義出不規(guī)則的二維數(shù)組,如圖4-7所示。

圖4-7Java不規(guī)則二維數(shù)組

形成上述二維數(shù)組結(jié)構(gòu)的程序段如下:

int[][]a=newint[4][];

a[0]=newint[4];

a[1]=newint[3];

a[2]=newint[5];

a[3]=newint[2];

3.二維數(shù)組的遍歷

對于二維數(shù)組的遍歷,與C語言類似,需要使用嵌套循環(huán)來完成,外層循環(huán)是對行進(jìn)行遍歷,內(nèi)存循環(huán)是對每行的各列進(jìn)行遍歷。

程序結(jié)果:

程序結(jié)果:

4.1.5Arrays類

數(shù)組是程序設(shè)計(jì)中必不可少的數(shù)據(jù)結(jié)構(gòu)。為了減輕Java程序員的工作量,對數(shù)組(主要是基本數(shù)據(jù)類型數(shù)組)的很多常用操作已經(jīng)寫好并放在java.util包中的Arrays類的成員函數(shù)中了。該類的這些函數(shù)主要完成以下數(shù)組操作:

1.?dāng)?shù)組的排序

例如:

inta[]={2,5,3,8,4};

Arrays.sort(a);

說明:

(1)調(diào)用Arrays類中的靜態(tài)函數(shù)sort對a數(shù)組從小到大進(jìn)行排序。

(2)只有升序排序,無降序排序。

2.?dāng)?shù)組元素的定位查找

例如:

intfind;

int[]a={2,3,4,5,8};

find=Arrays.binarySearch(a,8);

說明:

(1)對a數(shù)組進(jìn)行二分查詢,查找8這個(gè)數(shù)字是否在a數(shù)組中出現(xiàn)。

(2)如果沒有出現(xiàn),則返回-1;如果出現(xiàn),則返回出現(xiàn)的下標(biāo)。

(3)要求a數(shù)組有序才能進(jìn)行二分查詢。

3.?dāng)?shù)組元素的顯示

例如:

int[]a={2,5,3,8,4};

StringaString=Arrays.toString(a);

System.out.println(aString);

說明:可以使用Arrays的toString方法快速顯示數(shù)組的全部內(nèi)容,包括對二維數(shù)組也可以。

程序結(jié)果:

4.2字符串

4.2.1字符串基本概念字符串就是用雙引號括起來的一串字符,如字符串常量"HelloJava"。C語言中的字符串保存在字符數(shù)組中,如“chara[10]={"abcXY123"};”定義了一個(gè)10個(gè)元素的字符數(shù)組,用以保存"abcXY123"字符串常量,并以'\0'字符作為結(jié)束標(biāo)記,其在內(nèi)存中的示意圖如圖4-8所示。

圖4-8C語言數(shù)組在內(nèi)存的示意圖

程序結(jié)果:

C語言對字符串的處理,主要使用的是string.h頭文件里的字符串處理函數(shù);其次是對字符串?dāng)?shù)組遍歷,在遍歷過程中進(jìn)行處理。標(biāo)準(zhǔn)C語言的字符串處理函數(shù)大概有20多個(gè),常用的函數(shù)如表4-1所示。

對于程序示例4-7,Java只需要下列3句就完成了:

Strings="abcXY123";

s=s.toUpperCase();

System.out.println(s);

(1)定義一個(gè)字符串對象s,將"abcXY123"保存在s對象中。

(2)調(diào)用字符串對象的成員函數(shù),將字符串中小寫字母全部轉(zhuǎn)換為大寫字母。

(3)輸出字符串對象的內(nèi)容。

4.2.2String類

1.String類對象的初始化

String類對象的初始化主要有以下幾種方式:

(1)“Strings="abcXY123";”是最為常用且比較方便的定義及初始化字符串對象的方式,字符串對象s保存了"abcXY123"字符串字面值。

(2)從char數(shù)組構(gòu)建出String類對象。

(3)從byte數(shù)組構(gòu)建出String類對象。

(4)從另外一個(gè)String類對象構(gòu)建出String類對象。

程序結(jié)果:

2.String類對象的成員函數(shù)

String類對象具有很多成員函數(shù),使用這些成員函數(shù)能夠很方便地完成各種字符串處理操作。常用的成員函數(shù)如表4-2所示(其它沒在表里的函數(shù)請查閱JDK幫助文檔)。

程序示例4-9從鍵盤輸入一個(gè)字符串給s2,判斷該字符串在指定字符串s1中是否出現(xiàn),如果出現(xiàn),計(jì)算次數(shù)。

算法分析:判斷子字符串的函數(shù),通過查詢幫助文檔,發(fā)現(xiàn)可以使用indexOf這個(gè)函數(shù)。對于子字符串,該函數(shù)有兩種形式。

①?intindexOf(String

str):返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。

②?intindexOf(String

str,int

fromIndex):返回指定子字符串在此字符串中第一次出現(xiàn)處的索引,從指定的索引開始。

程序結(jié)果:

3.字符串處理示例

1)字符串比較

程序結(jié)果:

程序分析:

(1)使用“==”比較的是String類型引用變量的值,引用變量保存的是地址,類似于指針變量,所以“==”比較的實(shí)際上是地址;而使用equals函數(shù)比較的是字符串的內(nèi)容。

(2)?s1、s2使用new在堆內(nèi)存中生成的String類對象,不管內(nèi)容如何,地址肯定不一樣。

(3)從程序結(jié)果可以看出來只有s3和s4是相等的,說明s3和s4指向的是同一個(gè)地址,如圖4-9所示。圖4-9字符串常量池

2)字符串的篩選

程序示例4-11從鍵盤輸入一個(gè)字符串給s2,將s2中的數(shù)字字符連接到s1后面。

程序結(jié)果:

4.2.3StringBuffer和StringBuilder

溫馨提示

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

最新文檔

評論

0/150

提交評論