淺談js防抖和節流
主要內容
- 陣列概念
- 陣列的定義
- 陣列的索引
- 陣列記憶體
- 陣列的遍歷
- 陣列的最大值獲取
- 陣列反轉
- 陣列作為方法引數和返回值
第一章 陣列定義和訪問
1.1 容器概述
案例分析
現在需要統計某公司員工的工資情況,例如計算平均工資、找到最高工資等。假設該公司有50名員工,用前面所學
的知識,程式首先需要宣告50個變數來分別記住每位員工的工資,然後在進行操作,這樣做會顯得很麻煩,而且錯
誤率也會很高。因此我們可以使用容器進行操作。將所有的資料全部儲存到一個容器中,統一操作。
容器概念
- 容器: 是將多個數據儲存到一起,每個資料稱為該容器的元素。
- 生活中的容器: 水杯,衣櫃,教室
1.2 陣列概念
- 陣列概念:
1.3 陣列的定義
方式一
- 格式:
陣列儲存的資料型別[]陣列名字=new陣列儲存的資料型別[長度];
- 陣列定義格式詳解:
- 陣列儲存的資料型別: 建立的陣列容器可以儲存什麼資料型別。
- [] : 表示陣列。
- 陣列名字:為定義的陣列起個變數名,滿足識別符號規範,可以使用名字運算元組。
- new :關鍵字,建立陣列使用的關鍵字。
- 陣列儲存的資料型別: 建立的陣列容器可以儲存什麼資料型別。
- [ 長度]:陣列的長度,表示陣列容器中可以儲存多少個元素。
- 注意:陣列有定長特性,長度一旦指定,不可更改。
- 和水杯道理相同,買了一個 2升的水杯,總容量就是2升,不能多也不能少。
- 舉例:
定義可以儲存3個整數的陣列容器,程式碼如下:
int[]arr=newint[3];
方式二
- 格式:
資料型別[]陣列名=new資料型別[]{元素1,元素2,元素3...};
- 舉例:
定義儲存1,2,3,4,5整數的陣列容器。
int[]arr=newint[]{1,2,3,4,5};
方式三
- 格式:
資料型別[]陣列名={元素1,元素2,元素3...};
- 舉例:
定義儲存1,2,3,4,5整數的陣列容器
int[]arr={1,2,3,4,5};1.4 陣列的訪問
- 索引: 每一個儲存到陣列的元素,都會自動的擁有一個編號,從0開始,這個自動編號稱為陣列索引(index),可以通過陣列的索引訪問到陣列中的元素。
- 格式:
陣列名[索引]
- 陣列的長度屬性: 每個陣列都具有長度,而且是固定的,Java中賦予了陣列的一個屬性,可以獲取到陣列的長度,語句為: 陣列名 .length ,屬性length的執行結果是陣列的長度,int型別結果。由次可以推斷出,陣列的最大索引值為 陣列名 .length-1 。
publicstaticvoidmain(String[]args){ int[]arr=newint[]{1,2,3,4,5}; //列印陣列的屬性,輸出結果是5 System.out.println(arr.length); }
- 索引訪問陣列中的元素:
- 陣列名 [索引]=數值,為陣列中的元素賦值
- 變數 =陣列名[索引],獲取出陣列中的元素
publicstaticvoidmain(String[]args){ //定義儲存int型別陣列,賦值元素1,2,3,4,5 int[]arr={1,2,3,4,5}; //為0索引元素賦值為6 arr[0]=6; //獲取陣列0索引上的元素 inti=arr[0]; System.out.println(i); //直接輸出陣列0索引元素 System.out.println(arr[0]); }
第二章 陣列原理記憶體圖
2.1 記憶體概述
記憶體是計算機中的重要原件,臨時儲存區域,作用是執行程式。我們編寫的程式是存放在硬碟中的,在硬碟中的程
序是不會執行的,必須放進記憶體中才能執行,執行完畢後會清空記憶體。
Java虛擬機器要執行程式,必須要對記憶體進行空間的分配和管理。
2.2 Java 虛擬機器的記憶體劃分
為了提高運算效率,就對空間進行了不同區域的劃分,因為每一片區域都有特定的處理資料方式和記憶體管理方式。
- JVM 的記憶體劃分:
2.3 陣列在記憶體中的儲存
一個數組記憶體圖
publicstaticvoidmain(String[]args){ int[]arr=newint[3]; System.out.println(arr);//[I@5f150435 }
以上方法執行,輸出的結果是[I@5f150435,這個是什麼呢?是陣列在記憶體中的地址。new出來的內容,都是在堆
記憶體中儲存的,而方法中的變數arr儲存的是陣列的地址。
輸出arr[0],就會輸出arr儲存的記憶體地址中陣列中0索引上的元素
兩個陣列記憶體圖
publicstaticvoidmain(String[]args){ int[]arr=newint[3]; int[]arr2=newint[2]; System.out.println(arr); System.out.println(arr2); }
兩個變數指向一個數組
publicstaticvoidmain(String[]args){ //定義陣列,儲存3個元素 int[]arr=newint[3]; //陣列索引進行賦值 arr[0]=5; arr[1]=6; arr[2]=7; //輸出3個索引上的元素值 System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); //定義陣列變數arr2,將arr的地址賦值給arr2 int[]arr2=arr; arr2[1]=9; System.out.println(arr[1]); }
第三章 陣列的常見操作
3.1 陣列越界異常
觀察一下程式碼,執行後會出現什麼結果。
publicstaticvoidmain(String[]args){ int[]arr={1,2,3}; System.out.println(arr[3]); }
建立陣列,賦值3個元素,陣列的索引就是0,1,2,沒有3索引,因此我們不能訪問陣列中不存在的索引,程式運
行後,將會丟擲 ArrayIndexOutOfBoundsException 陣列越界異常。在開發中,陣列的越界異常是不能出現的,一
旦出現了,就必須要修改我們編寫的程式碼。
3.2 陣列空指標異常
觀察一下程式碼,執行後會出現什麼結果。
publicstaticvoidmain(String[]args){ int[]arr={1,2,3}; arr=null; System.out.println(arr[0]); }
arr=null 這行程式碼,意味著變數arr將不會在儲存陣列的記憶體地址,也就不允許再運算元組了,因此執行的時候
會丟擲 NullPointerException 空指標異常。在開發中,陣列的越界異常是不能出現的,一旦出現了,就必須要修
改我們編寫的程式碼。
空指標異常在記憶體圖中的表現
3.3 陣列遍歷【重點】
- 陣列遍歷: 就是將陣列中的每個元素分別獲取出來,就是遍歷。遍歷也是陣列操作中的基石。
publicstaticvoidmain(String[]args){ int[]arr={1,2,3,4,5}; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[3]); System.out.println(arr[4]); }
以上程式碼是可以將陣列中每個元素全部遍歷出來,但是如果陣列元素非常多,這種寫法肯定不行,因此我們需要改
造成迴圈的寫法。陣列的索引是 0 到 lenght -1 ,可以作為迴圈的條件出現。
publicstaticvoidmain(String[]args){ int[]arr={1,2,3,4,5}; for(inti=0;i<arr.length;i++){ System.out.println(arr[i]); } }
3.4 陣列獲取最大值元素
- 最大值獲取: 從陣列的所有元素中找出最大值。
- 實現思路:
- 定義變數,儲存陣列 0索引上的元素
- 遍歷陣列,獲取出陣列中的每個元素
- 將遍歷到的元素和儲存陣列 0索引上值的變數進行比較
- 如果陣列元素的值大於了變數的值,變數記錄住新的值
- 陣列迴圈遍歷結束,變數儲存的就是陣列中的最大值
publicstaticvoidmain(String[]args){ int[]arr={5,15,2000,10000,100,4000}; //定義變數,儲存陣列中0索引的元素 intmax=arr[0]; //遍歷陣列,取出每個元素 for(inti=0;i<arr.length;i++){ //遍歷到的元素和變數max比較 //如果陣列元素大於max if(arr[i]>max){ //max記錄住大值 max=arr[i]; } } System.out.println("陣列最大值是:"+max); }
3.5 陣列反轉
- 陣列的反轉: 陣列中的元素顛倒順序,例如原始陣列為1,2,3,4,5,反轉後的陣列為5,4,3,2,1
- 實現思想: 陣列最遠端的元素互換位置。
- 實現反轉,就需要將陣列最遠端元素位置交換
- 定義兩個變數,儲存陣列的最小索引和最大索引
- 兩個索引上的元素交換位置
- 最小索引 ++,最大索引--,再次交換位置
- 最小索引超過了最大索引,陣列反轉操作結束
publicstaticvoidmain(String[]args){ int[]arr={1,2,3,4,5}; /* 迴圈中定義變數min=0最小索引 max=arr.length‐1最大索引 min++,max‐‐ */ for(intmin=0,max=arr.length‐1;min<=max;min++,max‐‐){ //利用第三方變數完成陣列中的元素交換 inttemp=arr[min]; arr[min]=arr[max]; arr[max]=temp; } //反轉後,遍歷陣列 for(inti=0;i<arr.length;i++){ System.out.println(arr[i]); } }
第四章 陣列作為方法引數和返回值
4.1 陣列作為方法引數
以前的方法中我們學習了方法的引數和返回值,但是使用的都是基本資料型別。那麼作為引用型別的陣列能否作為
方法的引數進行傳遞呢,當然是可以的。
- 陣列作為方法引數傳遞,傳遞的引數是陣列記憶體的地址。
publicstaticvoidmain(String[]args){ int[]arr={1,3,5,7,9}; //呼叫方法,傳遞陣列 printArray(arr); } /* 建立方法,方法接收陣列型別的引數 進行陣列的遍歷 */ publicstaticvoidprintArray(int[]arr){ for(inti=0;i<arr.length;i++){ System.out.println(arr[i]); } }
4.2 陣列作為方法返回值
- 陣列作為方法的返回值,返回的是陣列的記憶體地址
publicstaticvoidmain(String[]args){ //呼叫方法,接收陣列的返回值 //接收到的是陣列的記憶體地址 int[]arr=getArray(); for(inti=0;i<arr.length;i++){ System.out.println(arr[i]); } } /* 建立方法,返回值是陣列型別 return返回陣列的地址 */ publicstaticint[]getArray(){ int[]arr={1,3,5,7,9}; //返回陣列的地址,返回到呼叫者 returnarr; }
4.3 方法的引數型別區別
程式碼分析
1. 分析下列程式程式碼,計算輸出結果。
publicstaticvoidmain(String[]args){ inta=1; intb=2; System.out.println(a); System.out.println(b); change(a,b); System.out.println(a); System.out.println(b); } publicstaticvoidchange(inta,intb){ a=a+b; b=b+a; }
2. 分析下列程式程式碼,計算輸出結果。
publicstaticvoidmain(String[]args){ int[]arr={1,3,5}; System.out.println(arr[0]); change(arr); System.out.println(arr[0]); } publicstaticvoidchange(int[]arr){ arr[0]=200; }
總結:
方法的引數為基本型別時,傳遞的是資料值. 方法的引數為引用型別時,傳遞的是地址值.