第1章 陣列
3.1陣列的概述
1.陣列的理解
- 陣列(Array),是多個相同型別資料按一定順序排列的集合,并使用同一個名字命名,并通過編號的方式對這些資料進行統一管理.
2.陣列常見的概念
-
陣列名
-
下表(或索引)
-
元素
-
陣列的長度
3.陣列的特點
- 陣列本身是參考資料型別,而陣列中的元素可以使任何資料型別,包括基本資料型別和參考資料型別
- 創建陣列物件會在記憶體中開辟一塊連續的空間,而陣列名參考的是這塊連續空間的首地址
- 陣列的長度一旦確定,就不能修改
- 我們可以直接通過下表(或索引)的方式吊應指定位置的元素,速度很快
4陣列的分類
- 按照維度:一維陣列,二維陣列,三維陣列...
- 按照元素的資料型別分:基本資料型別元素的陣列,參考資料型別元素的陣列(即物件陣列)
3.2一維陣列的使用
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[] arr1= new int[];
//int[5] arr1= new int[5];
//int[] arr1= new int[3]{1,2,3};
//也是正確的寫法(不建議使用)
String names[] = new String[5];
int[] arr4 = {1,2,3,4,5};//型別推斷,省略new int[]
//總結:陣列一旦初始化完成,其長度就確定了.
2.如何呼叫陣列的指定位置的元素
//通過角標的方式呼叫
//陣列的角標(或索引)從0開始,倒數租的長度-1結束
names[0] = "王";
names[1] = "王";
names[2] = "張";
names[3] = "孫";
names[4] = "王";//charAt(0)
//names[5] = "周";
3. 如何獲取陣列的長度
//屬性:length
System.out.println(names.length)//5
System.out.println(ids.length)
4. 如何遍歷陣列的長度
/*
System.out.println(names[0]);
System.out.println(names[1]);
System.out.println(names[2]);
System.out.println(names[3]);
System.out.println(names[4]);
*/
//回圈遍歷陣列
for(int i = 0; i < names.length;i++){
System.out.println(names[i]);
}
5. 陣列元素的默認初始化值
- 陣列元素是整型:0
- 陣列元素是浮點型:0.0
- 陣列元素是字符型:\u0000
- 陣列元素是布爾型:false
- 陣列元素是物件(參考資料型別):null
int[] arr = new int[4];
for(itn i = 0;i < arr.length;i++){
System.out.println(arr[i]);//0
}
System.out.println("*********");
short[] arr1 = new short[4];
for(itn i = 0;i < arr1.length;i++){
System.out.println(arr1[i]);//0
}
System.out.println("*********");
float[] arr2 = new float[4];
for(itn i = 0;i < arr2.length;i++){
System.out.println(ar2r[i]);//0
}
System.out.println("*********");
char[] arr3 = new char[4];
for(itn i = 0;i < arr3.length;i++){
System.out.println(arr3[i]);//0
}
System.out.println("*********");
6. 陣列的記憶體決議


