Java小白入門教程(8)——數組

提綱:

<code>1、方法的概念 2、方法語法 3、方法使用 4、參數 5、返回值 6、方法的分類 7、作業/<code>

一、數組的概念
1.1、為什麼使用數組

<code>如果說程序中,需要存儲大量的相同類型的一組數據,如果直接使用變量來進行存儲,每個變量只能存儲一個值,就需要大量的變量。 1、代碼過於臃腫 2、程序的可讀性差 3、數據維護較差/<code>

1.2、數組的概念

<code>數組的概念: 就是一組相同數據類型的數據。內存上是開闢的連續的內存空間。/<code>

1.3、數組的特點?

<code>1、定長。容量固定。數組一旦創建後,那麼長度不能更改。(容量,長度,都是指存儲的數量) 2、存儲的數據類型必須都一致。 3、在內存中空間連續挨個。 4、數組是引用類型的數據,存在棧和堆的地址引用關係。 Java中:兩大數據類型 基本:4類8種 引用:數組,對象,集合。。。。/<code>

二、數組的使用

2.1、數組的使用

<code>step1:先創建數組 step2:使用數組:存儲數據,訪問數據。/<code>

2.2、數組的語法

<code>創建數組的語法: 數據類型[] 數組名 = new 數據類型[長度、容量、個數]; 數據類型 數組名[] = new 數據類型[長度];//也可以 使用的語法: 數組名[index],操作數組 index:因為一個數組存儲了多個數據(也叫元素),每個元素都有一個下標,也叫索引,index。理解起來就是給每個數據排個編號,固定從0開始,0,1,2,3,4.。。。到長度減1。 數組的下標不能超出這個範圍。否則就會下標越界:java.lang.ArrayIndexOutOfBoundsException/<code>

示例代碼:

<code>public class Test1Array { public static void main(String[] args){ //1.變量的定義 int num = 10; System.out.println(num); ​ //2.數組 /* 創建數組:語法格式 數據類型[] 數組名 = new 數據類型[容量/長度/個數]; ​ 數組是引用類型的數據: a中存儲的是數組的實際的地址。 */ ​ int[] a = new int[5];//聲明一個數組,並創建出來,然後就可以使用這個數組了。 System.out.println(a); ​ //3.使用數組:存儲數據 a[0] = 10; a[1] = 20; a[2] = 30; a[3] = 40; a[4] = 50; //a[5] = 100;//java.lang.ArrayIndexOutOfBoundsException ​ //獲取數據 System.out.println(a[0]);//打印數組的第一個元素 System.out.println(a[1]);//打印數組的第二個元素 System.out.println(a[2]);//打印數組的第三個元素 System.out.println(a[3]);//打印數組的第四個元素 System.out.println(a[4]);//打印數組的第五個元素 ​ //課堂練習:創建一個數組, 存儲班級5位同學的性別。 char[] arr2 = new char[5]; arr2[0] = '男'; arr2[1] = '男'; arr2[2] = '男'; arr2[3] = '女'; arr2[4] = '女'; ​ //打印悄悄 System.out.println(arr2[0]); System.out.println(arr2[1]); System.out.println(arr2[2]); System.out.println(arr2[3]); System.out.println(arr2[4]); ​ } }/<code>

2.3、內存分析(擴展)

<code>內存:存儲數據 A:棧,存放的是基本數據類型的變量,以及引用類型變量的引用。 特點:函數中的變量所佔用的空間,執行之後就會銷燬。 B:堆,存放的是new出來的東西。 特點:執行之後,堆裡存儲的內容(對象等),會被標記為垃圾,但是不會立即被銷燬,而是等待系統的垃圾回收機制來回收(GC)。 JVM,GC(Grabage Collection) /<code>


2.4、數組的長度

<code>獲取數組的長度:length,數組的一個屬性。 數組名.length--->獲取這個數組的長度。/<code>


2.5、使用循環遍歷數組

2.5.1、普通的循環

<code>1、遍歷:依次訪問數組中每個元素。可以賦值,可以取值。 2、因為操作數組,就是數組名字配合下標,而下標固定都是從0開始,到長度減1。 for(int i = 0;i < arr2.length;i++){ System.out.println(arr2[i]); }/<code>

示例代碼:

<code>class Test2ArrayFor { public static void main(String[] args) { //定義了一個數組,存儲了5個學生的性別。 char[] arr2 = new char[5]; arr2[0] = '男'; arr2[1] = '男'; arr2[2] = '男'; arr2[3] = '女'; arr2[4] = '女'; ​ /* System.out.println(arr2[0]); System.out.println(arr2[1]); System.out.println(arr2[2]); System.out.println(arr2[3]); System.out.println(arr2[4]); */ ​ //藉助循環來打印數組:for,while,do-while循環 ​ for(int i = 0;i

< arr2.length;i++){ //i:0,1,2,3,,5 System.out.println(arr2[i]); //arr2[0],arr2[1],arr2[2],arr2[3],arr2[4] } ​ ​ System.out.println(arr2.length);//專門用於獲取一個數組的長度,5 //課堂練習1:定義一個int類型的數組,求該數組中所有元素的總和。 ​ //課堂練習2:統計這個數組中元素的平均值。 } } ​/<code>


2.5.2、for-each循環

<code>for-each循環:【擴展】 增強for循環:JDK1.5的版本出現的。 特定的用法:專門用於獲取數組中的每一個元素的值。 語法結構: for(數據類型 變量名 : 數組名){ System.out.println(變量名); } 工作原理: for(int e :arr){ System.out.println(e); } int e,定義變量e, 依次獲取數組的元素,賦值給e 注意點: A:for-each只能獲取數組的數據,但是不能給數組進行賦值 B:for-each,在代碼這個層面,不能操作下標。/<code>

示例代碼:

<code>public class Test1ForEach { public static void main(String[] args){ /* 循環的遍歷:依次獲取裡面的每一個元素 方法一:一個一個的獲取 ​ 方法二:普通的循環:for循環 ​ 方法三:for-each循環: for(數據類型 變量名 : 數組名){ System.out.println(變量名); } ​ element,元素。數組中存儲的數據-->數組的元素。 */ ​ int[] arr = new int[4]; arr[0] = 1; arr[1] = 4; arr[2] = 3; arr[3] = 5; //方法一: System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[3]); ​ //方法二: for(int i=0;i < arr.length;i++){ System.out.println("--->" + arr[i]); } ​ ​ //方法三: /* index-->0,1,2,3 arr--->[1,4,3,5] ​ 工作原理: int e,定義變量e, 依次獲取數組的元素,賦值給e */ for(int e : arr){ //int e = 1; //e = 4; //e = 3; //e = 5; System.out.println(e); } ​ System.out.println("------------------"); ​ //普通的for循環賦值 int[] arr2 = new int[5];//1,3,5,7,9 for(int i = 0;i/<code>

2.6、數組中的默認值

<code>數組的默認值,就是數組創建後,裡面存儲的默認的數據。 數組的引用存在棧內存中,數組本身存在堆內存中。 數組創建完,就有默認的數據了。 數組中存儲的默認值: 數組中是有默認值的 整數:0 小數:0.0 字符:\u0000 布爾:false 其他:null ​/<code>

示例代碼:

<code>class Test2DefaultValue { public static void main(String[] args) { /* 數組中存儲的默認值: 數組中是有默認值的 整數:0 小數:0.0 字符:\u0000 布爾:false 其他:null ​ ​ arr[i]? 1.先根據arr中存儲的地址,找到這塊堆內存的數組元素。 2.找到這塊數組內存後,根據i來獲取對應的空間 */ ​ int n ;//可能尚未初始化變量n System.out.println(n); ​ int[] arr = new int[5]; ​ for(int i = 0;i/<code>


2.7、創建數組的其他語法

<code>/* 動態創建數組:先創建數組,然後再根據下標一個一個存儲數據。 A:先聲明,再創建(分配內存空間) 數據類型 [] 數組名; 數組名 = new 數據類型[長度]; ​ B:聲明並創建 數據類型 [] 數組名 = new 數據類型[長度]; 數據類型 數組名[] = new 數據類型[長度]; ​ ​ //靜態創建數組:聲明,創建,賦值一起寫完。 C:聲明,創建,並賦值 數據類型[] 數組名 = {數值1,數值2,數值3,數值4.。。。}; //=左邊聲明數組,=右邊,會先根據{}中數據的個數,然後再將{}中數據,按照順序存儲進去。 完成了幾件事: 1.先聲明:int[] c 2.根據{}中數組值的個數,開闢堆內存 3.將{}中的數組值,依次按照順序存入數組中 D:聲明,創建,並賦值 數據類型[] 數組名 = new 數據類型[]{數值1,數值2,數值3,數值4.。。。} *//<code>

示例代碼:

<code>class Test3ArrayCreate { public static void main(String[] args) { //創建方式1:先聲明,再創建 int[] a = null;//引用類型默認賦值null a = new int[5];//創建,有new表示開闢堆內存,創建數組了,才可以使用數組。 //創建方式2:聲明和創建寫一起 int[] b = new int[5]; System.out.println(a); ​ //創建方式3:聲明,創建,賦值,寫一起 int[] c = {1,2,3,4,5}; /* 完成了幾件事: 1.先聲明:int[] c 2.根據{}中數組值的個數,開闢堆內存 3.將{}中的數組值,依次按照順序存入數組中 */ System.out.println(c.length); for(int e :c){ System.out.println(e); } ​ //創建方式4: int[] d = new int[]{1,2,3,4,5}; System.out.println(d.length); ​ ​ ​ int[] e; e = new int[]{1,2,3,4,5}; for(int i:e){ System.out.println(i); } ​ } } ​/<code>

2.8、數組的地址轉移

<code>Java中的數據分為兩大類: 基本類型:4類8種 操作的都是數值本身 引用類型:數組 操作的是地址 ​ 基本類型進行賦值:數值 引用類型進行賦值:地址/<code>

示例代碼:

<code>class Test4ArrayAddress { public static void main(String[] args) { /* 數組:引用類型的數據 數組名,存儲是引用地址。 */ ​ int[] a = new int[3]; System.out.println(a.length);//3 System.out.println(a);//a數組的地址 System.out.println(a[0]);//0 ​ a[0] = 1; a[1] = 2; a[2] = 3; ​ int[] b = {4,5,6,7}; System.out.println(b.length);//4 System.out.println(b);//b的地址 System.out.println(b[0]);//4 ​ int[] c = a;//將a的值賦值給c,就是將a存儲的數組的地址賦值給c //a和c存儲的地址相同,那麼就指向了同一個數組 System.out.println(c.length);//3 System.out.println(c);//a的地址 System.out.println(c[0]);//1 ​ c[0] = 100; System.out.println(a[0]); System.out.println(b[0]); System.out.println(c[0]); ​ ​ b = c; ​ b[1] = 200; System.out.println(a[1]);//200 System.out.println(b[1]);//200 System.out.println(c[1]);//200 ​ System.out.println("Hello World!"); } } ​/<code>

內存分析:

三、數組在方法中的使用

3.1、數組作為參數

數組是引用類型:傳遞的是地址。就是參數也會指向這塊內存。當方法結束的時候,參數就銷燬了。

<code>class Test5ArrayMethod { ​ //設計一個方法,用於打印數組 public static void printArray(int[] arr){//int[] arr = a;a的地址給了arr,那麼arr和 // a指向同一塊內存的數組 for(int e : arr){ System.out.print(e +"\t"); } System.out.println(); } ​ public static void main(String[] args) { ​ int[] a = {1,2,3,4,5}; ​ //設計一個方法,用於打印數組 printArray(a);//將a的地址,傳遞給arr System.out.println("Hello World!"); } }/<code>

內存分析:

3.2、數組作為返回值

示例代碼:

<code>//設計一個方法,用於創建一個數組, 並賦值。數組要返回給調用處 public static int[] createArray(int len){ int[] arr = new int[len]; for(int i = 0;i /<code>

3.3、可變參數【擴展】

<code>概念:一個方法可以接收的參數的數量不定(0-多個),但是類型固定。 ​ 語法:數據類型 ... 參數名,可變參數在方法中當數組使用。 ​ 注意事項: 1、如果參數列表中,除了可變參數還有其他的參數,可變參數要寫在整個參數列表的最後。 2、一個方法最多隻能有一個可變參數。 /<code>

示例代碼:

<code>class Test6Array { //求一組int類型的數據的和 public static void getSum(int ... nums ){ int sum = 0; for(int i = 0;i /<code>

四、數組的排序

排序:數組是存儲一組數據,而且這些數據是有順序的。但是數值本身可能是無序的。通過算法來實現給數組進行排序,升序(數值從小到大),降序(數值從大到小)。

4.1 冒泡排序

冒泡排序:思路(升序):比較相鄰的兩個數,較大的數據需要向後移動。長度減1。

<code>1、冒泡排序:Bubble Sort 原理:比較相鄰的兩個數,將較大的數,向後移動。 class Test7BubbleSort { public static void main(String[] args) { int[] arr = {15,23,8,10,7}; ​ for(int i= 1; i arr[j+1]){ //交換 int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } ​ for(int i = 0;i/<code>

選擇排序:思路(升序):每次找個基準值,定一個變量k表示比較小的值的下標。每輪比較完,都在基準值上放一個比較小數。

4.2 選擇排序

示例代碼:

<code>package com.qf.array; ​ public class Test1SelectionSort { ​ public static void main(String[] args) { /* * 選擇排序: 思路: 每一輪找個基準值:在基準值上放一個比較小的數。 * * 定義一個變量k,用於標記比較小的數的下標 */ int[] arr = { 15, 23, 8, 10, 7 }; ​ for (int i = 0; i < arr.length - 1; i++) { // i = 0,1,2,3,表示輪數 // 用於標記本輪中,要找的比較小的值。 int k = i; ​ // 依次比較arr[k] for (int j = k + 1; j < arr.length; j++) { // 比較arr[k]和arr[j],如果arr[k]值大於arr[j]的值,將j賦值給k if (arr[k] > arr[j]) { k = j; } } ​ // 交換arr[i]和arr[k] // i = 0, 第一輪:arr[0],arr[k] // i = 1,第二輪, arr[1],arr[k] // i =2,第三輪,arr[2],arr[k] if (k != i) { int temp = arr[i]; arr[i] = arr[k]; arr[k] = temp; } } ​ // 排序後,打印數組 for (int e : arr) { System.out.println(e); } ​ } ​ } ​/<code>

五、Arrays工具類

5.1、工具類:Arrays

<code>JDK提供好的類: A:Scanner,讀取鍵盤 B:String,字符串 C:Math,數學的 D:Arrays,提供數組的常規操作的 E:System, 。。。/<code>

在Arrays類中,提供了很多關於數組常用的操作方法。

5.2、數組的複製

就是將一個數組的數據,複製到另一個數值中。

<code>方法一:通過循環,依次複製,將原數組的數據,一個一個,複製到目標數組中 方法二:Arrays類裡方法:copyOf(原數組,新數組的長度)-->返回值是新數組 方法三:System類裡的方法:arraycopy(原數組,原數組位置,新數組,新數組位置,拷貝的個數)/<code>

示例代碼:

<code>package com.qf.array; ​ import java.util.Arrays; ​ public class Test3Copy { ​ public static void main(String[] args) { int[] a = {1,2,3}; int[] b = new int[10]; //數組的拷貝: //方法一:自己通過循環依次複製,吭哧吭哧 for(int i=0;i/<code>

六、二維數組

<code>​ 維度:dimension 數組:存儲相同類型的一組數據。 一維數組:數組中存儲的就是數據了。 二維數組:存儲的是一維數組。本質也叫數組的數組。也被稱為矩陣:行和列的。 多維數組。。。/<code>

示例代碼:

<code>package com.qf.array; ​ public class Test4TDArray { ​ public static void main(String[] args) { //二維數組 //一維數組 int[] a = {1,2,3,4}; int[][] b = { {1,2,3}, {4,5,6}, {7,8,9,10} }; System.out.println(b);//打印的是b這個二維數組的地址 System.out.println(b.length);//3 System.out.println(b[0]);//第一個一維數組的地址 System.out.println(b[1]); System.out.println(b[2]); System.out.println(b[0][1]);//2 System.out.println(b[1][2]);//6 for(int i=0;i/<code>

示例代碼:

<code>package com.qf.array; ​ public class Test5TDArray { ​ public static void main(String[] args) { //二維數組的創建語法 //1.先聲明,再創建 int[][] a = new int[3][4];//二維,一維一起創建 //2.先創建二維數組,後創建一維數組 int[][] b= new int[3][];//只是創建了二維數組,但是一維還沒有創建 b[0] = new int[3]; b[1] = new int[4]; b[2] = new int[4]; //3.聲明,創建,賦值 int[][] c = {{},{},{}}; //4. int[][] d = new int[][]{{},{},{}}; } ​ } ​/<code>

七、作業

1、給定一個整數數組,例如{2,4,5,6,7,8}和一個數字,例如10,請設計一個方法,找出兩個元素,並且使這兩個數的和為給定數字,並打印出來。

2、某個公司採用公用電話傳遞數據,數據是四位的整數,在傳遞過程中是加密的,加密規則如下:每位數字都加上5,然後再用加5後的數字除以10的餘數代替該數字,再將第一位和第四位交換,第二位和第三位交換。打印加密後的數字。

3、定義一個數組,存儲以下數據:{1,2,3,4,5,6,7,8,9},請查找該數組中,是否存在數字8。