1. 程式人生 > 實用技巧 >淺談js防抖和節流

淺談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; 
}

總結:
方法的引數為基本型別時,傳遞的是資料值. 方法的引數為引用型別時,傳遞的是地址值.