天天看點

Java 學習 Day04(2)

Java 學習 Day04

數組

一、數組的概述

1.數組的了解:數組(Array),是多個相同類型資料按一定順序排列的集合,并使用一個名字命名,并通過編号的方式對這些資料進行統一管理。

2.數組相關的概念

①數組名

②元素

③角标、下标、索引

④數組的長度:元素個數

3.數組的特點:

①數組是有序排列的

②數組屬于引用資料類型的變量。數組的元素,既可以是基本資料類型,也可以是引用資料類型

③建立數組對象會在記憶體中開辟一整塊聯系的空間

④數組的長度一旦确定,就不能修改。

4.數組的分類

①按照維數:一位數組、二維數組······

②按照數組元素的類型:基本資料類型元素的數組、引用資料類型元素的數組

二、一維數組的使用

①一維數組的聲明和初始化

②如何調用數組的指定位置的元素

③如何擷取數組的長度

④如何周遊數組

⑤數組元素的預設初始化值

  • 數組元素是整型:0
  • 數組元素是浮點型:0.0
  • 數組元素是char型:0或’\u0000’,而非’0’
  • 數組元素是boolean型:false
  • 數組元素是引用資料類型:null

⑥數組的記憶體解析

public class ArrayTest {
	public static void main(String[] args) {
	
		//1.一維數組的聲明和初始化
		int num;//聲明
		num=10;//初始化
		int id=1001;//聲明+初始化
		
		int ids[];//聲明
		//1.1靜态初始化:數組的初始化和數組元素的指派操作同時進行
		ids=new int[] {1001,1002,1003,1004};
		//1.2動态初始化:數組的初始化和數組元素的指派操作分開進行
		String[] names=new String[5]; 
		//也是正确的寫法
		int[] arr0= {1,2,3,4,5};//類型推斷
		
		//總結:數組一旦初始化完成,其長度就确定了
		
		//2.如何調用數組的指定位置的元素:通過角标的方式調用。
		//數組的角标次0開始,到數組的長度-1結束。
		names[0]="張學良";
		names[1]="盧布";
		names[3]="芈月";
		names[4]="嬴政";
		
		//3.如何擷取數組的長度
		//屬性:length
		System.out.println(names.length);
		System.out.println(ids.length);
		
		//4.如何周遊數組
		for(int i=0;i<names.length;i++) {
			System.out.println(names[i]);
		}
		
		//5.數組元素的預設初始化值
		int[] arr1=new int[4];
		for(int i=0;i<arr1.length;i++) {
			System.out.println(arr1[i]);
		}
		System.out.println("***************");
		
		short[] arr2=new short[4];
		for(int i=0;i<arr2.length;i++) {
			System.out.println(arr2[i]);
		}
		System.out.println("****************");
		
		float[] arr3=new float[4];
		for(int i=0;i<arr3.length;i++) {
			System.out.println(arr3[i]);
		}
		System.out.println("***************");
		
		char[] arr4=new char[4];
		for(int i=0;i<arr4.length;i++) {
			System.out.println("-----"+arr4[i]+"*****");
		}
		if(arr4[0]==0) {
			System.out.println("你好!");
		}
		System.out.println("***************");	
		
		boolean[] arr5=new boolean[4];
		System.out.println(arr5[0]);
		System.out.println("***************");
		
		String[] arr6=new String[4];
		System.out.println(arr6[0]);
		if(arr6[0]==null) {
			System.out.println("今天天氣不錯!");
		}
		
}
}

           

三、二維數組的定義與使用

  1. 定義:對于二維數組的了解,我們可以看成是一維數組array1又作為另一個一維數組array2的元素而存在。其實,從數組底層的運作機制來看,其實沒有多元數組。
  2. 二維數組的使用:

    規定:二維數組分為外層數組的元素,内層數組的元素

    int[][] arr=new int[4][3];

    外層元素:arr[0],arr[1]

    内層元素:arr[0][0],arr1[1][2]等

    ① 二維數組的聲明和初始化

    ② 如何調用數組的指定位置的元素

    ③ 如何擷取數組的長度

    ④ 如何周遊數組

    ⑤ 數組元素的預設初始化值

    針對初始化方式一:比如 int[][] arr=new int[4][3];

    外層元素的初始化值為:位址值

    内層元素的初始化值:與一維數組初始化情況相同

    針對初始化方式二:比如 int[][] arr=new int[4][];

    外層元素的初始化值為:null

    内層元素的初始化值為:不能調用,否則報錯。

    ⑥ 數組的記憶體解析

