官术网_书友最值得收藏!

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;
                        }
                    }
                }
            }
        }
主站蜘蛛池模板: 奇台县| 富川| 巴中市| 全州县| 柳河县| 沾益县| 灌云县| 呼玛县| 尼勒克县| 商洛市| 包头市| 峨眉山市| 商丘市| 藁城市| 章丘市| 南溪县| 军事| 湖州市| 贵州省| 萨嘎县| 利辛县| 延长县| 精河县| 米泉市| 开鲁县| 黑河市| 两当县| 新巴尔虎左旗| 三亚市| 宣汉县| 雷州市| 宁津县| 东平县| 辽宁省| 乌苏市| 连州市| 平潭县| 嘉义县| 大姚县| 老河口市| 太仓市|