Java 學(xué)習(xí)筆記(六)數(shù)組

數(shù)組

數(shù)組就是用來存儲同一個類型中若干數(shù)據(jù)的容器

定義一個變量可以存儲一個數(shù)據(jù), 定義兩個變量可以存儲2個數(shù)據(jù), 如果需要存儲50個整數(shù), 或者存儲100個小數(shù), 或者存儲20個字符串, 這種情況就可以選擇使用數(shù)組

數(shù)組的定義

  • 定義數(shù)組的語法:

    數(shù)據(jù)類型 [] 數(shù)組名 = new 數(shù)據(jù)類型[長度];

    int [] data = new int [6];

  • 或者

    數(shù)據(jù)類型 數(shù)組名 [] = new 數(shù)據(jù)類型[長度];

    double data2 [] = new double[5];

先定義數(shù)組隔崎,再給數(shù)組的元素賦值拾酝,稱為數(shù)組的動態(tài)初始化;也可以在定義數(shù)組的同時給數(shù)組的元素賦值噪猾,稱為靜態(tài)初始化

  • 靜態(tài)初始化:

    數(shù)據(jù)類型 [] 數(shù)組名 = new 數(shù)據(jù)類型 []{元素}

    int [] data3 = new int [] {1,2,3};

  • 或者

    int [] data4 = {4,5,6};

image

數(shù)組元素的訪問

定義了數(shù)組之后 ,系統(tǒng)會給每個元素指定一個索引值(下標), 通過索引值來訪問數(shù)組元素. 訪問格式為: 數(shù)組名[索引值]. 注意數(shù)組元素的索引值是從0開始的

比如 int [] data = new int [6]; 定義了存儲6個整數(shù)的數(shù)組 data

可以通過索引值向 data 中存儲6個整數(shù)

data[0] = 1;
data[1] = 2;
data[2] = 3;
data[3] = 4;
data[4] = 5;
data[5] = 6;
image

每個數(shù)組都有一個length屬性侠仇,它會返回數(shù)組的長度轻姿,可以使用它來遍歷數(shù)組的每個元素,來訪問每個元素的值

for(int i = 0; i < data.length; i++){
      System.out.println(data[i]);
}

數(shù)組做為方法的參數(shù)和返回值

數(shù)組屬于引用類型逻炊,相同類型的數(shù)組可以相互賦值

/**
 * 數(shù)組是引用類型踢代,相同類型的數(shù)組可以相互賦值
 */
public class Example01 {
    public static void main(String[] args) {
        // 定義數(shù)組,在棧區(qū)分配空間嗅骄,存儲變量名 data1胳挎,在堆區(qū)分配空間,存儲值:0 0 0 0 0 溺森,變量名存儲堆區(qū)的引用
        int [] data1 = new int[5];
        // 定義數(shù)組慕爬,在棧區(qū)分配空間,存儲變量名 data2屏积,在堆區(qū)分配空間医窿,存儲值:3 1 2 6 9 ,變量名存儲堆區(qū)的引用
        int [] data2 = {3,1,2,6,9};

        // data2 賦值給 data1炊林,data1 指向堆區(qū)data2的地址
        data1 = data2;
        // 輸出 data1 中的元素姥卢,輸出結(jié)果:3 1 2 6 9
        for (int i = 0; i < data1.length; i++) {
            System.out.print( data1[i] + " ");
        }
    }
}

數(shù)組可以做為方法的參數(shù)

/**
 * 數(shù)組可以做為方法參數(shù)
 */

public class Example02 {
    public static void main(String[] args) {
        int [] data = {11, 55, 33, 88, 66};
        printArray(data);

        int [] data2 = {6, 6, 6, 6, 6};
        printArray(data2);
     }

    // 定義方法,通過參數(shù)接收一個數(shù)組
    public static void printArray(int[] array) {
        // 遍歷數(shù)組中的元素
        for(int i = 0; i < array.length; i++){
            System.out.println(array[i]);
        }
    }
}

數(shù)組可以做為方法的返回值

/**
 * 數(shù)組可以做為方法的返回值
 */