public interface ArrayTest1 {
	public static void main(String[] args) {
		//1.二維數組的聲明和初始化
		int[] arr=new int[] {1,2,3};//一維數組
		//靜态初始化
		int[][] arr1=new int[][]{{1,2,3},{4,5},{6,7,8}};
		//動态初始化1
		String[][] arr2=new String[3][2];
		//動态初始化2
		String[][] arr3=new String[3][];
		//也是正确的寫法
		int[] arr4[]=new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
		int[] arr5[]={{1,2,3},{4,5},{6,7,8}};
		
		//2.如何調用數組的指定位置的元素
		System.out.println(arr1[0][1]);//2
		System.out.println(arr2[1][1]);//null
		
		arr3[1]=new String[4];
		System.out.println(arr3[1][0]);
		
		//3.擷取數組的長度
		System.out.println(arr4.length);//3
		System.out.println(arr4[0].length);//3
		System.out.println(arr4[1].length);//4
		
		//4.如何周遊二維數組
		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.println();
		}
		
		//5.數組元素的預設初始化值 
		int[][] arr6=new int[4][3];
		System.out.println(arr6[0]);//[[email protected] [:一維數組,I:int型,@:位址
		System.out.println(arr6[0][0]);//0
		
		System.out.println(arr6);//[[[email protected]
		
		System.out.println("*******************");
		float[][] arr7=new float[4][3];
		System.out.println(arr7[0]);//位址值
		System.out.println(arr7[0][0]);//0.0
		
		System.out.println("*******************");
		
		String[][] arr8=new String[4][3];
		System.out.println(arr8[1]);//位址值
		System.out.println(arr8[1][1]);//null
		
		System.out.println("*******************");
		
		double[][] arr9=new double[4][];
		System.out.println(arr9[1]);//null
		System.out.println(arr9[1][0]);//報錯
	}
}

           

四、練習

練習一

升景坊單間短期出租 4個月 ,550 元/月(水電煤公攤,網費 35 元/月),空調、衛生間廚房齊全。 屋内均是 IT 行業人士,喜歡安靜。 是以要求來租者最好是同行或剛畢的年輕人,愛幹淨、安靜。

public class ArrayDemo {
	public static void main(String[] args) {
		int[] arr = new int[] { 8, 2, 1, 0, 3 };
		int[] index = new int[] { 2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3 };
		String tel = "";
		for (int i = 0; i < index.length; i++) {
			tel += arr[index[i]];
		}
		System.out.println("聯系方式:" + tel);//18...
	}

}
           

練習二

從鍵盤讀入學生成績,找出最高分,

并輸出學生成績等級。

➢成績>=最高分-10 等級為’A’

➢成績>=最高分-20 等級為’B’

➢成績>=最高分-30 等級為’C’

➢其餘 等級為’D’

提示:先讀入學生人數,根據人數建立int數組, 存放學生成績。

一維數組的使用

import java.util.Scanner;

public class ArrayDemo1 {
	public static void main(String[] args) {
		//1.使用Scanner,讀取學生個數
		Scanner scan=new Scanner(System.in);
		System.out.println("請輸入學生人數:");
		int number=scan.nextInt();
		
		//2.建立數組,存儲學生成績:動态初始化
		int[] score=new int[number];
		
		//3.給數組中的元素指派
		System.out.println("請輸入"+number+"個學生的成績:");
		
		//4.擷取數組中元素的最大值
		int maxScore=0;
		for(int i=0;i<score.length;i++) {
			score[i]=scan.nextInt();
			if(maxScore<score[i]){
				maxScore=score[i];
			}	
		}
		System.out.println(maxScore);
		
		//5.根據每個學生的成績與最高分的內插補點,得到每個學生的等級,并輸出等級和成績
		char level;
		for(int i=0;i<score.length;i++) {
			if(maxScore-score[i]<=10) {
				level='A';
			}else if(maxScore-score[i]<=20) {
				level='B';
			}else if(maxScore-score[i]<=30) {
				level='C';
			}else {
				level='D';
			}
			System.out.println("student"+i+"score is"+score[i]+",grade is"+level);
		}
	}
}

           