3.3多維陣列的使用
1.理解
對于二維陣列的理解,我們可以看成是一維陣列array1又作為另一個一維陣列array2的元素而存在.騎士,從陣列底層的運行機制來看,其實沒有多維陣列.
2.二維陣列的使用
1.二維陣列的宣告和初始化
int[] arr = new int[]{1,2,3};//一維陣列的靜態初始化
//靜態初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
//動態初始化1
Stringp[][] arr2 = new String[3][2];
//動態初始化2
Stringp[][] arr3 = new String[3][];
//錯誤的情況
//String[][] arr4 = new String[][4];
//String[4][3] arr5 = new String[][];
//int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};
//也是正確的寫法(不建議使用)
String[] arr4[] = new String[3][2];
String arr5[][] = new String[3][2];
int[][] arr6 = {{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[0][1]);//null
3.如何獲取陣列的長度
System.out.println(arr6.length);//3
System.out.println(arr6[0].length);//3
System.out.println(arr6[1].length);//2
4.如何遍歷陣列
for(int i = 0;i < arr6.length;i++){
for(int j = ; j <arr6[i].length;j++){
System.out.println(arr6[i][j] + " ");
}
}
5.陣列元素的默認初始化值
規定:二維陣列分為外層陣列的元素,內層陣列的元素
//針對初始化方式一:比如:int[][] arr = new int[4][3];
// 外層元素的初始化值為:地址值
// 內層元素的初始化值為:與一維陣列初始化情況相同
//針對初始化方式二:比如:int[][] arr = new int[4][];
// 外層元素的初始化值為:null
// 內層元素的初始化值為:不能呼叫,否則報錯
itn[][] arr = new int[4][3];
System.out.println(arr[0]);//[I@15db9742,表示一維整型地址
System.out.println(arr[0][0]);//0
//System.out.println(arr);//[[I@6d06d69c,表示二維整型地址
System.out.println("*********");
float[][] arr1 = new float[4][3];
System.out.println(arr1[0]);//[F@6d06d69c,表示一維float型地址,將上一句注釋掉,發現分配的記憶體地址一樣
System.out.println(arr1[0][0]);//0.0
System.out.println("*********");
String[][] arr2 = new String[4][2];
System.out.println(arr2[1]);//[Ljava.lang.String;@7852e922,表示一維String型地址
System.out.println(arr2[1][1]);//null,空地址
System.out.println("*********");
double[][] arr3 = new double[4][];
System.out.println(arr3[1]);//null,空地址
System.out.println(arr3[1][0]);//報錯,NullPointerException,空指標例外
6.二維陣列的記憶體決議




3.4陣列中涉及的常見演算法
1.陣列元素的復制(楊輝三角,回形數等)
package com.atguigu.exer;
//楊輝三角
public class YangHuiTest {
public static void main(String[] args) {
//1 宣告二維陣列,對外圍陣列初始化
int[][] yanghui = new int[10][];
//2 給二維陣列賦值
for(int i = 0;i < yanghui.length;i++) {
//2.1 給二維陣列的內圍陣列初始化
yanghui[i] = new int[i + 1];
//2.2 給首尾元素賦值
yanghui[i][0] = yanghui[i][i] = 1;
for(int j = 1; j < yanghui[i].length - 1; j++) {
//2.3 給非首尾元素賦值
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] + "\t");
}
System.out.println();
}
}
}
package com.atguigu.exer;
/*
*拓展
*創建一個長度為6的int型陣列,要求陣列元素的值都在1-30之間,且是隨機賦值.
*同時,要求元素的值各不相同.
*/
public class ArrayExr {
public static void main(String[] args) {
//1 宣告并初始化陣列
int[] arr = new int[6];
//2 給陣列元素賦值
for(int i = 0;i < arr.length;i++){
//2.1 隨機生成[1,30)的數并賦值
arr[i] = (int) (Math.random() * 29 + 1);
//2.2回圈比較生成的數是否已存在
for(int j = 0;j < i;j++){
//若存在
if(arr[i] == arr[j]){
i--;//陣列下標(索引)回退,減一
break;//跳出回圈
}
}
}
//3 遍歷陣列
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i] + "\t");
}
}
}
package com.atguigu.exer;
import java.util.Scanner;
/*
* 此題了解!!!
*
* 回形數格式方陣的實作
* 從鍵盤輸入一個整數(1~20)
* 則以該數字為矩陣的大小,把 1,2,3…n*n 的數字按照順時針螺旋的形式填入其中,例如: 輸入數字2,則程式輸出: 1 2
* 4 3
* 輸入數字 3,則程式輸出:1 2 3
* 8 9 4
* 7 6 5
* 輸入數字 4, 則程式輸出:
* 1 2 3 4
* 12 13 14 5
* 11 16 15 6
* 10 9 8 7
*/
public class Huixing {
/**
* @param args
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("輸入一個數字:");
int len = scanner.nextInt();
int[][] arr = new int[len][len];
int s = len * len;
/*
* k = 1:向右 k = 2:向下 k = 3:向左 k = 4:向上
*/
int k = 1;
int i = 0, j = 0;
for (int m = 1; m <= s; m++) {
if (k == 1) {
if (j < len && arr[i][j] == 0) {
arr[i][j++] = m;
} else {
k = 2;
i++;
j--;
m--;
}
} else if (k == 2) {
if (i < len && arr[i][j] == 0) {
arr[i++][j] = m;
} else {
k = 3;
i--;
j--;
m--;
}
} else if (k == 3) {
if (j >= 0 && arr[i][j] == 0) {
arr[i][j--] = m;
} else {
k = 4;
i--;
j++;
m--;
}
} else if (k == 4) {
if (i >= 0 && arr[i][j] == 0) {
arr[i--][j] = m;
} else {
k = 1;
i++;
j++;
m--;
}
}
}
// 遍歷
for (int m = 0; m < arr.length; m++) {
for (int n = 0; n < arr[m].length; n++) {
System.out.print(arr[m][n] + "\t");
}
System.out.println();
}
}
}
2.求數值型陣列中元素的最大值,最小值,平均數,總和等
package com.atguigu.exer;
import java.util.Arrays;
public class ArraysTest1 {
public static void main(String[] args) {
int[] arr = new int[10];
for(int i = 0;i < arr.length;i++){
arr[i] = (int) (Math.random()*90 + 10);
}
System.out.println(Arrays.toString(arr));
System.out.println("*******************");
//求陣列元素最大值
int maxValue = https://www.cnblogs.com/guwanle/p/arr[0];
for (int i = 1; i < arr.length; i++) {
if(maxValue < arr[i]){
maxValue = arr[i];
}
}
System.out.println("元素最大值:" + maxValue);
//求陣列元素最小值
int minValue = https://www.cnblogs.com/guwanle/p/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 average = sum / arr.length;
System.out.println("元素平均值:" + average);
}
}
3.數組的復制,反轉,查找(線性查找,二分法查找)
package com.atguigu.exer;
import java.util.Arrays;
/*
*陣列的復制
*/
public class ArraysTest2 {
public static void main(String[] args) {
int[] arr1 = new int[]{2,3,5,7,11,13,17,19};
int[] arr2;
//列印arr1的元素
System.out.println(Arrays.toString(arr1));
//復制
arr2 = arr1;//不是真正的復制
// //復制
// arr2 = new int[arr1.length];//是真正的復制
// for(int i =0;i < arr2.length;i++){
// arr2[i] = arr1[i];
// }
//修改arr2的值
for(int i = 0;i < arr2.length;i++){
if(arr2[i] % 2 == 0){
arr2[i] = i;
}
}
//列印arr1的元素
System.out.println(Arrays.toString(arr1));
}
}
package com.atguigu.exer;
import java.util.Arrays;
import javax.xml.transform.Templates;
/*
* 陣列的反轉
*/
public class ArraysTest3 {
public static void main(String[] args) {
String[] arr = new String[]{"AA","BB","CC","DD","EE"};
System.out.println(Arrays.toString(arr));
//反轉
//方法一
// for(int i = 0; i < arr.length / 2;i++){
// String temp = arr[i];
// arr[i] = arr[arr.length - 1 - i];
// arr[arr.length - 1 - i] = temp;
// }
//方法二
for(int i = 0,j = arr.length - 1;i < j;i++,j--){
String temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
System.out.println(Arrays.toString(arr));
}
}
package com.atguigu.exer;
import java.util.Arrays;
import javax.print.attribute.standard.Destination;
/**
* 陣列的線性查找
* @author Administrator
*
*/
public class ArraysTest {
public static void main(String[] args) {
int[] arr = new int[100];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random()*90 + 10);
}
System.out.println(Arrays.toString(arr));
int dest = 20;
boolean flag = false;
for (int i = 0; i < arr.length; i++) {
if(arr[i] == dest){
System.out.println("找到指定元素,索引為" + i);
flag = true;
}
}
if(!flag){
System.out.println("很遺憾,沒有找到指定元素");
}
}
}
package com.atguigu.exer;
import java.awt.HeadlessException;
import javax.print.attribute.standard.Destination;
/**
* 陣列的二分查找法
* @author Administrator
*
*/
public class BinarSearchMethod {
public static void main(String[] args) {
int[] arr = new int[]{-42,-12,-4,0,12,45,56,77};
int dest = 13;
int head = 0;
int end = arr.length - 1;
while(head <= end){
int mid = (head + end) / 2;
if(arr[mid] == dest){
System.out.println("找到指定元素,位置為:" + mid);
break;
}else if(arr[mid] > dest){
end = mid - 1;
}else{
head = mid + 1;
}
}
if(head > end){
System.out.println("很遺憾,沒有找到指定元素");
}
}
}
4.陣列元素的排序演算法
3.5Arrays工具類的使用
| 序號 | 方法名 | 描述 |
|---|---|---|
| 1 | boolean equals(int[] a,int[] b) | 判斷兩個陣列是否相等 |
| 2 | String to String(int[] a) | 輸出陣列資訊 |
| 3 | void fill(int[] a,int[] val) | 將指定值填充到陣列之中 |
| 4 | void sort(int[] a) | 對陣列進行排序 |
| 5 | int binary Search(int[] a,int key) | 對排序后的陣列進行二分法檢索指定的值 |
package com.atguigu.exer;
import java.util.Arrays;
public class ArrayTest {
public static void main(String[] args) {
//1.boolean equals(int[] a,int[] b)
int[] arr1 = new int[]{1,2,3};
int[] arr2 = new int[]{1,3,2};
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[]{4,23,56,346,444,555};
int index = Arrays.binarySearch(arr3,23);
System.out.println(index);//1
}
}
3.6陣列中常見的例外
1.陣列角標越界的例外:ArrayIndexOutOfBoundsException
int[] a = new int[]{1,2,3};
//越界訪問例子
//a[-1];
//a[a.length];
2.空指標例外:NullPointerException
int[][] b = new int[4][];
//空指標例外例子
//b[0][0];
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/467910.html
標籤:Java
