Day2—流程控制龄砰、數(shù)組

流程控制

if-else

if( 條件表達式1 ){

    執(zhí)行代碼塊1

}else if( 條件表達式2 ){

    執(zhí)行代碼塊2

}else{

    執(zhí)行代碼塊3

}
  • 條件表達式必須是布爾表達式寝贡,或者是布爾變量;
  • 執(zhí)行代碼塊只有一條執(zhí)行語句時愿险,{ }可以省略辆亏;
  • if-else是“多選一”結(jié)構(gòu)扮叨,因此else是可選的领迈;
  • 根據(jù)條件是“互斥”還是“包含”關(guān)系衷蜓,各部分的條件表達式和執(zhí)行代碼塊的順序存在要求磁浇;
    如果條件是“互斥”的置吓,那沒有順序要求;
    如果條件是“包含”的构拳,那子級在上、父級在下;

switch-case

switch( 表達式 ){

    case 常量1:
        執(zhí)行語句1;
        break;

    case 常量2:
        執(zhí)行語句2;
        break;

    case 常量3:
        執(zhí)行語句3;
        break;

    default:
        執(zhí)行語句1;
        break;

}
  • switch語句中置森,表達式的值必須是以下幾種類型之一:
    byte斗埂,short,char凫海,int呛凶,枚舉,String
  • case后面的常量必須是確定的值行贪,不能是變量名或者表達式漾稀;
  • break用來執(zhí)行完一個case分支后跳出switch語句塊,如果沒有break建瘫,程序會自動執(zhí)行到switch的結(jié)尾殷蛇;
  • default是可選的荸实,位置也是靈活的,當(dāng)沒有匹配的case時沦辙,執(zhí)行default后面的語句;
  • 不同的case可以執(zhí)行同一個語句,因此可以將case進行合并狞玛,比如:
        switch(month){
            case 3:
            case 4:
            case 5:
                System.out.println("Spring");
                break;

            case 6:
            case 7:
            case 8:
                System.out.println("Summer");
                break;

            case 9:
            case 10:
            case 11:
                System.out.println("Autumn");
                break;

            case 12:
            case 1:
            case 2:
                System.out.println("Winter");
                break;
        
        }

for

for ( 初始化部分 ; 循環(huán)條件部分 ; 迭代部分 ){

        循環(huán)體

}
  • for循環(huán)條件部分為boolean表達式戴已,當(dāng)值為false時休玩,退出循環(huán)呐矾;
  • 初始化部分可以聲明多個變量罚随,但必須是同一個類型屠升,用逗號分隔糕殉;
  • 迭代部分也可以有多個變量更新赡磅,用逗號分隔咆瘟;
  • 無限循環(huán):
for( , , ){ 

        循環(huán)體

}     // 表達式中并沒有語句卧檐,會導(dǎo)致無限循環(huán)下去

while/do-while

初始化部分

while( 循環(huán)條件部分 ){

      循環(huán)體部分

      迭代部分

}
初始化部分

do{

      循環(huán)體部分

      迭代部分

}while( 循環(huán)條件部分 )
  • 兩者的區(qū)別在于do-while在循環(huán)之前至少會執(zhí)行一次循環(huán)體;
  • 通過控制while的循環(huán)條件,可以造成無限循環(huán):
while( true ){

      循環(huán)體

}

嵌套

一個輸出9*9乘法表的例子:

        int num;
        for(int i = 1; i <= 9; i++){
            for(int j = 1; j <= i; j++){
                num = i * j;
                System.out.print(j + "*" + i + "=" + num + '\t');
            }
            System.out.print('\n');
        }

break/continue

  • 使用{ }定義的一段代碼被稱作代碼塊
  • break可以終止并跳出當(dāng)前所處代碼塊的執(zhí)行;
  • continue則可以跳過當(dāng)前所處代碼塊的循環(huán)贷帮,直接進行下一次循環(huán)潜必;
  • break晒他、continue之后不能有其它的語句,因為程序永遠不會執(zhí)行在其之后的語句;

數(shù)組

數(shù)組概述

  • 數(shù)組本身是引用數(shù)據(jù)類型穴墅,而數(shù)組中的元素可以是任何數(shù)據(jù)類型馆里,包括基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。
  • 創(chuàng)建數(shù)組對象會在內(nèi)存中開辟一整塊連續(xù)的空間,而數(shù)組名中引用的是這塊連續(xù)空間的首地址瓢阴。
  • 數(shù)組的長度一旦確定叠穆,就不能修改嚷硫。

