1彤委、數(shù)組的概念
數(shù)組是多個(gè)相同類(lèi)型數(shù)據(jù)按一定順序排列的集合鞭铆,并使用一個(gè)名字命名,并通過(guò)編號(hào)的方式對(duì)這些數(shù)據(jù)進(jìn)行統(tǒng)一管理焦影。
特點(diǎn):
1.數(shù)組是有序排列的衔彻。
2.數(shù)組屬于引用數(shù)據(jù)類(lèi)型的變量。數(shù)組的元素偷办,既可以是基本數(shù)據(jù)類(lèi)型,也可以是引用數(shù)據(jù)類(lèi)型澄港。
3.創(chuàng)建數(shù)組對(duì)象會(huì)在內(nèi)存中開(kāi)辟一整塊連續(xù)的空間椒涯。
4.數(shù)組的長(zhǎng)度一旦確定,就不能修改回梧。
2废岂、一維數(shù)組的使用
2.1 一維數(shù)組的聲明和初始化
- 靜態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作同時(shí)進(jìn)行。
int[] ids = new int[]{1001, 1002, 1003, 1004};
- 動(dòng)態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作分開(kāi)進(jìn)行狱意。
String[] names = new String[5];
- 也是正確的寫(xiě)法(不是標(biāo)準(zhǔn)的寫(xiě)法)
int ids[] = {1001, 1002, 1003, 1004};
int[] ids = {1001, 1002, 1003, 1004}; // 不加new湖苞,類(lèi)型推斷
總結(jié):數(shù)組一旦初始化完成,其長(zhǎng)度就確定了详囤。
2.2 如何調(diào)用數(shù)組的指定位置的元素
names[0] = "姓名一";
names[1] = "姓名二";
names[2] = "姓名三";
names[3] = "姓名四";
names[4] = "姓名五";
2.3 如何獲取數(shù)組的長(zhǎng)度
屬性:length
System.out.println(names.length); // 5
2.4 如何遍歷數(shù)組
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
2.5 數(shù)組元素的默認(rèn)初始化值
- 數(shù)組元素是整型時(shí)财骨,默認(rèn)初始化值是
0
镐作。·
int[] arr = new int[4];
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]); // 0 0 0 0
}
- 數(shù)組元素是浮點(diǎn)型時(shí)隆箩,默認(rèn)初始化值是
0.0
该贾。
float[] arr1 = new float[4];
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]); // 0.0
}
-
char
類(lèi)型,默認(rèn)初始化值是ASSIC碼為0對(duì)應(yīng)的那個(gè)字符捌臊,為0
或'\u000'
杨蛋,而非'0'
。
char[] arr2 = new char[4];
arr2[0] == 0; // true
- 數(shù)組元素是
boolean
時(shí)理澎,默認(rèn)初始化值是false
逞力。 - 數(shù)組元素是引用數(shù)據(jù)類(lèi)型時(shí),默認(rèn)初始化值是
null
糠爬。
2.6 數(shù)組的內(nèi)存解析
內(nèi)存結(jié)構(gòu)(JVM當(dāng)中實(shí)現(xiàn)的)寇荧,所以,不同的jdk當(dāng)中秩铆,內(nèi)存的結(jié)構(gòu)也有所區(qū)別砚亭。以下講解一個(gè)比較穩(wěn)定的結(jié)構(gòu)。
列舉內(nèi)存當(dāng)中幾個(gè)主要的結(jié)構(gòu):
- 棧(stack):主要存放局部變量
- 堆(heap):主要存放
new
出來(lái)的結(jié)構(gòu)殴玛,如數(shù)組捅膘、對(duì)象。 - 方法區(qū)滚粟,包含常量池寻仗,靜態(tài)域(靜態(tài)的一些變量),和一些類(lèi)加載的信息凡壤。
3署尤、二維數(shù)組的使用
3.1 二維數(shù)組的聲明和初始化
- 靜態(tài)初始化:數(shù)組的初始化和數(shù)組元素的賦值操作同時(shí)進(jìn)行。
int[][] arr = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
- 動(dòng)態(tài)初始化1:數(shù)組的初始化和數(shù)組元素的賦值操作分開(kāi)進(jìn)行亚侠。
String[][] arr1 = new String[3][2];
- 動(dòng)態(tài)初始化2:數(shù)組的初始化和數(shù)組元素的賦值操作分開(kāi)進(jìn)行曹体。
String[][] arr1 = new String[3][];
- 也是正確的寫(xiě)法(不是標(biāo)準(zhǔn)的寫(xiě)法)
int arr2[][] = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[] arr3[] = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[] arr4[] = {{1, 2, 3}, {4, 5}, {6, 7, 8}};
總結(jié):數(shù)組一旦初始化完成,其長(zhǎng)度就確定了硝烂。
3.2 如何調(diào)用數(shù)組的指定位置的元素
System.out.println(arr[0][0]);
String[][] arr1 = new String[3][];
// 報(bào)錯(cuò)
// System.out.println(arr1[0][0]);
3.3 如何獲取數(shù)組的長(zhǎng)度
屬性:length
3.4 如何遍歷二維數(shù)組
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]);
}
}
3.5 數(shù)組元素的默認(rèn)初始化值
規(guī)定:二維數(shù)組分為外層數(shù)組的元素箕别,內(nèi)層數(shù)組的元素。
int[][] arr = new int[4][3];
// 外層元素:arr[0], arr[1]等
// 內(nèi)層元素:arr[0][0], arr[1][2]等
- 針對(duì)初始化方式一滞谢,比如:
int[][] arr = new int[4][3];
外層元素的初始化值為:地址值串稀。
內(nèi)層元素的初始化值為:與一維數(shù)組初始化情況相同。 - 針對(duì)初始化方式二狮杨,比如:
int[][] arr = new int[4][];
外層元素的初始化值為:null
母截。
內(nèi)層元素的初始化值為:不能調(diào)用,否則報(bào)錯(cuò)橄教。
3.6 二維數(shù)組的內(nèi)存解析
4清寇、練習(xí)
4.1 使用二維數(shù)組打印一個(gè)10行的楊輝三角
int [][] arr = new int[10][];
for (int i = 0; i < 10; i++) {
arr[i] = new int[i + 1];
arr[i][0] = arr[i][i] = 1;
for (int j = 0; j <= i; j++) {
if ( j == 0 || j == i) {
System.out.print(1);
}
if (i > 1) {
int num = arr[i - 1][j - 1] + arr[i - 1][j];
System.out.print(num);
arr[i][j] = num;
}
}
System.out.println();
}
5喘漏、數(shù)組中涉及到的常見(jiàn)算法
5.1 數(shù)組元素的賦值(楊輝三角、回形數(shù)等)
5.2 求數(shù)值型數(shù)組中元素的最大值颗管、最小值陷遮、平均數(shù)、總和等
5.3 數(shù)組的復(fù)制垦江、反轉(zhuǎn)帽馋、查找(線(xiàn)性查找、二分查找)
- 線(xiàn)性查找——從前往后依次查找
5.4 數(shù)組元素的排序算法
- 冒泡排序
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;
}
}
}
6比吭、Arrays工具類(lèi)的使用
java.util.Arrays
類(lèi)即為操作數(shù)組的工具類(lèi)绽族,包含了用來(lái)操作數(shù)組(比如排序和搜索)的各種方法。
-
boolean equals(int[] a, int[] b)
:判斷兩個(gè)數(shù)組是否相等衩藤。
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
// 比較每個(gè)位置上的元素是否都相等
Arrays.equals(arr1, arr2); // false
-
String toString(int[] a)
:輸出數(shù)組信息吧慢。
Arrays.toString(arr1); // [1, 2, 3, 4] 字符串類(lèi)型
-
void fill(int[] a, int val)
:將指定值填充到數(shù)組之中。
Arrays.fill(arr1, 10); // [10, 10, 10, 10]
-
void sort(int[] a)
:對(duì)數(shù)組進(jìn)行排序赏表。
Arrays.sort(arr2); // [1, 2, 3, 4]
-
int binarySearch(int[] a, int key)
:對(duì)排序后的數(shù)組進(jìn)行二分法檢索指定的值检诗。
說(shuō)明:返回指定元素對(duì)應(yīng)的下標(biāo);沒(méi)有找到指定元素時(shí)瓢剿,會(huì)返回一個(gè)負(fù)數(shù)逢慌。因此,可以根據(jù)返回值是否>= 0
來(lái)判斷是否找到該元素间狂。
int[] arr3 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};
int index = Arrays.binarySearch(arr3, 210); // 8
7攻泼、數(shù)組中常見(jiàn)的異常
- 數(shù)組角標(biāo)越界的異常:
ArrayIndexOutOfBoundsExcetion
int[] arr = new int[]{1, 2, 3, 4};
System.out.println(arr[4]);
System.out.println(arr[-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());