5.Java數(shù)組及內(nèi)存圖

Java數(shù)組

  • 數(shù)組就是用來存儲一批同種類型數(shù)據(jù)的內(nèi)存區(qū)域(可以理解為容器)

數(shù)組的定義

靜態(tài)初始化數(shù)組

  • 定義數(shù)組的時候直接給數(shù)組賦值

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

    // 完整格式
    數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[]{元素1辑鲤,元素2,元素3……};
    
    double[] scores = new double[]{90.0, 85.5, 72.6, 66.1};
    String[] items = new String[]{'臺球', '鉛球', '足球', '排球', '羽球'};
    
    // 簡化格式
    數(shù)據(jù)類型[] 數(shù)組名 = {元素1, 元素2, 元素3……};
    
    int[] age = {12, 24, 36};
    

動態(tài)初始化數(shù)組

  • 定義數(shù)組的時候只確定元素的類型和數(shù)組的長度好啰,之后再存入具體的數(shù)據(jù)

  • 動態(tài)初始化格式

    數(shù)據(jù)類型[] 數(shù)組名 = new 數(shù)據(jù)類型[長度];
    
    int[] array = new int[3];
    
    //后賦值
    arr[0] = 10;
    System.out.println(arr[0]);       // 10
    

數(shù)組的訪問

  • 數(shù)組名稱[索引]

    數(shù)組的索引從0開始

  • 數(shù)組的長度屬性:length

    數(shù)組名.length // 獲取數(shù)組的長度

  • 數(shù)組的最大索引表示:

    數(shù)組名.length - 1 // 前提:數(shù)組的元素個數(shù)大于1

元素默認規(guī)則

數(shù)據(jù)類型 明細 默認值
基本類型 byte爆惧,short夺脾,char,int丐重,long 0
float怒见,double 0.0
boolean false
引用類型 類,接口禽车,數(shù)組寇漫,String null

數(shù)組的遍歷

  • 遍歷就是對所有數(shù)據(jù)按照一定規(guī)則一個一個的訪問

  • 如何遍歷數(shù)組的元素:關(guān)鍵在于數(shù)組長度作為循環(huán)條件,初始化語句決定著從第幾個元素開始遍歷殉摔,步進語句決定著循環(huán)的元素間隔州胳,靈活使用可以實現(xiàn)從某個元素開始遍歷,每三個遍歷一次等操作

    int[] ages = {20, 30, 40, 50};
    for (int i = 0; i < ages.length; i++) {
        System.out.println(ages[i]);
    }
    

元素交換

  • 創(chuàng)建中間變量進行交換

    void swapr(int &a, int &b) {
        int temp = a;
        a = b;
        b = a;
    }
    
  • 使用異或運算特性進行交換

    void swapr(int &a, int &b) {
        a ^= b;
        b ^= a;
        a ^= b;
    }
    

數(shù)組的內(nèi)存圖

  • 數(shù)組的基本原理:在堆內(nèi)存你中為數(shù)組開辟一片連續(xù)的內(nèi)存空間且分配地址逸月,并劃分成多個相等的空間用于裝載元素栓撞,數(shù)組變量名通過獲取地址實現(xiàn)對內(nèi)存塊中元素的交互
  • 數(shù)組變量名中存儲的是數(shù)組在內(nèi)存中的地址,即打印數(shù)組變量名會得到該數(shù)組的地址碗硬,首字母為數(shù)組數(shù)據(jù)類型首字母瓤湘,其后的數(shù)字為十六進制數(shù)表示的地址。數(shù)組是引用類型

Java內(nèi)存分配介紹

  • 棧:方法運行時所進入的內(nèi)存肛响;變量也在此
  • 堆:new出的內(nèi)容(對象)會在此內(nèi)存開辟空間并產(chǎn)生地址
  • 方法區(qū):字節(jié)碼文件加載時進入的內(nèi)存
  • 本地方法棧
  • 寄存器

例子:

image.png

兩個數(shù)組變量指向同一個數(shù)組對象岭粤,對數(shù)組對象的修改會引起兩個數(shù)組變量同時發(fā)生變化

image.png