一維數(shù)組

聲明方式

        // 數(shù)組聲明;
        int a[];
        int[] a1;
        //int a[5];   // 非法鞋怀,聲明數(shù)組時不能指定其長度
        double b[];
        String s[];
        String[] s1;
        // 理論上村斟,type var[] 和 type[] var這兩種方式?jīng)]有什么區(qū)別;

初始化
java中使用new關(guān)鍵字來創(chuàng)建數(shù)組;
動態(tài)初始化:

        int arr[] = new int[3];
        arr[0] = 0;
        arr[1] = 1;
        arr[2] = 2;
        
        String[] names;
        names = new String[3];
        names[0] = "kana";
        names[1] = "omew";
        names[2] = "yuki";

靜態(tài)初始化:

        int arr1[] = new int[]{0,1,2};
        int arr2[] = {1,2,3};
        String[] charas = {"甲","乙","丙"};

數(shù)組的引用

  • 定義豌拙、并用運算符new為數(shù)組分配空間之后盅蝗,才可以引用數(shù)組中的每個元素;
  • 采用數(shù)組下標(biāo)來引用數(shù)組元素姆蘸,可以是整數(shù)常量或者整型表達式,數(shù)組的下標(biāo)從0開始芙委;
  • 每個數(shù)組都有一個屬性length指明它的長度逞敷,例如:a.length 指明數(shù)組a的長度;
  • 數(shù)組一旦初始化灌侣,長度是不可變的推捐;
        for(int i = 0; i<names.length; i++ ){
            System.out.println(names[i]);
        }

數(shù)組元素默認初始化值
數(shù)組是引用類型,它的元素相當(dāng)于類的成員變量侧啼,因此數(shù)組一經(jīng)分配空間牛柒,其中的每個元素也被按照成員變量同樣的方式被隱式初始化堪簿。

數(shù)組元素默認初始化值

內(nèi)存解析圖(例)

一維數(shù)組的內(nèi)存解析

多維數(shù)組

數(shù)組中的數(shù)組:對于二維數(shù)組的理解,可以看成是一維數(shù)組array1又作為另一個一維數(shù)組array2的元素而存在皮壁。其實椭更,從數(shù)組底層的運行機制來看,并沒有多維數(shù)組蛾魄。

初始化
動態(tài)初始化:

        // 動態(tài)初始化虑瀑,格式1
        int[][] arr = new int[3][2];
        int arr1[][] = new int[3][2];
        
        // 動態(tài)初始化,格式2
        int[][] arr2 =new int[3][];
        arr2[0] = new int[1];
        arr2[1] = new int[2];
        arr2[2] = new int[3];
        
        // int[][] arr3 = new int[][3];     // 非法

靜態(tài)初始化:

        // 靜態(tài)初始化
        int[][] arr4 = new int[][]{{2,3},{4,5,6},{7,8,9}};

java中的數(shù)組不一定都是規(guī)則的矩陣形式

多維數(shù)組的使用

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

本質(zhì)上還是對數(shù)組下標(biāo)的引用滴须,與一維數(shù)組不同的是多維數(shù)組的循環(huán)為嵌套舌狗;

數(shù)組聲明方式總結(jié)
一維數(shù)組:int x[ ] 或者 int[ ] x;
二維數(shù)組:int y[ ][ ] 或者 int[ ][ ] y 或者 int[ ] y[ ]扔水;

二維數(shù)組內(nèi)存解析圖(例)

二維數(shù)組內(nèi)存解析圖

數(shù)組涉及的常見算法

復(fù)制數(shù)組

int[] array1, array2;
array1 = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };

array2 = array1;

這樣是不行的痛侍,表面上看數(shù)組array2的元素確實跟數(shù)組array1的元素一樣,但這其實是復(fù)制了array1引用地址的結(jié)果魔市,兩個數(shù)組在內(nèi)存中指向的是一個空間主届。這就導(dǎo)致了:如果你對數(shù)組array2的元素進行修改,同樣也會影響到array1的元素嘹狞。


直接復(fù)制的內(nèi)存解析

正確的方法是岂膳,采用循環(huán)的方式對array2中的元素逐一進行復(fù)制操作:

//復(fù)制array1數(shù)組給array2
array2 = new int[array1.length];
for(int i = 0;i < array2.length;i++){
    array2[i] = array1[i];
}
逐一復(fù)制的內(nèi)存解析

二分查找

二分查找

