1.數(shù)組(Array),?
多個(gè)相同類型的數(shù)據(jù),按照一定的順序排列的集合
并使用一個(gè)名字命名,并通過編號(hào)的方式對(duì)這些數(shù)據(jù)進(jìn)行統(tǒng)一管理
2.數(shù)組的組成:
數(shù)組名
下標(biāo)或索引
元素
數(shù)組的長度-->元素的個(gè)數(shù)
3.數(shù)組的特點(diǎn):
數(shù)組是有序排列的
數(shù)組本身是引用數(shù)據(jù)類型,數(shù)組內(nèi)的元素可以使任何數(shù)據(jù)類型(基本數(shù)據(jù)類型,引用數(shù)據(jù)類型)
創(chuàng)建數(shù)組對(duì)象會(huì)在內(nèi)存中開辟一整塊連續(xù)的空間.
數(shù)組的長度一旦確定,就不可以修改
4.數(shù)組的分類
? ? 按照維數(shù):????1維數(shù)組,2維數(shù)組....
? ? 按照元素類型:????基本數(shù)據(jù)類型元素的數(shù)組.引用數(shù)據(jù)類型元素的數(shù)組
5.一維數(shù)組的使用
? 5.1. 一維數(shù)組的聲明和初始化
// 一維數(shù)組的聲明和初始化
int num;//聲明
num = 10;//初始化
int id =1001;//聲明+初始化
int[] ids; //聲明
//1.1靜態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作同時(shí)進(jìn)行
ids = new int[] {1001,1002,1003,1004};
//1.2動(dòng)態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作分開進(jìn)行
String[] names = new String[5];
? ? ?5. 2.? 如何調(diào)用數(shù)組指定位置的元素
//2.如何調(diào)用數(shù)組指定位置的元素:通過角標(biāo)(索引)的方式調(diào)用
//數(shù)組的索引從0開始,到數(shù)組的長度-1結(jié)束
names[0] = "張0";
names[1] = "張1";
names[2] = "張2";
names[3] = "張3";
names[4] = "張4";
// names[5] = "張5";
? ? ? ?5. 3.? 如何獲取數(shù)組的長度
//3.如何獲取數(shù)組的長度. 使用length屬性
System.out.println(names.length);
? ?5. 4. 如何遍歷數(shù)組
for(int i = 0; i < names.length; i ++) {
System.out.println(names[i]);
? ?5. 5. 數(shù)組元素的默認(rèn)初始化值
????數(shù)組元素是整形:? ? ? ? 默認(rèn)值是? 0
? ? 浮點(diǎn)型:? ? ? ? 0.0
? ? char類型:? ? ? ?看上去是個(gè)空格 ,實(shí)際值是0? ? ?char型都會(huì)有對(duì)應(yīng)的ASCII 碼, 所以默認(rèn)值是asc碼為0的字符,??
? ? ?boolean :? ? ? ? false
? ?數(shù)組元素是引用數(shù)據(jù)類型時(shí): 默認(rèn)值是null
?6.二維數(shù)組的使用
數(shù)組本身是引用數(shù)據(jù)類型,可以看成是一維數(shù)組作為另一個(gè)數(shù)組的元素而存在
6.1二維數(shù)組的聲明和初始化
//靜態(tài)初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
//動(dòng)態(tài)初始化
String[][] arr2 = new String[3][2];
String[][] arr3 = new String[3][];
//特別的寫法
int[][] arr = {{1,2,3},{4,5},{6,7,8}};
int[] arr4[] =new int[][]{{1,2,3},{4,5},{6,7,8}};
int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};
6.2如何調(diào)用數(shù)組指定位置的元素
System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//由于未賦值String類型,是null
//System.out.println(arr3[1][0]);? java.lang.NullPointerException
6.3 獲取數(shù)組的長度
System.out.println(arr4.length);//3
System.out.println(arr4[0].length);//3
System.out.println(arr4[1].length);//2
6.4如何遍歷二維數(shù)組
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();
}
6.5數(shù)組元素的默認(rèn)初始化值
在數(shù)組 int[][] arr = new int[4][3]中,
//外層元素為,arr[0],arr[1]等
//內(nèi)層元素為,arr[0][0],arr[1][2]等;
類型1:
外層元素的初始化值為地址值
內(nèi)層元素的初始化值,與一維數(shù)組初始化情況相同
int[][] arr = new int[4][3];
System.out.println(arr[0]);????//[I@7f63425a,是地址值
System.out.println(arr[0][0]);????//0? ?內(nèi)層元素是int類型,
System.out.println(arr);? ? ?//[[I@36d64342
int型默認(rèn)值為: 0
float? ? ? ? ? ? :? ? 0.0
Stirng? ? ? ? :? ? null
類型2:
double[][] arr3 = new double[4][];
System.out.println(arr3[1]); //null,因?yàn)槲促x值
System.out.println(arr3[1][0]); //報(bào)錯(cuò)空指針,因?yàn)檫€未初始化
外層元素的初始化值為? ? null
內(nèi)層元素的初始化值,? ? ? ? 不能調(diào)用,否則會(huì)報(bào)空指針
7.數(shù)組使用中常用的算法
7.1數(shù)組元素的賦值(楊輝三角,回形數(shù)等)
Scanner scan = new Scanner(System.in);
? ? //練習(xí)1,求二維數(shù)組所有元素的和
? ? int[][] array = new int[][] {{3,-5,6},{2,8},{9,-2,5,7}};
? ? int sum = 0;
? ? for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
sum +=? array[i][j];
}
}
? ? System.out.println("二維數(shù)組的所有元素和是" + sum);
? ? /*練習(xí)2,
? ? ? * int[] x,y [];//此時(shí)表示聲明x為一維數(shù)組,y為二維數(shù)組
? ? ? * 因?yàn)?int[] a,b = int[] a 與 int[] b ,也就是 int[] x, int[] y[]
? ? ? * 在給x與y賦值后,以下選項(xiàng)可以編譯通過的是
? ? ? * 1,x[0] = y; // no
? ? ? * 2,y[0] = x; // yes
? ? ? * 3,y[0][0] = x;// no
? ? ? * 4,x[0][0] = y,// no
? ? ? * 5,y[0][0] = x[0];// yes
? ? ? * 6,x = y//no
? ? ? * 數(shù)組賦值需要滿足相同類型或者可以自動(dòng)類型提升
? ? ? */
? ? //練習(xí)三,使用二維數(shù)組打印一個(gè)指定行數(shù)楊輝三角
/*
* 1,第一行一個(gè)元素,第n行n個(gè)元素
* 2,每一行的第一個(gè)和最后一個(gè)是1
* 3,從第三行開始,對(duì)于非第一個(gè)元素和最后一個(gè)元素有
* yanghui[i][j]=yanghui[i-1][j-1] + yanghui[i-1][j]
*/
? ? //思路,對(duì)二維數(shù)組聲明賦值后打印
? ? //輸入行數(shù)
? ? System.out.println("請(qǐng)輸入要打印的楊輝三角行數(shù)");
? ? int line = scan.nextInt();
? ? int[][] array1 = new int[line][];//動(dòng)態(tài)聲明二維數(shù)組行數(shù)
? ? //聲明賦值二維數(shù)組
? ? for (int i = 0; i < array1.length; i++) {
array1[i] = new int[i+1];//聲明每行列數(shù)
array1[i][0] = 1;//每行第一個(gè)元素是1
array1[i][i] = 1;//每行最后一個(gè)元素是1
//可以寫成連續(xù)賦值的形式array1[i][0] = array[i][i] = 1;
//
for (int j = 0; j < array1[i].length; j++) {
if(j > 0 && j < i) {
array1[i][j]=array1[i-1][j-1] + array1[i-1][j];//每行其他元素滿足楊輝三角要求
}
}
/*第二種寫法,if在外層
* if(i > 1){
*? for(j = 1;j < array[i].length - 1;j++){
*? array1[i][j]=array1[i-1][j-1] + array1[i-1][j];
*? }
* }
*/
}
? ? ? ? //遍歷輸出楊輝三角
? ? for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
System.out.print(array1[i][j] + " ");
}
System.out.println();
}
7.2求數(shù)值型數(shù)組中元素的最大值,最小值,平均數(shù),總和
(要求所有元素都是兩位數(shù))
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.println(arr[i]+"\t");
}
//求數(shù)組的最大值
int maxValue = arr[0]; //
for(int i= 0; i< arr.length;i++) {
if(maxValue < arr[i]) {
maxValue = arr[i];
}
}
System.out.println("最大值為" + maxValue + "\t");
//求數(shù)組的最小值
int minValue = arr[0];
for(int i= 0; i< arr.length;i++) {
if(minValue > arr[i]) {
minValue = arr[i];
}
}
System.out.println("最小值為" + minValue + "\t");
//求數(shù)組的總和
int sum = 0;
for(int i= 0; i< arr.length;i++) {
sum += arr[i];
}
System.out.println("總和最小值為" + sum + "\t");
//求數(shù)組的平均數(shù)
int avgValue = sum / arr.length;
System.out.println("平均數(shù)為" + avgValue );
7.3數(shù)組的復(fù)制,反轉(zhuǎn),查找(線性查找,二分法查找)
String[] arr = new String[]{"AA","BB","CC","DD","EE","FF","GG"};
//數(shù)組的復(fù)制(區(qū)別于數(shù)組的賦值, arr=arr1)
String[] arr1 = new String[arr.length];
for(int i = 0;i <arr1.length; i++){
arr1[i] = arr[i];
//System.out.println(arr[i]);
//System.out.println(arr1[i]);
}
//數(shù)組的反轉(zhuǎn),利用一個(gè)臨時(shí)變量
for(int i = 0; i < arr1.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 < arr1.length; i++){
System.out.println(arr[i] + "\t");
}
}
//查找
//線性查找:
String dest = "BB";
boolean isFlag = true;
for(int i = 0; i < arr1.length; i++){
if(dest.equals(arr[i])){
System.out.println("找到了指定的元素,位置為:" + i);
isFlag = false;
break;
}
}
if(isFlag){
System.out.println("很遺憾,沒找到");
}
注:
若有2個(gè)數(shù)組,array1,array2.
array1 = array2;
并不是復(fù)制,而是將array1指向堆中array2所指向的地址.所以修改array1,array2也會(huì)變化
所以數(shù)組的復(fù)制,需要new一個(gè)新的數(shù)組,然后進(jìn)行元素的賦值array1[i]=array2[i]