- Java程序設(shè)計(jì)與實(shí)踐教程(第2版)
- 楊麗萍 王薇 張焱焱主編 北京云班科技有限公司副主編
- 1947字
- 2019-07-01 11:10:55
4.1 一維數(shù)組
前面學(xué)習(xí)的整數(shù)類(lèi)型、字符類(lèi)型等都是基本的數(shù)據(jù)類(lèi)型,通過(guò)一個(gè)變量表示一個(gè)數(shù)據(jù),這種變量被稱(chēng)為簡(jiǎn)單變量。但在實(shí)際中,經(jīng)常需要處理具有相同性質(zhì)的一批數(shù)據(jù),這時(shí)可以使用Java中的數(shù)組,即用一個(gè)變量表示一組性質(zhì)相同的數(shù)據(jù)。數(shù)組是任何一種編程語(yǔ)言不可缺少的數(shù)據(jù)類(lèi)型。
數(shù)組是相同數(shù)據(jù)類(lèi)型變量的集合,可以用一個(gè)統(tǒng)一的數(shù)組名和下標(biāo)來(lái)唯一地確定數(shù)組中的元素。數(shù)組的數(shù)據(jù)類(lèi)型可以是前面介紹的任何基本數(shù)據(jù)類(lèi)型,也可以是引用數(shù)據(jù)類(lèi)型。
另外,在Java編程語(yǔ)言中,數(shù)組(array)是一個(gè)可以動(dòng)態(tài)創(chuàng)建的對(duì)象,還可以定義數(shù)組的數(shù)組,從而實(shí)現(xiàn)多維數(shù)組的支持。
4.1.1 數(shù)組的聲明
當(dāng)聲明一個(gè)數(shù)組變量時(shí),并不是一定要建立數(shù)組本身。數(shù)組變量和實(shí)際的數(shù)組是完全不同的。
數(shù)組的聲明包含兩個(gè)部分:數(shù)組類(lèi)型和數(shù)組的名字。數(shù)組類(lèi)型是指數(shù)組中各元素的類(lèi)型,它可以是任意的Java類(lèi)型。數(shù)組的名字必須是合法的Java標(biāo)識(shí)符。聲明數(shù)組變量的方法與聲明一般變量的方法相似,只不過(guò)在變量名或類(lèi)型名后面增加一對(duì)方括號(hào)。數(shù)組聲明的語(yǔ)法格式如下:
type 數(shù)組名[];或 type [] 數(shù)組名;
例如:
char c[]; 或char[] c; long number[]; 或long [] number; float salarly[]; 或float [] salary; double doubledata[]; 或double[] doubledata;
但是,如果像下例這樣創(chuàng)建數(shù)組,將會(huì)產(chǎn)生一個(gè)編譯錯(cuò)誤。
int name[50]; //將產(chǎn)生一個(gè)編譯錯(cuò)誤
與C/C++不同,Java在數(shù)組定義時(shí)只是建立了一種數(shù)組的引用,并沒(méi)有對(duì)數(shù)組元素分配內(nèi)存、生成實(shí)例,數(shù)組元素內(nèi)存分配由new語(yǔ)句或靜態(tài)初始化完成;對(duì)數(shù)組元素進(jìn)行初始化后,才能引用數(shù)組的元素。
4.1.2 數(shù)組的創(chuàng)建
聲明數(shù)組類(lèi)型的變量并不實(shí)際地創(chuàng)建數(shù)組對(duì)象或?yàn)閿?shù)組分配任何空間,為了使用數(shù)組還需要?jiǎng)?chuàng)建數(shù)組。創(chuàng)建之后的數(shù)組,當(dāng)它不用時(shí),和其他對(duì)象一樣,并不需要在程序中顯式地釋放,而是由Java的垃圾收集器自動(dòng)回收所占的空間。
創(chuàng)建數(shù)組有兩種方法:一種是用運(yùn)算符new,另一種是用靜態(tài)的初始化方法創(chuàng)建數(shù)組。
在聲明數(shù)組后,采用new操作符創(chuàng)建數(shù)組的語(yǔ)法格式如下:
數(shù)組名=new type[n];
其中type是任意的數(shù)據(jù)類(lèi)型,但應(yīng)與聲明的類(lèi)型保持一致;n為數(shù)組元素的存儲(chǔ)空間長(zhǎng)度。例如,“s=new int[5]; ”語(yǔ)句為數(shù)組s創(chuàng)建有5個(gè)整型元素的存儲(chǔ)空間。也可以在聲明數(shù)組時(shí)直接創(chuàng)建數(shù)組,例如:
char s[]=new char[10];
或
char [] s=new char[10];
對(duì)于創(chuàng)建后的各種數(shù)據(jù)類(lèi)型的數(shù)組元素都具有默認(rèn)值,其默認(rèn)初始值如表4-1所示。
表4-1 數(shù)組元素默認(rèn)初始值