public class Example03 {
    public static void main(String[] args) {
        // 調(diào)用方法,接收返回的數(shù)組
        int [] data = getArray(10);
        // 遍歷數(shù)組独榴,輸出數(shù)組中的元素
        for(int x : data){
            System.out.print(x + " ");
        }
        System.out.println();
        
        // 再次調(diào)用方法僧叉,給數(shù)組重新賦值
        data = getArray(5);
        // 調(diào)用Test02中的方法輸出數(shù)組中的元素
        Test02.printArray(data);
    }

    // 定義方法返回一個int類型的數(shù)組
    public static int [] getArray(int capacity){
        // 傳入的參數(shù)指定數(shù)組的長度
        int [] array = new int[capacity];
        // 給數(shù)組的各個元素賦值一個隨機數(shù)
        for(int i = 0; i < array.length; i++) {
            int num = (int)(Math.random() * 100);
            array[i] = num;
        }
        return array;
    }
}

可變長參數(shù)

作用:用來接收任意個數(shù)據(jù)

定義格式:

方法名([類型 參數(shù)名,] 類型 ... 可變長參數(shù)名){}

注意:

  1. 一個方法最多只能有一個可變長參數(shù)
  2. 可變長參數(shù)只能在參數(shù)列表的最后
/**
 * 可變長參數(shù)
 */

public class Example04 {
    public static void main(String[] args) {
        // 在調(diào)用方法是,可以傳遞任意個參數(shù)
        sum();
        sum(1);
        sum(1,2,3);
        sum(1,2,3,4,5,6);
        int [] array = {10, 20 ,30};
        sum(array);
    }

    // 定義方法棺榔,計算任意個整數(shù)的和瓶堕,需要通過參數(shù)來接收任意個整數(shù),可以通過可變長參數(shù)來實現(xiàn)
    public static void sum (int ... data) {
        // 在方法中症歇,可以把可變長參數(shù)當作數(shù)組使用
        int sum = 0;
        for (int i = 0; i < data.length; i++) {
            sum += data[i];
        }
        System.out.println("這些整數(shù)的和為: " + sum);
    }
}

數(shù)組擴容

定義數(shù)組時需要指定數(shù)組長度郎笆,即數(shù)組中能夠存儲數(shù)據(jù)的個數(shù)就已經(jīng)確定了。當數(shù)組已滿忘晤,還想向數(shù)組中存儲更多數(shù)據(jù)時宛蚓,就需要對數(shù)組進行擴容

數(shù)據(jù)擴容就是定義一個更大的數(shù)組,把原來數(shù)組的內(nèi)容復(fù)制到新數(shù)組中设塔,讓原來的數(shù)組名指向新的數(shù)組

/**
 * 數(shù)組擴容
 */

public class Example05 {
    public static void main(String[] args) {
        int [] data = {1,2,3,4,5};
        // 對數(shù)組 data 進行擴容
        // 1. 定義更大的數(shù)組
        int [] another = new int[data.length * 2];
        // 2. 把原來數(shù)組中的元素復(fù)制到新的數(shù)組中
//        for (int i = 0; i < data.length; i++) {
//            another[i] = data[i];
//        }
        // arraycopy 方法可以方便的賦值數(shù)組
        System.arraycopy(data, 0, another, 0, data.length);
        // 3. 讓原來的數(shù)組指向新的數(shù)組
        data = another;
        // 4. 遍歷數(shù)組苍息,快捷鍵 iter
        for (int x : data) {
            System.out.print(x + " ");
        }
    }

}
image

數(shù)組特點

優(yōu)點:

  • 采用順序存儲,可以通過索引值(下標)計算每個數(shù)組元素的地址壹置,訪問數(shù)速快

缺點:

  • 向數(shù)組中插入元素,刪除元素時表谊,需要復(fù)制钞护,移動大量元素,效率低

應(yīng)用場景:

  • 數(shù)組適用于訪問為主爆办,較少添加难咕,刪除元素的情況
image
/**
 * 數(shù)組插入元素
 */

public class Example06 {
    public static void main(String[] args) {
        int [] data = {34, 56, 12, 87, 49};
        data = insert(data, 2, 666);
        for (int x : data) {
            System.out.print(x + " ");
        }

    }
    // 定義方法,向array數(shù)組索引值為i的位置插入元素key
    public static int [] insert(int[] array, int i, int key) {
        // 定義新數(shù)組
        int [] another = new int[array.length + 1];
        // 把 array 數(shù)組 [0,i)范圍內(nèi)的元素復(fù)制到新數(shù)組中
        System.arraycopy(array, 0, another, 0, i);
        // 把 key 元素保存的新數(shù)組的 i 位置
        another[i] = key;
        // 把 array 數(shù)組[i, array.length) 范圍內(nèi)的元素復(fù)制到新數(shù)組從 1+1 開始的位置
        System.arraycopy(array, i, another, i + 1, array.length - i);
        // 返回新數(shù)組
        return another;
    }
}

