數組
問題引入
需求:計算一個班級100人的考試總分;
數組的概念
數組,就是一種容器,它可以保存多個相同類型的數據;而且數組一旦創建,容量不能更改
數組的定義格式
數組使用[] 表示;定義格式是:
數據類型[] 數組名(變量名) = new 數據類型[數組的容量];
int arr[] = new int[10];
int []arr = new int[10];
數組的使用
數組元素的存取&數組的索引
結論:
Java中,數組都具有索引,索引實際上就是數組中每個存儲單元的編號;
向數組中保存數據和取出數據,都是通過索引進行的;
索引的特點是:
從0開始,依次遞增;最大索引就是數組容量減一;
數組的遍歷&數組的length屬性
在每個數組中,都有一個length屬性,表示數組的容量;
使用方式是:
數組名.length;
注意:因為數組一旦創建,容量就固定不變,所以數組的length屬性也不能改變;
如果對數組的操作(賦值或者取值)沒有規律,那麼就不能使用循環來簡化;
數組的內存原理(了解)
java的內存組成
數組的內存圖解
需求1:畫出下面代碼執行的內存圖解:
public static void main(String[] args)
{
int[] array = new int[3];
array[0] = 10;
int a = array[0];
System.out.println(a);
System.out.println(array);
array = null;
System.out.println(array);
}
內存圖解:
需求2:下面的代碼執行結果是什麼?為什麼?
public static void main(String[] args) {
int[] array = new int[3];
int[] arr = array;
array[1] = 100;
System.out.println(arr[1]);//100
arr[1] = 50;
System.out.println(array[1]);//50
}
結論:
如果一個變量中保存的是實際數據本身, 這個變量就是基本類型變量;
如果一個變量是引用類型的變量,變量空間中保存的就一定是一個內存地址(或者是默認值null)
引用傳遞和值傳遞
如果是引用類型的變量,那麼在變量中保存的是堆內存中的空間地址;
如果是引用類型的變量進行賦值,實際傳遞的是保存在變量中的地址,像這種傳遞數據的方式就叫做引用傳遞(傳遞的是內存地址);
如果是基本類型的變量進行賦值,實際傳遞的是保存在變量中的常量值,叫做按值傳遞;
因為值傳遞傳遞的是實際數據,所以不同的基本類型的變量的修改,相互之間沒有影響;
應為引用傳遞傳遞的是堆內存中的引用地址,所以如果不同的變量保存的是相同的引用地址,那麼他們都指向同一塊空間;任何一個變量對空間的修改,都已影響其他變量;
數組使用中的常見問題
NullPointerException
ArrayIndexOutOfBoundsException
當試圖使用不存在的下標(超出範圍的下標)來操作數組的時候,就會出現這個問題;
數組的第二種定義格式
數組定義格式:
數據類型[] 數組名 = new 數據類型[數組容量];
數組名[索引] = 數據;
如果在定義數組時已經知道數組中會保存什麼數據,就可以使用另一種定義方式,在創建數組的同時將數據保存在數組中;
格式:
數據類型[] 數組名 = new 數據類型[]{數據1,數據2,數據3,數據4……數據n};
注意:使用這種方式,不能在中括號中寫數組的容量;
這種定義格式的簡寫形式:
數據類型[] 數組名 = {數據1,數據2,數據3,數據4……數據n};
注意:簡寫只是為了書寫方便,實際上編譯器還是會加上new 這一部分;
注意:使用簡寫形式時,不能將數組變量的聲明和賦值寫成兩行;
數組的練習
數組平均值:
例子:求下列數字的平均值:1.0,2.4,3.5,4.3,5.1,6.8,7.2,8,9,10
數組求最大值
例子:求下列數字的最大值:1.0,2.4,3.5,4.3,5.1,6.8,7.2,8,9,10
將數組中的元素轉為指定格式的字符串
例子:給定數組,返回指定格式的字符串;例如:將數組{1,2,3,4}轉為字符串:"[1,2,3,4]";
將數組中元素倒序(反轉)
例子:數組{1,2,3,4,5}倒序後為{5,4,3,2,1};
數組的查找
數組查找,就是根據給定的數據,查找這個數據在數組中的位置;如果找到了,就返回相應的索引;如果沒有找到,就返回-1;
普通查找
普通查找,就是通過遍歷整個數組,一個一個數據的和要找的數據比較;如果有相同的數據出現,就說明在數組中存在
和要找的數據一樣的數據,就可以直接返回這個數據的索引;
使用普通查找,一般找到的是數據第一次出現的位置;
二分查找
如果數組中的數據是有序的,就可以使用二分查找法快速查找;
有序:就是從小到大或者從大到小有規律的排列;
數組的排序
數組排序的概念
排序:按照一定規律,將數組中的元素從無序變為有序;
升序:就是從小往大、從低到高……
降序:和升序剛好相反
選擇排序
排序的算法:選擇排序,冒泡排序,快速排序,歸併排序;希爾排序;堆排序;插入排序;
在實際開發中,排序都已經寫好了,直接調用JDK中的函數就行;
為了面試,我們掌握一種排序算法就行;
選擇排序的思想,就是不斷在沒有排序的部分數據中,找到最小(或者最大的)數據,移到數組的前面,一直到整個數組全部有序(只剩最後一個數據沒有比較的時候,數組就有序了);
Arrays數組工具介紹
上面介紹了數組的一些練習,而針對數組的常見操作,Java已經提供好了,並書寫在Arrays中。在程序中是可以直接使用的。
public class Demo {
public static void main(String[] args) {
// 定義數組
int[] arr = { 23, 15, 67, 25, 90, 33 };
// 列印數組
System.out.println( Arrays.toString(arr) );
// 數組排序
Arrays.sort(arr);
System.out.println( Arrays.toString(arr) );
}
}
程序運行結果:
二維數組介紹
什麼是二維數組
數組是一種容器,可以保存多個相同類型的數據;
在內存的角度看,數組就是內存中連續在一起的多個存儲空間;
如果一個數組中保存的數據的類型就是數組類型,那麼數組中每個存儲單元中都保存的是一個其他數組的內存地址;
這種數組的數組就叫做二維數組;
二維數組使用演示
二維數組的格式
int[][] arr = new int[2][3];//表示創建一個二維數組;這個二維數組的每一個元素都是一個一維數組;
//上面聲明中的數字2表示聲明的二維數組的長度是2;3表示二維數組中每個一維數組的長度是3;
二維數組的使用
數組使用總結
數組的特點
1、 數組是容器,可以保存相同類型的數據;
2、 數組是容器,都具有容量,通過length屬性獲取;一個數組創建完成之後,容量大小不可改變;
3、 數組中的元素都具有索引,索引是整數,從0開始,連續遞增,最大索引是數組容量減一;
數組使用場景
1、 有多個數據要保存,數據類型一樣;
2、 數據的數量要確定;(如果不確定,就不知道創建多大的數組合適)
如果數據很多,但是數據類型不一樣,或者數據總數也不確定;這個時候就要使用新的容器:集合
以上