其他注意事項

  • “數(shù)據(jù)類型[] 數(shù)組名” 也可以寫成 “數(shù)據(jù)類型 數(shù)組名[]”
  • Java是強類型語言,嚴格要求什么類型的數(shù)組存放什么類型的數(shù)據(jù)特笋,否則報錯
  • 數(shù)組一旦被定義出來,程序的執(zhí)行過程中巾兆,長度和類型就固定了猎物,就不可以更改
  • 動態(tài)靜態(tài)的含義在于數(shù)組元素是否后期動態(tài)裝載:

    • 當前已經(jīng)知道存入的元素值,用靜態(tài)初始化

    • 當前還不清楚要存入哪些數(shù)據(jù)角塑,用動態(tài)初始化

  • 數(shù)組索引越界異常(ArrayIndexOutOfBoundsException):訪問的元素位置超過最大索引
  • 空指針異常(NullPointerException):數(shù)組變量中沒有存儲數(shù)組的地址蔫磨,而是null

數(shù)組常見應(yīng)用

常見應(yīng)用:

  • 元素求和
  • 求最值
  • 猜數(shù)字
  • 隨機排名
  • 冒泡排序
package com.java.test;

/**
 * 數(shù)組的常見應(yīng)用:
 * 1. 元素求和
 * 2. 求最值
 * 3. 猜數(shù)字游戲
 * 4. 隨機排名
 * 5. 數(shù)組排序
 */
public class ArrayCase {
    public static void main(String[] args) {
        
        //1. 元素求和
        //某部門5名員工的銷售額分別是:16,26圃伶,36堤如,6,100窒朋,請計算出他們部門的總銷售額
        int[] arr1 = new int[]{16, 26, 36, 6, 100};
        for (int i = 0; i < arr1.length; i++) {
            arr1[i] += arr1[i];
        }
        System.out.println("部門的總銷售額:" + arr1[arr1.length - 1]);

        System.out.println("------------------------------------------");

        //2. 求最值
        //給定一組數(shù)據(jù)求最值
        int[] arr2 = new int[]{15, 36, 72, 85, 61, -2, 99};
        int max = arr2[0];
        int min = arr2[0];
        for (int i = 1; i < arr2.length; i++) {
            if (arr2[i] > max) {
                max = arr2[i];
            }
            if (arr2[i] < min) {
                min = arr2[i];
            }
        }
        System.out.println("最大值:" + max + '\n' + "最小值:" + min);

        System.out.println("------------------------------------------");

        //3. 猜數(shù)字游戲
        //游戲規(guī)則:生成[1-20]之間的5個數(shù)(可重復)搀罢,未猜中提示“未命中”并繼續(xù)猜測
        // 猜中提示猜中并輸出該數(shù)第一次出現(xiàn)的位置,然后輸出全部5個數(shù)據(jù)侥猩,結(jié)束游戲
        Random r = new Random();
        Scanner sc = new Scanner(System.in);
        int[] arr3 = new int[5];
        for (int i = 0; i < 5; i++) {
            arr3[i] = r.nextInt(20) + 1;
        }


        demo:
        //創(chuàng)建一個break的結(jié)束標簽demo
        while (true) {
            System.out.println("請合法輸入位于[1,20]的任意數(shù)進行猜測榔至!");
            int num = sc.nextInt();

            for (int i = 0; i < arr3.length; i++) {
                if (num == arr3[i]) {
                    System.out.println("您猜對了!");
                    System.out.println("您猜對的數(shù)處于數(shù)組中的第" + (i + 1) + "個");
                    for (int m = 0; m < arr3.length; m++) {
                        System.out.print(arr3[m] + "\t");
                        System.out.println();
                    }
                    break demo;
                }
            }
            System.out.println("您猜測的數(shù)據(jù)不在數(shù)組當中欺劳,請重新猜測唧取!");
            System.out.println("--------------------------------------");

        }

        System.out.println("--------------------------------------");



        //4. 隨機排名
        //有五個人需要進行演講铅鲤,請打亂他們的順序,利用隨機保證公平性
        int[] arr4 = new int[5];
        Scanner in = new Scanner(System.in);
        Random rand = new Random();

        for (int i = 0; i < arr4.length; i++) {
            System.out.println("請輸入第" + (i + 1) + "位演講者的編號:");
            arr4[i] = in.nextInt();
        }

        for (int i = 0; i < arr4.length; i++) {
            int index = rand.nextInt(arr4.length);

            int temp = arr4[index];
            arr4[index] = arr4[i];
            arr4[i] = temp;
        }

        for (int i = 0; i < arr4.length; i++) {
            System.out.print(arr4[i] + "\t");
        }
        

        System.out.println("--------------------------------------");

        //5. 數(shù)組排序
        //給定一組數(shù)據(jù)進行升序排序枫弟,算法指定:冒泡排序
        int[] arr5 = new int[]{5, 2, 3, 1};
        //                     0  1  2  3

        //定義一個循環(huán)控制比較的輪數(shù)
        for (int i = 0; i < arr5.length - 1; i++) {
            /*
                i == 1  比較的次數(shù) 3 j = 0 1 2
                i == 2  比較的次數(shù) 2 j = 0 1
                i == 3  比較的次數(shù) 1 j = 0
             */

            //定義一個循環(huán)控制每輪比較的次數(shù)邢享,占位
            for (int j = 0; j < arr5.length - i; j++) {
                // 判斷當前位置的元素值,是否大于后一個位置淡诗,若較大驼仪,則交換
                if (arr5[j] > arr5[j + 1]) {
                    int temp = arr5[j + 1];
                    arr5[j + 1] = arr5[j];
                    arr5[j] = temp;
                }
            }
        }
    }
}