Arrays 工具類

/**
 * Arrays 工具類常用方法
 */

public class Example07 {
    public static void main(String[] args) {
        int [] data = {11,22,88,66,77,55};

        // 調(diào)用 Arrays.toString() 把數(shù)組中的元素轉(zhuǎn)換為字符串
        System.out.println(Arrays.toString(data));

        // Arrays.sort() 對數(shù)組元素排序
        Arrays.sort(data);
        System.out.println(Arrays.toString(data));

        // Arrays.copyOf(原數(shù)組距辆,新數(shù)組長度) 復(fù)制數(shù)組
        int [] another = Arrays.copyOf(data, data.length * 2);
        System.out.println(Arrays.toString(another));
        int [] tmp = Arrays.copyOf(data, data.length / 2);
        System.out.println(Arrays.toString(tmp));
    }
}

二維數(shù)組

/**
 * 二維數(shù)組
 */

public class Example08 {
    public static void main(String[] args) {
        // 定義數(shù)組
        int [] data1 = new int[10];
        int [] data2 = {1,2,3,4,5,6};
        // 也可以這樣
        int x = 10;
        int y = 20;
        int [] data3 = {x, y};
        // 定義二維數(shù)組
        int [][] data4 = {data1, data2, data3};

        // 打印二維數(shù)組的長度余佃,輸出結(jié)果:3
        System.out.println(data4.length);

        // 遍歷二維數(shù)組
        for (int i = 0; i < data4.length; i++) {
            for (int j = 0; j < data4[i].length; j++) {
                System.out.print(data4[i][j]);
            }
            System.out.println();
        }

        // 定義二維數(shù)組時,指定二維數(shù)組的長度
        int [][] data5 = new int [5][];
        // 定義二維數(shù)組是跨算,指定每個一維數(shù)組的長度
        int [][] data6 = new int [5][7];

        // 使用 foreach 遍歷二維數(shù)組
        for (int[] ints : data4) {
            for (int xx : ints) {
                System.out.println(xx + " ");
            }
            System.out.println();
        }

        // 二維數(shù)組的靜態(tài)初始化
        int [][] data7 = new int[][]{data1, data2, data3};
        int [][] data8 = {data1, data2, data3};
        int [][] data9 = {new int[5], new int[]{1,2,3}, {4,5,6}};

        // Arrays.deepTosString() 可以把二維數(shù)組的元素轉(zhuǎn)換為字符串
        System.out.println(Arrays.deepToString(data9));
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爆土,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诸蚕,更是在濱河造成了極大的恐慌步势,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件背犯,死亡現(xiàn)場離奇詭異坏瘩,居然都是意外死亡,警方通過查閱死者的電腦和手機漠魏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門倔矾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事哪自》岚” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵提陶,是天一觀的道長烫沙。 經(jīng)常有香客問我,道長隙笆,這世上最難降的妖魔是什么锌蓄? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮撑柔,結(jié)果婚禮上瘸爽,老公的妹妹穿的比我還像新娘。我一直安慰自己铅忿,他們只是感情好剪决,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著檀训,像睡著了一般柑潦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峻凫,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天渗鬼,我揣著相機與錄音,去河邊找鬼荧琼。 笑死譬胎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的命锄。 我是一名探鬼主播堰乔,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脐恩!你這毒婦竟也來了镐侯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤驶冒,失蹤者是張志新(化名)和其女友劉穎析孽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體只怎,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡袜瞬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了身堡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邓尤。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汞扎,到底是詐尸還是另有隱情季稳,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布澈魄,位于F島的核電站景鼠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痹扇。R本人自食惡果不足惜铛漓,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲫构。 院中可真熱鬧浓恶,春花似錦、人聲如沸结笨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炕吸。三九已至伐憾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赫模,已是汗流浹背树肃。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘴瓤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓莉钙,卻偏偏與公主長得像廓脆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子磁玉,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348