Java程序設計基礎 課件 第4章 Java數組與字符串_第1頁
Java程序設計基礎 課件 第4章 Java數組與字符串_第2頁
Java程序設計基礎 課件 第4章 Java數組與字符串_第3頁
Java程序設計基礎 課件 第4章 Java數組與字符串_第4頁
Java程序設計基礎 課件 第4章 Java數組與字符串_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第四章Java數組與字符串4.1數組4.2字符串本章小結

4.1數組

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

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

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

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

4.1.2數組的定義與初始化

1.?C語言的數組情況

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

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

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

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

(3)可以在定義的時候整體賦值,即“inta[5]={1,2,3,4,5};”,而定義之后就只能夠對數組的單個元素進行賦值操作。

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

2.?Java的數組情況

Java的數組定義語句為

int[]a=newint[5];

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

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

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

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

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

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

3.棧內存與堆內存

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

1)棧內存

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

2)堆內存

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

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

程序結果:

4.1.3數組遍歷

1.數組的遍歷

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

程序結果:

程序示例4-3對程序示例4-1進行改造,將上述程序的功能寫成一個函數。

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

圖4-4數組作為函數參數

具體的內存示意圖如圖4-5所示,該圖是main函數調用fun函數的內存瞬時示意圖。圖4-4數組作為函數參數

程序結果:

2.?foreach語法

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

4.1.4二維數組

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

1.定義形式1

例如:

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

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

a[0]、a[1]、a[2]、a[3]分別是這4個一維數組的數組名。

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

圖4-6Java二維數組形式

2.定義形式2

定義的時候只說明有幾個一維數組,即說明有幾行,但是每行有幾列不說明,之后再對每個一維數組進行初始化,例如:

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

a[0]=newint[4];

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

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

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

形成上述二維數組結構的程序段如下:

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

a[0]=newint[4];

a[1]=newint[3];

a[2]=newint[5];

a[3]=newint[2];

3.二維數組的遍歷

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

程序結果:

程序結果:

4.1.5Arrays類

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

1.數組的排序

例如:

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

Arrays.sort(a);

說明:

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

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

2.數組元素的定位查找

例如:

intfind;

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

find=Arrays.binarySearch(a,8);

說明:

(1)對a數組進行二分查詢,查找8這個數字是否在a數組中出現。

(2)如果沒有出現,則返回-1;如果出現,則返回出現的下標。

(3)要求a數組有序才能進行二分查詢。

3.數組元素的顯示

例如:

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

StringaString=Arrays.toString(a);

System.out.println(aString);

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

程序結果:

4.2字符串

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

圖4-8C語言數組在內存的示意圖

程序結果:

C語言對字符串的處理,主要使用的是string.h頭文件里的字符串處理函數;其次是對字符串數組遍歷,在遍歷過程中進行處理。標準C語言的字符串處理函數大概有20多個,常用的函數如表4-1所示。

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

Strings="abcXY123";

s=s.toUpperCase();

System.out.println(s);

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

(2)調用字符串對象的成員函數,將字符串中小寫字母全部轉換為大寫字母。

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

4.2.2String類

1.String類對象的初始化

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

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

(2)從char數組構建出String類對象。

(3)從byte數組構建出String類對象。

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

程序結果:

2.String類對象的成員函數

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

程序示例4-9從鍵盤輸入一個字符串給s2,判斷該字符串在指定字符串s1中是否出現,如果出現,計算次數。

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

①?intindexOf(String

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

②?intindexOf(String

str,int

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

程序結果:

3.字符串處理示例

1)字符串比較

程序結果:

程序分析:

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

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

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

2)字符串的篩選

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

程序結果:

4.2.3StringBuffer和StringBuilder類

上一節(jié)的程序中有“s1=s1+c;”這樣的字符串拼接操作,一定要注意Java的這個知識點,即字符串是不可變的字符串序列,任何對字符串的修改都會產生新的字符串,然后原字符串引用變量再指向新的字符串。字符串修改包括插入字符、字符串連接、刪除字符等操作。如果對String類對象頻繁使用修改操作就會在內存中出現每次修改后的新字符串,這樣會導致內存消耗增加,并且效率很低。Java提供了StringBuffer和StringBuilder類兩個類來解決該問題,它們可以看成是String類的補充。

StringBuffer和StringBuilder類提供的方法基本相同,主要是append和insert方法,對字符串進行添加和插入操作。StringBuilder類作為可變的字符序列是5.0版新增的,被設計用作StringBuffer的一個簡易替換;此類提供一個與StringBuffer兼容的API,但不保證同步,在字符串緩沖區(qū)被單個線程使用的時候使用(這種情況很普遍);建議優(yōu)先采用該類,因為在大多數實現中,它比StringBuffer效率要高。

程序結果:

程序分析:

(1)語句“String[]st=s.split("-");”使用“-”對s字符串進行分隔,形成字符串數組返回給st,st里的字符串元素為[adaf,

溫馨提示

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

最新文檔

評論

0/150

提交評論