# 大數據學習筆記第6天 - 數組 #
## 回顧
方法的重載:為了方法名的重用。遵守兩同、一不同原則(同類同方法名,不同的參數個數或參數類型)。
## 大綱
### 第一節課
- 知識點回顧
- 數組概述
- 數組模擬打分實例
### 第二節課
- 方法調用的值傳遞原理
### 第三節課
- 二維數組
- 二維數組的遍歷
- 二維數組計數求和
### 第四節課
- 二維數組練習
- 二維數組打印楊輝三角
## 數組基礎
概念:同一種類型數據的集合,可以是基本的數據類型,也可以是引用數據類型。

### 特點
1. 數組存儲的都是相同數據類型的元素。
2. 數組的長度也就是數組中元素的個數。
3. 元素從0開始編號,編號也稱為索引\index\下標。
4. 數組中元素的訪問方式是通過數組名+索引的方式。
### 數組的定義格式
基本數據類型變量的定義:int x;
數組類型變量的定義:int[] arr;

### 數組的初始化
初始化方式1:
動態初始化:數組的創建和元素的賦值分開進行;
格式:元素類型[] 數組名=new 元素類型[數組長度];
int[] arr = new int[3];
初始化方式2:
靜態初始化:數組創建時就給數組元素賦值;
格式:元素類型[] 數組名=new 元素類型[]{元素1,元素2,...};
int[] arr = new int[]{1,2,3}
靜態初始化的簡寫方式:int[] arr = {1,2,3}
直接打印數組類型的變量,會發現結果是一段看不懂的字符串,這就是引用數據類型變量的特點;它實際上代表的是一段內存空間的十六進制表示形式,真正的數據在JVM的堆內存空間中。
### 代碼實例
public class ArrayDemo{
public static void main(String[] args){
// 動態初始化
int[] arr1 = new int[3];
System.out.println(arr1); //打印的是包含了十六進制的字符串,實際上代表的是數組的地址
// 靜態初始化
int[] arr2 = new int[]{1,2,3};
int[] arr3 = {4,5,6};
System.out.println(arr2);
System.out.println(arr3);
}
}

## 內存結構
Java程序在運行時,為了提高運行效率,對內存進行了不同區域的劃分,每一種區域都有特定的處理數據的方式和內存管理方式。
如圖:

- 棧內存:用于存儲局部變量,當數據使用完,所占空間會自動釋放;
- 堆內存:存放數組和對象,通過new建立的實例都存放在堆內存中;
- 每一個實例都有內存地址值;
- 實例中的變量都有默認初始值;
- 當實例不再被使用,會在不確定的時間被垃圾回收器回收;
- 方法區:存放類文件和方法(面向對象部分再闡述)

本地方法棧:供本地方法使用,與操作系統有關。
程序計數器:對字節碼文件計數;
## 常見異常
1. 數組索引越界異常
2. 空指針異常
### 代碼實例
public class ArrayDemo2{
public static void main(String[] args){
int[] arr = new int[2];
// arr[2] = 1; //java.lang.ArrayIndexOutOfBoundsException
arr=null;
System.out.print(arr[0]); //java.lang.NullPointerException
}
}

## 案例:數組模擬打分
從鍵盤錄入5個分數作為評分,然后去除一個最高分,去除一個最低分,用剩余的數據的平均分作為最終的評分;
代碼:
import java.util.Scanner;
public class Demo01{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
int[] score = new int[5];
System.out.println("請輸入第1個評分");
score[0] = s.nextInt();
System.out.println("請輸入第2個評分");
score[1] = s.nextInt();
System.out.println("請輸入第3個評分");
score[2] = s.nextInt();
System.out.println("請輸入第4個評分");
score[3] = s.nextInt();
System.out.println("請輸入第5個評分");
score[4] = s.nextInt();
double res = getScore(score);
System.out.println("最終的評分是:" + res);
}
public static int getMax(int[] arr){
int max = arr[0];
for(int i=0; i < arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
public static int getMin(int[] arr){
int min = arr[0];
for(int i=0; i < arr.length; i++){
if(arr[i] < min){
min = arr[i];
}
}
return min;
}
public static double getScore(int[] arr){
int max = getMax(arr);
int min = getMin(arr);
int sum = 0;
for(int i=0; i<arr.length; i++){
sum += arr[i];
}
double score = (sum - max - min) / (arr.length - 2.0);
return score;
}
}

## 方法調用的值傳遞原理
Java中參數傳遞(實參->形參)的問題:
- 參數是基本數據類型,傳遞的是數值的副本;
- 參數是引用數據類型,傳遞的是引用的副本;

### 代碼實例
// 參數是基本數據類型,傳遞的是數值的副本;
public class Demo02{
public static void main(String[] args){
int x=10;
int y=20;
change(x, y);
System.out.println("x=" + x + ", y=" + y);
}
public static void change(int x, int y){
System.out.println("方法內部x=" + x + ", y=" + y);
x = 0;
y = 0;
System.out.println("方法內部x=" + x + ", y=" + y);
}
}

//參數是引用數據類型,傳遞的是引用的副本;
public class Demo03{
public static void main(String[] args){
int[] arr = {1,2,3};
change(arr);
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]+" ");
}
}
public static void change(int[] arr){
for(int i=0; i<arr.length; i++){
arr[i]=0;
}
System.out.print("方法內部數組元素是:");
for(int i=0; i<arr.length; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}

## 楊輝三角

- 端點的數為1.
- 每個數等于它上方兩數之和。
- 每行數字左右對稱,由1開始逐漸變大。
- 第n行的數字有n項。
- 第n行數字和為2^(n-1)。
- 每個數字等于上一行的左右兩個數字之和。可用此性質寫出整個楊輝三角。即第n+1行的第i個數等于第n行的第i-1個數和第i個數之和,這也是組合數的性質之一。
...
