一 數組的概述及其定義格式
1 爲什麼要有數組
現在需要統計某公司員工的工資情況,例如計算平均工資、找到最高工資等。假設該公司有80名員工,
用前面所學的知識,程序首先需要聲明80個變量來分別記住每位員工的工資,然後在進行操作,這樣做會顯得很麻煩。
爲了解決這種問題,Java就提供了數組供我們使用
結論:
數組是存儲多個變量(元素)的東西(容器)
這多個變量的數據類型要一致
2 什麼是數組
數組是存儲同一種數據類型多個元素的集合。也可以看成是一個容器。
數組既可以存儲基本數據類型,也可以存儲引用數據類型。
3 數組的格式
格式1: 數據類型[] 數組名;
格式2: 數據類型 數組名[];
舉個例子
int [] a; 定義了一個int類型的數組a;
int a[]; 定義了一個int類型的a數組;
我們推薦使用第一種定義方式
二 數組的初始化
java中的數組必須先初始化,然後才能使用。 所謂初始化就是爲數組中的數組元素分配內存空間,併爲每個數組元素賦值。
數組的初始化分爲動態初始化和靜態初始化。
1 數組的動態初始化
(1)動態初始化的格式
數據類型[] 數組名 = new 數據類型[數組長度];
數組長度其實就是數組中元素的個數。
舉例: int[] arr = new int[4]; 定義了一個int類型的數組arr,這個數組可以存放4個int類型的值。
(2)演示一下用動態數組來輸出數組名稱和數組元素
public class Mydemo1 {
public static void main(String[] args) {
int[] arr=new int[4];
for (int i = 0; i < 4; i++) {
arr[i]=i+1;
System.out.println("arr["+i+"]="+arr[i]);
}
}
}
(3)動態初始化數組的內存圖
2 數組的靜態初始化
(1)靜態初始化的格式
格式:數據類型[] 數組名 = new 數據類型[]{元素1,元素2,…};
舉例: int[] arr = new int[]{1,2,3};
簡化格式:
數據類型[] 數組名 = {元素1,元素2,…};
舉例: int[] arr = {1,2,3};
(2)靜態初始化數組內存圖
3 數組操作常見的兩個小問題
(1)越界
在程序報錯如下的時候 稱爲數組的越界
ArrayIndexOutOfBoundsException:數組索引越界異常
原因:你訪問了不存在的索引。
(2)空指針異常
在程序報錯如下的時候 稱爲空指針異常
NullPointerException:空指針異常
原因:數組已經不在指向堆內存了。而你還用數組名去訪問元素。
4 數組的常用操作
(1)數組的遍歷
public class Mydemo1 {
public static void main(String[] args) {
int[] arr={1,2,3,4,5};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
(2)獲取數組中的最大值
public class Mydemo1 {
public static void main(String[] args) {
int[] arr={2,4,20,2,1};int max=arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i]>max){max=arr[i];
}
}
System.out.println(max);
}
}
(3)數組的反轉
public class Mydemo1 {
public static void main(String[] args) {
int[] arr = {2, 4, 20, 2, 1};
for (int i=0,j=arr.length-1; i < j; i++,j--) {
int t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
}
}
(4)數組的查表法(根據索引查元素)
package org.westos.zz;
import java.util.Scanner;
public class Mydemo1 {
public static void main(String[] args) {
String[] arr={"星期一","星期二","星期三","星期四","星期五","星期六","星期天"};
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個數字 範圍是0----6");
int index = sc.nextInt();
String str=getEleByIndex(arr,index);
System.out.println("這個索引所對應的元素是:"+str);
}
public static String getEleByIndex(String[] arr,int index){
String str="";
if(index>=0&&index<=arr.length-1){
str= arr[index];
}else{
str="你索引是亂輸入的沒有找到對應的元素";
}
return str;
}
}
(5)數組的查表法(根據元素查索引)
package org.westos.zz;
import java.util.Scanner;
public class Mydemo1 {
public static void main(String[] args) {
int[] arr={100,200,300,400,500,600,700,800};
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個數字 範圍是100 200 300---800");
int ele = sc.nextInt();
int index=getIndexByEle(arr,ele);
if(index==-1){
System.out.println("你輸入的值有誤");
}else{
System.out.println("該元素在數組中的索引是:"+index);}
}
public static int getIndexByEle(int[] arr, int ele) {
int index=-1;
for (int i = 0; i < arr.length; i++) {
if (ele == arr[i]) {
index=i;break;
}
}
return index;
}
}
(6)對數組中的元素進行從小到大排序(冒泡排序)
package org.westos.zz;
import java.util.Scanner;
public class Mydemo1 {
public static void main(String[] args) {
int[] arr = {2, 3, 10, 82, 9, 14, 52};
maopao(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
}
private static void maopao(int[]arr) {
for (int j = 0; j < arr.length-1; j++)
for (int i=0; i < arr.length-j-1; i++) {
if(arr[i+1]<arr[i]){
int t=arr[i];
arr[i]=arr[i+1];
arr[i+1]=t;
}
}
}
}
三 二維數組的概述和格式
1 二維數組的概述
我們學校的專業每個專業有很多個學生,所以,可以用數組來存儲,而我們又同時有很多個專業。
這個也應該用一個數組來存儲。如何來表示這樣的數據呢?Java就提供了二維數組供我們使用
由此可見:其實二維數組其實就是每一個元素爲一維數組的數組。
2 二維數組的格式
(1) 二維數組的格式1
數據類型[][] 變量名 = new 數據類型[m][n];
m表示這個二維數組有多少個一維數組 必須寫上
n表示每一個一維數組的元素個數 可選
舉例:
int[][] arr = new int[3][2];
定義了一個二維數組arr
這個二維數組有3個一維數組,名稱是arr[0],arr[1],arr[2]
每個一維數組有2個元素,可以通過arr[m][n]來獲取
表示獲取第m+1個一維數組的第n+1個元素
注意事項
1:以下格式也可以表示二維數組
a:數據類型 數組名[][] = new 數據類型[m][n];
b:數據類型[] 數組名[] = new 數據類型[m][n];
這兩種格式不推薦使用
2:注意下面定義的區別
int x,y;
int[] x,y[];
區別是:
int[] x,y[];//定義了兩個數組 一個是一維數組x 一個是二維數組y
x=new int[3];
y=new int[3][]
(2)二維數組的格式2
數據類型[][] 變量名 = new 數據類型[m][];
m表示這個二維數組有多少個一維數組
這一次沒有直接給出一維數組的元素個數,可以動態的給出。
舉例:
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[3];
arr[2] = new int[1];
(3) 二維數組的格式
數據類型[][] 變量名 = new 數據類型[][]{{元素…},{元素…},{元素…}...};
簡化版:
數據類型[][] 變量名 = {{元素…},{元素…},{元素…}};
這個格式屬於靜態初始化:由我們指定具體的元素值,由系統給分配長度
舉例:
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
int[][] arr = {{1,2,3},{5,6},{7}};
3 二維數組的遍歷
public class Mydemo1 {
public static void main(String[] args) {
int[][] arr = new int[][]{{1,2}, {3, 4}, {5, 6, 7, 8}};
for(int i=0;i<arr.length;i++){ //外循環控制二維數組的長度
for(int j=0;j<arr[i].length;j++){ //內循環控制一維數組的長度
System.out.println(arr[i][j]);
}
}
}
}
4 二維數組的求和
(1)公司年銷售求和
某公司按照季度和月份統計的數據如下:單位(萬元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
我們分別用動態初始化和靜態初始化兩種方式來求一下公司的銷售和
1 動態初始化
package org.westos.zz;
import java.util.Scanner;
public class Mydemo1 {
public static void main(String[] args) {
int sum=0;
int[] arr1={22, 66, 44};
int[] arr2={77, 33, 88};
int[] arr3={25, 45, 65};
int[] arr4={11, 66, 99};
int[][] maxArray=new int[4][];
maxArray[0]=arr1;
maxArray[1]=arr2;
maxArray[2]=arr3;
maxArray[3]=arr4;
for(int i=0;i<maxArray.length;i++){
for(int j=0;j<maxArray[i].length;j++){
sum+=maxArray[i][j];
}
}
System.out.println("公司的銷售和是"+sum);
}
}
2 靜態初始化
package org.westos.zz;
import java.util.Scanner;
public class Mydemo1 {
public static void main(String[] args) {
int sum=0;
int[][] maxArray = new int[][]{{22, 66, 44},{77, 33, 88},{25, 45, 65},{11, 66, 99}};
for(int i=0;i<maxArray.length;i++){
for(int j=0;j<maxArray[i].length;j++){
sum+=maxArray[i][j];
}
}
System.out.println("公司的銷售和是"+sum);
}
}
(2)打印楊輝三角形
package org.westos.zz;
import java.util.Scanner;
public class Mydemo1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸人行數");
int n = sc.nextInt();
int[][] arr=new int[n][n];
for (int i = 0; i < arr.length; i++) {
arr[i][0]=1;
arr[i][i]=1;
}
for (int i = 2; i < arr.length; i++) {
for (int j = 1; j < i; j++) {
arr[i][j]= arr[i-1][j-1]+ arr[i - 1][j];
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j <=i; j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
}