例如:
int number[]=new int[50]; //number數(shù)組的 50個(gè)int型分量初始化值為0 char s[]=new char[20]; //數(shù)組s的20個(gè)char分量初始化值為\u0000 Date datearray[]=new Date[10]; //datearray被分配10個(gè)Date類(lèi)型數(shù)據(jù)并初始化為null
用靜態(tài)的初始化方法創(chuàng)建數(shù)組的語(yǔ)法格式如下:
type 數(shù)組名={a1, a2, ..., an};
這種初始化方式適用于元素個(gè)數(shù)不多,且初始元素可以窮舉的情況,而且不必預(yù)先給出數(shù)組的大小,系統(tǒng)會(huì)自動(dòng)按照所給的初值個(gè)數(shù)算出數(shù)組的長(zhǎng)度,并為數(shù)組及其元素分配相應(yīng)的空間。例如,“int primes[]={1,3,5,7,11,13,15}; ”語(yǔ)句定義了一個(gè)含7個(gè)元素的int型數(shù)組并為7個(gè)元素分別賦了初值。
如果只為數(shù)組的其中一些元素賦值,就應(yīng)該對(duì)每個(gè)元素使用一條賦值語(yǔ)句。例如:
int primes[]=new int[100]; primes[0]=3; primes[1]=3;
第一條語(yǔ)句聲明并創(chuàng)建一個(gè)含有100個(gè)元素的整型數(shù)組,它們的初始值都為0。其后的兩條賦值語(yǔ)句為數(shù)組的前兩個(gè)元素賦值。
當(dāng)然也可以用一個(gè)已經(jīng)存在的數(shù)組初始化另一個(gè)數(shù)組。例如,聲明下列數(shù)組變量:
long even[]={2L,4L,6L,8L,10L}; long value[]=even;
在聲明語(yǔ)句中,數(shù)組even用來(lái)初始化數(shù)組value。在這里雖然建立了兩個(gè)數(shù)組變量even和value,但實(shí)際上只有一個(gè)數(shù)組對(duì)象空間。兩個(gè)數(shù)組變量引用同一組數(shù)據(jù)元素,并且可以通過(guò)任意一個(gè)變量名訪(fǎng)問(wèn)數(shù)組元素。例如,even[2]和value[2]將引用同一個(gè)元素。這種方式可用在兩個(gè)變量的引用數(shù)組需要相互切換的時(shí)候。假如現(xiàn)要對(duì)一個(gè)數(shù)組內(nèi)容進(jìn)行排序,需要在兩個(gè)數(shù)組之間重復(fù)地傳遞元素,即將源數(shù)組復(fù)制到目標(biāo)數(shù)組中。例如,聲明數(shù)組變量如下:
double inputArray[]=new double[100]; //Array1 to be sorted double[] outputArray=new double[100]; //re-ordered array double temp[]; //temporary array reference
當(dāng)希望將outputArray引用的數(shù)組轉(zhuǎn)換成一個(gè)輸入數(shù)組時(shí),可以這樣編寫(xiě):
temp=inputArray; //save referened to inputarray in temp inputArray=outputArray; //set inputarray to refer to outputarray outputArray=temp; //set outputarray to refer to what was inputarray
在這里,沒(méi)有任何數(shù)組元素被移動(dòng),只是它們?cè)趦?nèi)存中的地址被交換,所以運(yùn)行起來(lái)非常快。當(dāng)然,如果要復(fù)制一個(gè)數(shù)組,就必須創(chuàng)建一個(gè)具有同樣大小和相同類(lèi)型的新數(shù)組,然后分別將數(shù)組中的每個(gè)元素復(fù)制到新數(shù)組中。
4.1.3 數(shù)組的訪(fǎng)問(wèn)
當(dāng)定義了一個(gè)數(shù)組,并為數(shù)組及其元素分配空間和初始化后,就可以訪(fǎng)問(wèn)數(shù)組中的每一個(gè)元素了。訪(fǎng)問(wèn)數(shù)組中元素的格式如下:
數(shù)組名[index];
其中index是數(shù)組下標(biāo)。下標(biāo)的下界為0,上界為數(shù)組元素的個(gè)數(shù)減1。例如,數(shù)組a有5個(gè)元素,其元素分別為a[0]、a[1]、a[2]、a[3]、a[4]。在Java語(yǔ)言中,一個(gè)數(shù)組的大小一般是通過(guò)訪(fǎng)問(wèn)數(shù)組的length成員變量得到的。
在對(duì)數(shù)組元素進(jìn)行訪(fǎng)問(wèn)時(shí),任何使用小于0或者大于等于數(shù)組長(zhǎng)度的下標(biāo)進(jìn)行訪(fǎng)問(wèn)的操作都將產(chǎn)生IndexOutOfBoundsException(下標(biāo)越界異常)。
【例4-1】 利用一維數(shù)組求前100個(gè)素?cái)?shù)。
//文件名:PrimeNum.java public class PrimeNum{ public static void main(String args[]) { System.out.println("前100個(gè)素?cái)?shù)是:"); int n[]=new int[100]; //存儲(chǔ)素?cái)?shù) int p=1, cn=1; n[0]=2; //第一個(gè)素?cái)?shù) System.out.print(" "+n[0]); for (int k=1; k<100; ){ //求出其余的素?cái)?shù) p+=2; int j=0; boolean flag=true; while (flag && n[j]*n[j]<=p){ //判斷p是否是素?cái)?shù) if (p%n[j]==0) flag=false; j++; } if (flag==true){ System.out.print(" "+p); //p是素?cái)?shù)時(shí)保存并輸出 n[k++]=p; cn++; if (cn==10) { //控制一行輸出10個(gè)素?cái)?shù) System.out.println(); cn=0; } } } } }
- Apache Spark 2.x Machine Learning Cookbook
- UI智能化與前端智能化:工程技術(shù)、實(shí)現(xiàn)方法與編程思想
- Quarkus實(shí)踐指南:構(gòu)建新一代的Kubernetes原生Java微服務(wù)
- Go語(yǔ)言精進(jìn)之路:從新手到高手的編程思想、方法和技巧(2)
- Android嵌入式系統(tǒng)程序開(kāi)發(fā):基于Cortex-A8(第2版)
- C++ Fundamentals
- 工業(yè)機(jī)器人離線(xiàn)編程
- Mastering jQuery Mobile
- Qt 4開(kāi)發(fā)實(shí)踐
- 實(shí)戰(zhàn)Python網(wǎng)絡(luò)爬蟲(chóng)
- Yii2 By Example
- HTML5/CSS3/JavaScript技術(shù)大全
- 流暢的Python
- Learning PrimeFaces Extensions Development
- Cocos2D Game Development Essentials