練習三

算法的考查:求數值型數組中元素的最大值、最小值、平均數、總和等

  • 定義一個int型的一維數組,包含10個元素,分别賦一些随機整數,然後求出所有元素的最大值,最小值,和值,平均值,并輸出出來。
  • 要求:所有随機數都是兩位數。
  • [10,99]

    公式:(int)(Math.random()*(99-10+1)+10)

public class ArrayTest1 {
	public static void main(String[] args) {
		int[] arr=new int[10];
		
		for(int i=0;i<arr.length;i++) {
			arr[i]=(int)(Math.random()*(99-10+1)+10);
		}
		
		//周遊
		for(int i=0;i<arr.length;i++) {
			System.out.print(arr[i]+"\t");
		}
		System.out.println();
		
		//求數組元素的最大值
		int maxValue=arr[0];
		for(int i=1;i<arr.length;i++) {
			if(maxValue<arr[i]) {
				maxValue=arr[i];
			}
		}
		System.out.println("最大值為:"+maxValue);
		
		//求數組元素的最小值
		int minValue=arr[0];
		for(int i=1;i<arr.length;i++) {
			if(minValue>arr[i]) {
				minValue=arr[i];
			}
		}
		System.out.println("最小值為:"+minValue);
		
		//求數組元素的總和
		int sum=0;
		for(int i=0;i<arr.length;i++) {
			sum+=arr[i];
		}
		System.out.println("總和為:"+sum);
		
		//求數組元素的平均數
		int avgValue=sum/arr.length;
		System.out.println("平均數為:"+avgValue);
	}
}

           

練習四

算法的考查:數組的複制、反轉、查找(線性查找、二分法查找)

public class ArrayTest2 {
	public static void main(String[] args) {
		
	String[] arr = new String[] {"JJ","DD","MM","BB","GG","AA"};
	
	//數組的複制(差別于數組變量的指派:arr1 = arr)
	String[] arr1 = new String[arr.length];
	for(int i = 0;i < arr.length;i++) {
		arr1[i] = arr[i];
	}
	
	//周遊
	for(int i = 0;i < arr.length;i++) {
		System.out.print(arr1[i] + "\t");
	}
	System.out.println();
	
	//數組的反轉
	//方法一:
	for(int i = 0;i < arr.length / 2;i++) {
		String temp = arr[i];
		arr[i] = arr[arr.length - i -1];
		arr[arr.length - i - 1] = temp;
	}
	
	for(int i = 0;i < arr.length;i++){
		System.out.print(arr[i] + "\t");
	}
	
	System.out.println();
	
	//方法二
	for(int i=0,j=arr.length-1;i<j;i++,j--) {
		String temp1=arr[i];
		arr[i]=arr[j];
		arr[j]=temp1;
	}
	
	for(int i = 0;i < arr.length;i++){
		System.out.print(arr[i] + "\t");
	}
	
	System.out.println();
	
	//查找(或搜尋)
	//線性查找:
	String dest = "BB";
	//dest = "CC";
	boolean isFlag=true;
	for(int i=0;i<arr.length;i++) {
		if(dest.equals(arr[i])) {//不能用==判斷字元串相等,需要用equals
			System.out.println("找到了指定的元素,位置為:"+i);
			isFlag=false;
			break;
		}
	}
	if(isFlag) {
		System.out.println("很遺憾,沒有找到!");
	}
	
	//二分法查找:
	//前提:所要查找的數組必須有序
	int[] arr2=new int[]{-98,-34,2,34,54,66,79,105,210,333};
	
	int dest1=-34;
	//dest1=35;
	int head=0;
	int end=arr2.length-1;
	boolean isFlag1=true;
	while(head<=end) {
		int middle=(head+end)/2;
		if(dest1==arr2[middle]) {
			System.out.println("找到了指定的元素,位置為:" + middle);
			isFlag=false;
			break;
		}else if(arr2[middle]>dest1){
			end=middle-1;
		}else {//arr2[middle]<dest1
			head=middle+1;
		}
	}
	
	if(isFlag) {
		System.out.println("很遺憾,沒有找到的啦!");
	}
	}
}

           

