1. 程式人生 > >《瘋狂Java講義》學習筆記(四)流程控制與陣列

《瘋狂Java講義》學習筆記(四)流程控制與陣列

Java語言有三種控制結構:順序結構、分支結構、迴圈結構

1、順序結構


順序結構就是程式從上而下逐行地執行,中間沒有任何判斷和跳轉


2、分支結構

  • if…else…
  • switch 

控制表示式只允許byte、short、char、int、String和列舉型別
 

swicth(expression){
    case condition1:{
        statement(s)
        break;
    }
    case condition2:{
        statement(s)
        break;
    }
    ...
    default:{
        statement(s)
    }
}
// 注意每個case中需要帶有break;

switch中的每個case中都需要帶有break,因為switch語句遇到相等的值,程式就開始執行這個case標籤後的程式碼,不再判斷與後面case,default標籤的條件是否匹配,除非遇到break;才會結束


3、迴圈結構

  • 迴圈語句包含的4個部分:
初始化語句init_statement
迴圈條件test_expression
迴圈體body_statement
迭代語句iteration_statement
  • while
[init_statement]
while(test_expression){
    statement;
    [iteration_statement]
}
例:
int count = 0;
while(count<10){
    System.out.println(count);
    count++;
}

 

  • do…while
// 迴圈體至少執行一次
[init_statement]
do{
    statement;
    [iteration_statement]
}while(test_expression);
例:
int count = 0;
do{
    System.out.println(count);
    count++;
}while(count<10);

 

  • for迴圈
for([init_statement];test_expression;[iteration_statement]){
    statement;
}

 

  • 巢狀迴圈,就是迴圈中套有迴圈
for(int i=0;i<5;i++){
    for(int j=0;j<5;j++){
        System.out.println(i+j);
    }
}


4、控制迴圈結構

  • break 

結束當前迴圈

  • break outer
// 結束至指定迴圈
outer:
for(int i=0;i<5;i++){
    for(int j=0;j<5;j++){
        System.out.println(i+j);
        if(j==1){
            break outer;
        }
    }
}
  • continue
// 忽略本次迴圈
for(int i=0;i<5;i++){
    if(i==2){
        continue;
        System.out.println(i);
    }
}

 

  • continue outer類似break outer
  • return 全部退出

5、陣列型別


陣列用於儲存多個數據,每個陣列元素存放一個數據,通常可通過陣列元素的索引來訪問陣列元素,包括為陣列元素賦值和取出陣列元素的值

  • 理解陣列 

Java語言中陣列必須先初始化,然後才可以使用。所謂初始化,就是為陣列元素分配記憶體空間,併為每個陣列元素賦初始值。只要為陣列元素分配了記憶體空間,陣列元素就具有了初始值。初始值的獲得由兩種形式:一種是由系統自動分配,另一種由程式設計師指定。

  • 定義陣列
String[] strArray(推薦)
String strArray[]
  • 陣列靜態初始化:初始化時由程式設計師顯示指定每個陣列元素的初始值,由系統決定陣列長度。

arrayName=new type[ ] {element1,element2,element3.....};

初始化時由程式設計師顯式指定每個陣列元素的初始值,由系統決定陣列長度
int[] intArray = new int[]{5,6,7,8}
int[] intArray = {5,6,7,8}
  • 陣列動態初始化 :執行動態初始化時,程式設計師只需要指定陣列的長度,即為每個陣列元素指定所需的記憶體空間,系統將負責為這些陣列元素分配初始值。

arrayName=new type[length];

int[] intArray = new int[4];
初始值如下:
整型(byte、short、int和long),初始值是0
浮點(float、double),初始值是0.0
字元(char),初始值是'\u0000'
布林(boolean),初始值是false
引用型別(類、介面和陣列),初始值是null
  • 使用陣列 

陣列下標從0開始,intArray[0]是第一個元素 
可以使用for或foreach遍歷陣列

  • 記憶體中的陣列 

陣列變數只是一個引用,實際的陣列物件被儲存在堆(heap)中 
如果引用的物件是區域性變數,那麼它被儲存在棧(stack)中

  • 二維陣列就是每個元素都是一個數組 
String[][] strArray = new String[][]{new String[3],new String[]{"hello"}}
  • 運算元組的常用API: 

Java提供了運算元組的工具類:java.util.Arrays;Arrays類包含的一些static修飾的方法可以直接操作手陣列。

查詢元素出現索引(要求元素已經升序排序): 
int Arrays.binarySearch(type[] a,type key) 
如果陣列不包含key,則返回負數
在指定範圍查詢元素出現索引(要求元素已經升序排序): 
int Arrays.binarySearch(type[] a,int fromIndex,int toIndex,type key)
複製陣列,如果小於原來長度則取前面的元素,如果大於則多出來的補預設值 
type[] Arrays.copyOf(type[] original,int length)
在指定範圍複製陣列,與上面類似 
type[] Arrays.copyOfRange(type[] original,int from,int to)
對比陣列,如果長度相等且陣列元素也一一相同,返回true 
boolean Arrays.equals(type[] a,type[] b)
陣列賦值,把陣列元素全部複製為val 
void Arrays.fill(type[] a,type val)
在指定範圍陣列賦值 
void Arrays.fill(type[] a,int fromIndex,int toIndex,type val)
排序 
void Arrays.sort(type[] a)
在指定範圍陣列排序 
void Arrays.sort(type[] a,int fromIndex,int toIndex)
轉換成字串,按順序把多個數組元素連綴在一起,多個數組元素使用英文逗號和空格隔開 
String Arrays.toString(type[] a)


Java8新增運算元組API

Java8增強了Arrays類的功能,為Arrays類增加了一些工具方法,這些工具方法可以充分利用多CPU並行的能力來提高設值、排序的效能。

int[] arr1 = new int[]{3,-4,25,16,30,18};
// 併發排序,效能更強
Arrays.parallelSort(arr1);
int[] arr2 = new int[]{3,-4,25,16,30,18};
// 前一個元素乘積和後一個元素相乘,第一個元素時乘以1
{1*3=3,3*-4=-12,-12*25=-300,-300*16=-48000,-48000*30=-144000,-144000*18=-2592000}
Arrays.parallelPrefix(arr2,new IntBinaryOperator(){
    public int applyAsInt(int left,int right){
        return left*right;
    }
});
int[] arr3 = new int[5];
// 與索引值相乘
{0,5,10,15,20}
Arrays.parallelSetAll(arr3,new IntUnaryOperator(){
    public int applyAsInt(int operand){
        return operand*5;
    }
});