版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第四章Java數(shù)組與字符串4.1數(shù)組4.2字符串本章小結(jié)
4.1數(shù)組
4.1.1數(shù)組的基本概念數(shù)組是一組類(lèi)型相同、在內(nèi)存中連續(xù)存放的數(shù)據(jù)集合。數(shù)組中的每個(gè)數(shù)據(jù)稱(chēng)為一個(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)識(shí),下標(biāo)索引i從0開(kāi)始,到9結(jié)束,a[i]是a數(shù)組的第i+1個(gè)數(shù)組元素,i必須在0~n-1之間(n是a數(shù)組的長(zhǎng)度)。如果i>=n或者i<0,在Java中都屬于越界行為,是不允許的,程序會(huì)終止運(yùn)行并報(bào)異常。
(3)數(shù)組一旦定義長(zhǎng)度n,就不可改變長(zhǎng)度(數(shù)組的容量固定)。
4.1.2數(shù)組的定義與初始化
1.?C語(yǔ)言的數(shù)組情況
Java的數(shù)組與C語(yǔ)言的具有很多不同,首先來(lái)看一下C語(yǔ)言中對(duì)數(shù)組的定義,例如定義一個(gè)數(shù)組為“inta[5];”,內(nèi)存如圖4-2所示。圖4-2C語(yǔ)言數(shù)組示意圖
C語(yǔ)言數(shù)組的語(yǔ)法規(guī)則:
(1)?a是數(shù)組名,代表了這個(gè)數(shù)組的首地址,是一個(gè)不可改變的量,不能對(duì)a進(jìn)行賦值。
(2)“inta[5];”定義之后,就可以對(duì)a數(shù)組的各個(gè)元素進(jìn)行賦值和運(yùn)算了。
(3)可以在定義的時(shí)候整體賦值,即“inta[5]={1,2,3,4,5};”,而定義之后就只能夠?qū)?shù)組的單個(gè)元素進(jìn)行賦值操作。
(4)?C語(yǔ)言對(duì)于數(shù)組的下標(biāo)越界的處理態(tài)度是“后果自負(fù)”。
2.?Java的數(shù)組情況
Java的數(shù)組定義語(yǔ)句為
int[]a=newint[5];
(1)等號(hào)左邊定義了一個(gè)整數(shù)數(shù)組類(lèi)型(int[]視為一個(gè)類(lèi)型)的變量a。a是數(shù)組名,同時(shí)a的本質(zhì)是一個(gè)引用變量,類(lèi)似于一個(gè)能夠指向整數(shù)數(shù)組的指針變量。既然是變量,就可以對(duì)a進(jìn)行賦值操作,讓它指向另外一個(gè)整數(shù)數(shù)組,即“a=b;”。
(2)等號(hào)右邊使用new在內(nèi)存中分配了一段空間,即5*4→20字節(jié),a就指向該內(nèi)存空間的首地址。
(3)?Java在定義a數(shù)組的時(shí)候也可以使用花括號(hào)進(jìn)行數(shù)組的初始化:
int[]b={1,2,3,4,5}; //根據(jù)花括號(hào)里面的值,b的長(zhǎng)度為5
(4)整體賦值只能發(fā)生在定義的時(shí)候,定義語(yǔ)句之后就只能對(duì)b的單個(gè)元素進(jìn)行賦值。
(5)該數(shù)組在內(nèi)存中的情況與上述C語(yǔ)言的一致,如圖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語(yǔ)言中也有堆內(nèi)存的概念。在標(biāo)準(zhǔn)C語(yǔ)言中,使用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定義的對(duì)象、數(shù)組等存放在堆內(nèi)存空間中。堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因?yàn)樗窃谶\(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存的。Java的堆內(nèi)存是由Java的垃圾回收機(jī)制*來(lái)負(fù)責(zé)的,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù),釋放內(nèi)存。其缺點(diǎn)是由于要在運(yùn)行時(shí)動(dòng)態(tài)管理內(nèi)存,需要消耗一定的資源,對(duì)程序速度有一定影響。
程序結(jié)果:
4.1.3數(shù)組遍歷
1.數(shù)組的遍歷
數(shù)組的遍歷即對(duì)數(shù)組的每個(gè)元素訪(fǎng)問(wèn)一次,這是數(shù)組最常見(jiàn)的操作,一般是用for循環(huán)進(jìn)行,采用三個(gè)表達(dá)式的形式,i從0開(kāi)始步進(jìn)變化到n-1。
程序結(jié)果:
程序示例4-3對(duì)程序示例4-1進(jìn)行改造,將上述程序的功能寫(xiě)成一個(gè)函數(shù)。
函數(shù)的功能是對(duì)傳入的整數(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語(yǔ)法
對(duì)數(shù)組進(jìn)行遍歷,除了常規(guī)的for循環(huán)之外,還有一種較為簡(jiǎn)潔的foreach寫(xiě)法,例如要輸出a數(shù)組的數(shù)組元素,寫(xiě)法如下:
4.1.4二維數(shù)組
Java對(duì)二維數(shù)組的處理方式是將二維數(shù)組看成多個(gè)一維數(shù)組的一維數(shù)組。這與C語(yǔ)言處理二維數(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語(yǔ)言的二維數(shù)組定義方式,該語(yǔ)句被執(zhí)行,就得到了20個(gè)元素,如圖4-6所示。
圖4-6Java二維數(shù)組形式
2.定義形式2
定義的時(shí)候只說(shuō)明有幾個(gè)一維數(shù)組,即說(shuō)明有幾行,但是每行有幾列不說(shuō)明,之后再對(duì)每個(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ù)組的遍歷
對(duì)于二維數(shù)組的遍歷,與C語(yǔ)言類(lèi)似,需要使用嵌套循環(huán)來(lái)完成,外層循環(huán)是對(duì)行進(jìn)行遍歷,內(nèi)存循環(huán)是對(duì)每行的各列進(jìn)行遍歷。
程序結(jié)果:
程序結(jié)果:
4.1.5Arrays類(lèi)
數(shù)組是程序設(shè)計(jì)中必不可少的數(shù)據(jù)結(jié)構(gòu)。為了減輕Java程序員的工作量,對(duì)數(shù)組(主要是基本數(shù)據(jù)類(lèi)型數(shù)組)的很多常用操作已經(jīng)寫(xiě)好并放在java.util包中的Arrays類(lèi)的成員函數(shù)中了。該類(lèi)的這些函數(shù)主要完成以下數(shù)組操作:
1.?dāng)?shù)組的排序
例如:
inta[]={2,5,3,8,4};
Arrays.sort(a);
說(shuō)明:
(1)調(diào)用Arrays類(lèi)中的靜態(tài)函數(shù)sort對(duì)a數(shù)組從小到大進(jìn)行排序。
(2)只有升序排序,無(wú)降序排序。
2.?dāng)?shù)組元素的定位查找
例如:
intfind;
int[]a={2,3,4,5,8};
find=Arrays.binarySearch(a,8);
說(shuō)明:
(1)對(duì)a數(shù)組進(jìn)行二分查詢(xún),查找8這個(gè)數(shù)字是否在a數(shù)組中出現(xiàn)。
(2)如果沒(méi)有出現(xiàn),則返回-1;如果出現(xiàn),則返回出現(xiàn)的下標(biāo)。
(3)要求a數(shù)組有序才能進(jìn)行二分查詢(xún)。
3.?dāng)?shù)組元素的顯示
例如:
int[]a={2,5,3,8,4};
StringaString=Arrays.toString(a);
System.out.println(aString);
說(shuō)明:可以使用Arrays的toString方法快速顯示數(shù)組的全部?jī)?nèi)容,包括對(duì)二維數(shù)組也可以。
程序結(jié)果:
4.2字符串
4.2.1字符串基本概念字符串就是用雙引號(hào)括起來(lái)的一串字符,如字符串常量"HelloJava"。C語(yǔ)言中的字符串保存在字符數(shù)組中,如“chara[10]={"abcXY123"};”定義了一個(gè)10個(gè)元素的字符數(shù)組,用以保存"abcXY123"字符串常量,并以'\0'字符作為結(jié)束標(biāo)記,其在內(nèi)存中的示意圖如圖4-8所示。
圖4-8C語(yǔ)言數(shù)組在內(nèi)存的示意圖
程序結(jié)果:
C語(yǔ)言對(duì)字符串的處理,主要使用的是string.h頭文件里的字符串處理函數(shù);其次是對(duì)字符串?dāng)?shù)組遍歷,在遍歷過(guò)程中進(jìn)行處理。標(biāo)準(zhǔn)C語(yǔ)言的字符串處理函數(shù)大概有20多個(gè),常用的函數(shù)如表4-1所示。
對(duì)于程序示例4-7,Java只需要下列3句就完成了:
Strings="abcXY123";
s=s.toUpperCase();
System.out.println(s);
(1)定義一個(gè)字符串對(duì)象s,將"abcXY123"保存在s對(duì)象中。
(2)調(diào)用字符串對(duì)象的成員函數(shù),將字符串中小寫(xiě)字母全部轉(zhuǎn)換為大寫(xiě)字母。
(3)輸出字符串對(duì)象的內(nèi)容。
4.2.2String類(lèi)
1.String類(lèi)對(duì)象的初始化
String類(lèi)對(duì)象的初始化主要有以下幾種方式:
(1)“Strings="abcXY123";”是最為常用且比較方便的定義及初始化字符串對(duì)象的方式,字符串對(duì)象s保存了"abcXY123"字符串字面值。
(2)從char數(shù)組構(gòu)建出String類(lèi)對(duì)象。
(3)從byte數(shù)組構(gòu)建出String類(lèi)對(duì)象。
(4)從另外一個(gè)String類(lèi)對(duì)象構(gòu)建出String類(lèi)對(duì)象。
程序結(jié)果:
2.String類(lèi)對(duì)象的成員函數(shù)
String類(lèi)對(duì)象具有很多成員函數(shù),使用這些成員函數(shù)能夠很方便地完成各種字符串處理操作。常用的成員函數(shù)如表4-2所示(其它沒(méi)在表里的函數(shù)請(qǐng)查閱JDK幫助文檔)。
程序示例4-9從鍵盤(pán)輸入一個(gè)字符串給s2,判斷該字符串在指定字符串s1中是否出現(xiàn),如果出現(xiàn),計(jì)算次數(shù)。
算法分析:判斷子字符串的函數(shù),通過(guò)查詢(xún)幫助文檔,發(fā)現(xiàn)可以使用indexOf這個(gè)函數(shù)。對(duì)于子字符串,該函數(shù)有兩種形式。
①?intindexOf(String
str):返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。
②?intindexOf(String
str,int
fromIndex):返回指定子字符串在此字符串中第一次出現(xiàn)處的索引,從指定的索引開(kāi)始。
程序結(jié)果:
3.字符串處理示例
1)字符串比較
程序結(jié)果:
程序分析:
(1)使用“==”比較的是String類(lèi)型引用變量的值,引用變量保存的是地址,類(lèi)似于指針變量,所以“==”比較的實(shí)際上是地址;而使用equals函數(shù)比較的是字符串的內(nèi)容。
(2)?s1、s2使用new在堆內(nèi)存中生成的String類(lèi)對(duì)象,不管內(nèi)容如何,地址肯定不一樣。
(3)從程序結(jié)果可以看出來(lái)只有s3和s4是相等的,說(shuō)明s3和s4指向的是同一個(gè)地址,如圖4-9所示。圖4-9字符串常量池
2)字符串的篩選
程序示例4-11從鍵盤(pán)輸入一個(gè)字符串給s2,將s2中的數(shù)字字符連接到s1后面。
程序結(jié)果:
4.2.3StringBuffer和StringBuilder類(lèi)
上一節(jié)的程序中有“s1=s1+c;”這樣的字符串拼接操作,一定要注意Java的這個(gè)知識(shí)點(diǎn),即字符串是不可變的字符串序列,任何對(duì)字符串的修改都會(huì)產(chǎn)生新的字符串,然后原字符串引用變量再指向新的字符串。字符串修改包括插入字符、字符串連接、刪除字符等操作。如果對(duì)String類(lèi)對(duì)象頻繁使用修改操作就會(huì)在內(nèi)存中出現(xiàn)每次修改后的新字符串,這樣會(huì)導(dǎo)致內(nèi)存消耗增加,并且效率很低。Java提供了StringBuffer和StringBuilder類(lèi)兩個(gè)類(lèi)來(lái)解決該問(wèn)題,它們可以看成是String類(lèi)的補(bǔ)充。
StringBuffer和StringBuilder類(lèi)提供的方法基本相同,主要是append和insert方法,對(duì)字符串進(jìn)行添加和插入操作。StringBuilder類(lèi)作為可變的字符序列是5.0版新增的,被設(shè)計(jì)用作StringBuffer的一個(gè)簡(jiǎn)易替換;此類(lèi)提供一個(gè)與StringBuffer兼容的API,但不保證同步,在字符串緩沖區(qū)被單個(gè)線(xiàn)程使用的時(shí)候使用(這種情況很普遍);建議優(yōu)先采用該類(lèi),因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中,它比StringBuffer效率要高。
程序結(jié)果:
程序分析:
(1)語(yǔ)句“String[]st=s.split("-");”使用“-”對(duì)s字符串進(jìn)行分隔,形成字符串?dāng)?shù)組返回給st,st里的字符串元素為[adaf,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 航空航天采購(gòu)合同協(xié)議書(shū)
- 沈陽(yáng)理工大學(xué)《C++程序設(shè)計(jì)》2022-2023學(xué)年期末試卷
- 2024居間合同樣本
- 2024試用期內(nèi)是否要簽合同
- 2024中外合資經(jīng)營(yíng)企業(yè)合同制造廠
- 2024家裝裝修的合同范本
- 糖尿病蛋白質(zhì)的攝入
- 4人合伙人協(xié)議書(shū)(2篇)
- 租賃協(xié)議書(shū)(2篇)
- 關(guān)于銀行實(shí)習(xí)日記模板匯編六篇
- 北京市海淀區(qū)2024-2025學(xué)年高三第一學(xué)期期中練習(xí)語(yǔ)文試卷含答案
- 江蘇省徐州市銅山區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期中英語(yǔ)試卷(含答案解析)
- 大數(shù)據(jù)處理服務(wù)合同
- 劉潤(rùn)年度演講2024
- 數(shù)學(xué)說(shuō)題稿(共4頁(yè))
- 門(mén)球協(xié)會(huì)章程
- 應(yīng)急管理試題庫(kù)
- 緣起、流變與現(xiàn)狀:當(dāng)前中國(guó)古詩(shī)詞藝術(shù)歌曲的發(fā)展思考
- 2020行政事業(yè)單位審計(jì)報(bào)告(最新)
- 工地觀摩學(xué)習(xí)心得體會(huì)三篇
- FZT01002_印染企業(yè)綜合能耗計(jì)算辦法及基本定額
評(píng)論
0/150
提交評(píng)論