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("今天天氣不錯!");
}
}
}
三、二維數組的定義與使用
- 定義:對于二維數組的了解,我們可以看成是一維數組array1又作為另一個一維數組array2的元素而存在。其實,從數組底層的運作機制來看,其實沒有多元數組。
-
二維數組的使用:
規定:二維數組分為外層數組的元素,内層數組的元素
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("很遺憾,沒有找到的啦!");
}
}
}
練習五
數組的冒泡排序:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn1EenpWTxUkeOBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2MTOyQjNyETM0IjMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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");
}
}
}
練習六
快速排序:
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 行楊輝三角。
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("未找到");
}
}
}
六、數組中的常見異常
- 數組角标越界的異常:ArrayIndexOutOfBoundsExcetion
- 空指針異常: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());
}
}