練習五

數組的冒泡排序:

Java 學習 Day04(2)
Java 學習 Day04(2)
public class BubbleSortTest {
	public static void main(String[] args) {
		int[] arr=new int[] {43,32,76,-98,0,64,33,-21,32,99};
		
		//冒泡排序
		for(int i=0;i<arr.length-1;i++) {
			for(int j=0;j<arr.length-1-i;j++) {
				if(arr[j]>arr[j+1]) {
					int temp=arr[j];
				    arr[j]=arr[j+1];
				    arr[j+1]=temp;
				}
			}
		}
		
		for(int i=0;i<arr.length-1;i++) {
			System.out.print(arr[i]+"\t");
		}
	}
}

           

練習六

快速排序:

Java 學習 Day04(2)
Java 學習 Day04(2)
public class QuickSort {
	private static void swap(int[] data, int i, int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}

	private static void subSort(int[] data, int start, int end) {
		if (start < end) {
			int base = data[start];
			int low = start;
			int high = end + 1;
			while (true) {
				while (low < end && data[++low] - base <= 0)
					;
				while (high > start && data[--high] - base >= 0)
					;
				if (low < high) {
					swap(data, low, high);
				} else {
					break;
				}
			}
			swap(data, start, high);
			
			subSort(data, start, high - 1);//遞歸調用
			subSort(data, high + 1, end);
		}
	}
	public static void quickSort(int[] data){
		subSort(data,0,data.length-1);
	}
	
	
	public static void main(String[] args) {
		int[] data = { 9, -16, 30, 23, -30, -49, 25, 21, 30 };
		System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
		quickSort(data);
		System.out.println("排序之後:\n" + java.util.Arrays.toString(data));
	}
}

           

練習七

擷取 arr 數組中所有元素的和

public class ArrayExer {
	public static void main(String[] args) {
		int[][] arr=new int[][] {{3,5,8},{12,9},{7,0,6,4}};
		int sum=0;
		
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr[i].length;j++) {
				sum +=arr[i][j];
			}
		}
		System.out.println("總和為:"+sum);
	}
}

           

練習八

使用簡單數組

(1)建立一個名為ArrayExer2的類,在main()方法中聲明array1和array2兩個變量,他們是int[]類型的數組。

(2)使用大括号{},把array1初始化為8個素數:2,3,5,7,11,13,17,19。

(3)顯示array1的内容。

(4)指派array2變量等于array1,修改array2的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。列印出array1。

  • 思考:array1和array2是什麼關系?array1和array2位址值相同,都指向了堆空間的唯一的一個數組實體。
  • 拓展:修改題目,實作array2對array1數組的複制
public class ArrayExer2 {
	public static void main(String[] args) {
		int[] arr1,arr2;
		
		arr1=new int[] {2,3,5,7,11,13,17,19};
		
		//顯示arr1的内容
		for(int i=0;i<arr1.length;i++) {
			System.out.print(arr1[i]+"\t");
		}
		System.out.println();
		
		//指派arr2變量等于arr1
		//不能稱作數組的複制
		arr2=arr1;
		
		//修改arr2的偶索引元素,使其等于索引值
		
		for(int i=0;i<arr2.length;i++) {
			if(i%2==0) {
				arr2[i]=i;
			}
		}
		System.out.println();
		
		//列印出arr1
		for(int i=0;i<arr1.length;i++) {
			System.out.print(arr1[i]+"\t");
		}
	}
}

           
public class ArrayExer2 {
	public static void main(String[] args) {
		int[] arr1,arr2;
		
		arr1=new int[] {2,3,5,7,11,13,17,19};
		
		//顯示arr1的内容
		for(int i=0;i<arr1.length;i++) {
			System.out.print(arr1[i]+"\t");
		}
		System.out.println();
		
		//array2對array1數組的複制
		 arr2=new int[arr1.length];
		 for(int i=0;i<arr1.length;i++) {
			 arr2[i]=arr1[i];
		 }
		
		//修改arr2的偶索引元素,使其等于索引值
		
		for(int i=0;i<arr2.length;i++) {
			if(i%2==0) {
				arr2[i]=i;
			}
		}
		System.out.println();
		
		//列印出arr1
		for(int i=0;i<arr1.length;i++) {
			System.out.print(arr1[i]+"\t");
		}
	}
}

           