這里需要注意的是:循環(huán)停止的條件
理論上說,無論head和end的值怎么改變磅网,都不可能出現(xiàn)head > end 的情況谈截,因為這跟數(shù)組的基本結(jié)構(gòu)是矛盾的;同時在每一次二分查找后涧偷,都會執(zhí)行 end = middle - 1 或者 head = middle + 1 簸喂,來確保程序正常運行。

冒泡排序

        int temp;
        for(int j = 1; j < arr.length; j++ ){      // 外層循環(huán)是冒泡操作的次數(shù)
            for(int i = 0; i < arr.length - j; i++){     // 內(nèi)存循環(huán)是相鄰兩個元素做比較的次數(shù)
                if(arr[i] > arr[i + 1]){
                    temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }

冒泡排序的本質(zhì)是比較相鄰的兩個元素燎潮,如果第一個比第二個大喻鳄,就對其進行交換(升序);
對每一組相鄰的元素做相同的操作确封,從:
a[1] 和 a[2]
a[2] 和 a[3]
... ...
a[n-1] 和 a[n]
完成以上這個比較流程除呵,最后的a[n]一定是最大的數(shù),到此為止爪喘,執(zhí)行了一次冒泡操作颜曾;
每執(zhí)行一次冒泡操作后,除了最后一個元素秉剑,針對剩下的元素重復(fù)以上操作泛豪,直到?jīng)]有任何一對數(shù)字需要比較為止。

Arrays工具類

Arrays類即為操作數(shù)組的工具類,包含了用來操作數(shù)組(比如排序和搜索)的各種方法诡曙;
使用時臀叙,必須在聲明import java.util.Arrays;


Arrays工具類

表格中的數(shù)據(jù)類型為執(zhí)行了此工具類方法后返回的值類型:

        // Arrays工具類
        int[] arr1 = new int[]{1,3,5,7,9};
        int[] arr2 = new int[]{1,3,5,7,9};
        
        System.out.println(Arrays.equals(arr1,arr2));  // true
        
        System.out.println(Arrays.toString(arr1));    // [1, 3, 5, 7, 9]

        Arrays.fill(arr2, 0);
        System.out.println(Arrays.toString(arr2));     // [0, 0, 0, 0, 0]
        
        int[] arr3 = new int[]{-12,-90,5,2,88,60,-17,-44,46,80,32,11,7};
        Arrays.sort(arr3);
        System.out.println(Arrays.toString(arr3));   // [-90, -44, -17, -12, 2, 5, 7, 11, 32, 46, 60, 80, 88]
        
        System.out.println(Arrays.binarySearch(arr3, 11));   // 7
        System.out.println(Arrays.binarySearch(arr3, 10));   // -8 隨機返回一個負數(shù)值

數(shù)組使用的常見異常

此異常編譯時不會報錯,只有執(zhí)行編譯后的程序才會出現(xiàn)提示信息:


常見異常
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末价卤,一起剝皮案震驚了整個濱河市劝萤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荠雕,老刑警劉巖稳其,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炸卑,居然都是意外死亡既鞠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門盖文,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘱蛋,“玉大人,你說我怎么就攤上這事五续∪髅簦” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵疙驾,是天一觀的道長凶伙。 經(jīng)常有香客問我,道長它碎,這世上最難降的妖魔是什么函荣? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮扳肛,結(jié)果婚禮上傻挂,老公的妹妹穿的比我還像新娘。我一直安慰自己挖息,他們只是感情好金拒,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著套腹,像睡著了一般绪抛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上电禀,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天睦疫,我揣著相機與錄音,去河邊找鬼鞭呕。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的葫松。 我是一名探鬼主播瓦糕,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腋么!你這毒婦竟也來了咕娄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤珊擂,失蹤者是張志新(化名)和其女友劉穎圣勒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摧扇,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡圣贸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扛稽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吁峻。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖在张,靈堂內(nèi)的尸體忽然破棺而出用含,到底是詐尸還是另有隱情,我是刑警寧澤帮匾,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布啄骇,位于F島的核電站,受9級特大地震影響瘟斜,放射性物質(zhì)發(fā)生泄漏缸夹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一哼转、第九天 我趴在偏房一處隱蔽的房頂上張望明未。 院中可真熱鬧,春花似錦壹蔓、人聲如沸趟妥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽披摄。三九已至,卻和暖如春勇凭,著一層夾襖步出監(jiān)牢的瞬間疚膊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工虾标, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寓盗,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像傀蚌,于是被迫代替她去往敵國和親基显。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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