數(shù)組排序

  • 數(shù)組排序的技術(shù)
    • 冒泡排序
    • 選擇排序
    • 快速排序
    • 插入排序
    • ……
  • 數(shù)組搜索相關(guān)技術(shù)
    • 二分搜索
    • 分塊查找
    • 哈希表查找
    • ……

冒泡排序(面試熱點)

  • 思想:

    • 從頭開始兩兩比較,把較大的元素與較小的元素進行交換
    • 每輪把當前最大的一個元素存入到數(shù)組當前的末尾
  • 實現(xiàn)冒泡排序的關(guān)鍵步驟分析:

    • 確定排序總共需要幾輪:數(shù)組的長度 - 1
    • 每輪比較幾次:數(shù)組的長度 - i(隨著輪數(shù)i增多而遞減)
  • 冒泡排序的實現(xiàn)步驟

    • 定義一個外部循環(huán)控制總共需要冒幾輪(數(shù)組的長度 - 1)

    • 定義一個內(nèi)部循環(huán)袜漩,控制每輪依次往后比較幾個位置(數(shù)組的長度 - i)

      注意 绪爸,如果從0開始循環(huán),此處的上界應(yīng)該是:數(shù)組的長度 - i - 1

    • 如果當前位置的元素值大于后一個位置的元素值宙攻,兩者交換

  • 例子:

    package com.java.test;
    
    import java.util.Scanner;
    
    public class BubbleSort {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            System.out.println("請輸入?yún)⒓用芭菖判虻恼麛?shù)的個數(shù):");
            int sum = in.nextInt();
            System.out.println("請輸入這" + sum + "個數(shù):");
            int[] arr = new int[sum];
            for (int i = 0; i < arr.length; i++) {
                arr[i] = in.nextInt();
            }
            for (int i = 0; i < arr.length - 1; i++) {
                for (int j = 0; j < arr.length - i - 1; j++) {
                    if (arr[j] > arr[j + 1]) {
                        arr[j] ^= arr[j + 1];
                        arr[j + 1] ^= arr[j];
                        arr[j] ^= arr[j + 1];
                    }
                }
            }
            System.out.println("排序后數(shù)組遍歷結(jié)果");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "\t");
            }
        }
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奠货,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子座掘,更是在濱河造成了極大的恐慌递惋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溢陪,死亡現(xiàn)場離奇詭異萍虽,居然都是意外死亡,警方通過查閱死者的電腦和手機形真,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門杉编,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咆霜,你說我怎么就攤上這事邓馒。” “怎么了蛾坯?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脉课。 經(jīng)常有香客問我救军,道長,這世上最難降的妖魔是什么倘零? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任唱遭,我火速辦了婚禮,結(jié)果婚禮上视事,老公的妹妹穿的比我還像新娘胆萧。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布跌穗。 她就那樣靜靜地躺著订晌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚌吸。 梳的紋絲不亂的頭發(fā)上锈拨,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音羹唠,去河邊找鬼奕枢。 笑死,一個胖子當著我的面吹牛佩微,可吹牛的內(nèi)容都是我干的缝彬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼哺眯,長吁一口氣:“原來是場噩夢啊……” “哼谷浅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奶卓,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤一疯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后夺姑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墩邀,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年盏浙,在試婚紗的時候發(fā)現(xiàn)自己被綠了眉睹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡只盹,死狀恐怖辣往,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情殖卑,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布坊萝,位于F島的核電站孵稽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏十偶。R本人自食惡果不足惜菩鲜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惦积。 院中可真熱鬧接校,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诽凌,卻和暖如春毡熏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侣诵。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工痢法, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杜顺。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓财搁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躬络。 傳聞我的和親對象是個殘疾皇子尖奔,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容