練習九

使用二維數組列印一個 10 行楊輝三角。

Java 學習 Day04(2)
public class YangHuiTest {
	
	public static void main(String[] args) {
		//1.聲明并初始化二維數組
		int[][] yangHui = new int[10][];
		
		//2.給數組的元素指派
		for(int i = 0;i < yangHui.length;i++){
			yangHui[i] = new int[i + 1];//第i行有i+1列,即第i行有i+1個元素
			
			//2.1 給首末元素指派
			yangHui[i][0] = yangHui[i][i] = 1;
			//2.2 給每行的非首末元素指派
			//if(i > 1){
			for(int j = 1;j < yangHui[i].length - 1;j++){
				yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
			}
			//}
		}
		
		
		//3.周遊二維數組
		for(int i = 0;i < yangHui.length;i++){
			for(int j = 0;j < yangHui[i].length;j++){
				System.out.print(yangHui[i][j] + "  ");
			}
			System.out.println();
		}
		
		
		
	}
	
	
}

           

五、Arrays工具類

java.util.Arrays:操作數組的工具類,裡面定義了很多操作數組的方法

  • 1.boolean equals(int[] a,int[] b):判斷兩個數組是否相等。
  • 2.String toString(int[] a):輸出數組資訊
  • 3.void fill(int[] a,int val):将指定值填充到數組中。
  • 4.void sort(int[] a):對數組進行排序。
  • 5.int binarySearch(int[] a,int key):二分法查找數組中的元素。
public class ArrayTest {
	public static void main(String[] args) {
		
		//1.boolean equals(int[] a,int[] b):判斷兩個數組是否相等
		int[] arr1=new int[] {1,2,3,4};
		int[] arr2=new int[] {1,2,4,3};
		boolean isEquals=Arrays.equals(arr1,arr2);
		System.out.println(isEquals);
		
		//2.String toString(int[] a):輸出數組資訊。
		System.out.println(Arrays.toString(arr1));
		
		//3.void fill(int[] a,int val):将指定值填充到數組中
		Arrays.fill(arr1,10);
		System.out.println(Arrays.toString(arr1));
		
		//4.void sort(int[] a):對數組進行排序
		Arrays.sort(arr2);
		System.out.println(Arrays.toString(arr2));
		
		//5.int binarySearch(int[] a,int key)
		int[] arr3=new int[] {-98,-34,2,34,54,66,79,105,210,333};
		int index=Arrays.binarySearch(arr3, 210);
		if(index==0) {
			System.out.println(index);
		}else {
			System.out.println("未找到");
		}
	}
}

           

六、數組中的常見異常

  1. 數組角标越界的異常:ArrayIndexOutOfBoundsExcetion
  2. 空指針異常:NullPointerException
public class ArrayExceptionTest {
	public static void main(String[] args) {
		
		//1. 數組角标越界的異常:ArrayIndexOutOfBoundsExcetion
		int[] arr = new int[]{1,2,3,4,5};
		
//		for(int i = 0;i <= arr.length;i++){
//			System.out.println(arr[i]);
//		}
		
//		System.out.println(arr[-2]);
		
//		System.out.println("hello");//出現異常後,後面的程式不再執行
		
		//2.2. 空指針異常:NullPointerException
		//情況一:
//		int[] arr1 = new int[]{1,2,3};
//		arr1 = null;
//		System.out.println(arr1[0]);
		
		//情況二:
//		int[][] arr2 = new int[4][];//沒有定義列
//		System.out.println(arr2[0][0]);
		
		//情況三:
		String[] arr3 = new String[]{"AA","BB","CC"};
		arr3[0] = null;
		System.out.println(arr3[0].toString());
	}
}

           

繼續閱讀