Java学习笔记(九)--数组及Arrays类
數組
數組是最為常見的一種數據結構,是相同類型的、用一個標識符封裝到一起的基本類型數據序列或對象序列。
數組是具有相同數據類型的一組數據的集合。就是說數組中的每個元素具有相同的數據類型。在Java中將數組看作一個對象。
一、一維數組
1.1 創建一維數組
數組作為對象允許使用 new 關鍵字進行內存分配。在使用數組之前,必須首先定義數組變量所屬的類型。一維數組的創建有兩種形式。
1、先聲明,在用 new 運算符進行內存分配
聲明以為數組有下列兩種方式:
數組元素類型 數組名[]; 數組元素類型[] 數組名;數組元素類型決定了數組的數據類型。它可以是Java中任意的數據類型,包括簡單類型和組合類型。數組名是一個合法的標識符,符號 " [] " 指明該變量是一個數組類型變量。單個 “ [ ] ” 表示要創建的數組是一個一維數組。
聲明數組后,還不能立即訪問它的任何元素,因為聲明數組只給出了數組名和元素的數據類型,使用數組還要為它分配內存空間。在為數組分配內存空間時必須指明數組的長度。為數組分配內存空間的語法格式如下:
數組名 = new 數組元素的類型[數組元素的個數];數組名,即被連接到數組變量的名字。數組元素的個數,即指定數組中變量的個數,也就是數組的長度。
數組通過下標來區分數組中不同的元素。數組的下標是從0開始的。使用 new 關鍵字為數組分配內存時,整形數組中各個元素的初始值都為0。
2、聲明數組的同時為數組分配內存
這種方法是將數組的聲明和內存分配合在一起執行:
數組元素的類型[] 數組名字 = new 數組元素的類型[數組元素的個數]; 數組元素的類型 數組名字[] = new 數組元素的類型[數組元素的個數];例:以上面幾種方式聲明兩個個長度為5的整型數組,并打印其初始值。
//先聲明后分配內存 int[] array1,array2; //同時聲明兩個數組 //相當于 int array1[],array2[]; array1 = new int[5]; //分配內存空間/*聲明數組的同時為數組分配內存 int[] array1 = new int[5]; int array2[] = new int[5]; */ //for循環語句打印數組元素 for(int i = 0; i < 5; i++)System.out.println(array1[i]);//使用for each 循環語句打印元素 for(int x : array2)System.out.println(x);1.2 初始化一維數組
數組的初始化可分別初始化數組中的每個元素。創建并初始化數組有以下兩種形式:
//一種初始化方式 int[] arr; //聲明 int arr = new int[]{1,2,3,4,5};//初始化//第二種初始化方式 int arr1[] = {1,2,3,4};//創建并初始化 //int[] arr1 = {1,2,3,4}數組的初始化就是包括在大括號之內用逗號分開的表達式列表。用逗號分隔數組中的各元素,系統會自動為數組分配一定的空間。數組的大小就是初始值的個數。
數組初始化不能定義數組的長度,否則編譯器會報錯。
第一種方式可以在不創建新變量的情況下重新初始化一個數組。
int arr[]; int arr = new int[]{1,2,3,4,5};//初始化 int arr = new int[]{6,7,8,9,10};//重新初始化 /*相當于以下語句的簡寫 int arr[]; int arr = new int[]{1,2,3,4,5}; //初始化 int arr1[] = {6,7,8,9,10};//創建并初始化數組arr1 arr = arr1; */在Java中允許數組的長度為0.在編寫一個結果為數組的方法時,如果結果為空,則這種語法就顯得非常有用。此時可以創建一個長度為0的數組:new 元素類型[0]。注意,數組長度為0與null不同。
1.3 使用一維數組
數組元素的訪問可以通過下標訪問。其范圍從0~(數組長度-1)。
數組名[下標表達式];下標表達式可以是一個整型常量,也可以是值為整型常量的表達式。
處理數組元素時,經常會用到for循環。Java中簡便的for循環(foreach循環),可以不使用下標變量就可以順序的遍歷整個數組。
int[] arr = new int[]{1,2,3,4,5};//創建并初始化 arr[0] = 10;//訪問arr數組的第一個元素并新賦值為10 //for循環語句打印數組元素 for(int i = 0; i < 5; i++)System.out.println(arr[i]);//使用for each 循環語句打印元素 for(int x : arr)System.out.println(x);1.4 數組拷貝
在Java中,允許將一個數組變量拷貝給另一個數組變量,這是兩個變量將引用同一個數組:
int arr[]; int arr1[] = {6,7,8,9,10};//創建并初始化數組arr1 arr = arr1; arr[4] = 12; //此時arr1[4]也變成了12 arr1[1] = 20;//此時arr[1]也變成了20此方法不能將arr1引用的數組內容復制給arr,而是將arr1的引用值復制給了arr。它倆都指向同一個數組。
將一個數組的所有值拷貝到一個新數組中去,就要使用 Array 類的 copyOf() 方法:
int[] arr2 = Arrays.copyOf(arr1, arr1.length);第一個參數是要拷貝的數組名;第二個參數是新素組的長度,常用來改變數組的大小。
如果數組元素是數值型,那么多余的元素將被賦值為0;如果數組元素是布爾型,則將賦值為false。相反,新數組的長度小于原始數組的長度,則只拷貝最前面的數據元素。
二、二維數組
如果一維數組中的各個元素仍然是一個數組,那么它就是一個二維數組。
2.1 二維數組的創建
下面是聲明二維數組的語法:
數據類型[][] 數組名; 或者 數據類型 數組名[][];對于高維數組,有兩種為數組分配內存的方式。
(1)、直接為每一維分配內存空間
int[][] arr; arr = new int[3][3];(2)、分別為每一維分配內存
int[][] arr; arr = new int[3][]; arr[0] = new int[3]; arr[1] = new int[3]; arr[2] = new int[3];2.2 二維數組初始化
數據類型 數組名[][] = {value1,value2,...,valuen}; int[][] array = {{0,1},{9,2}}2.3 使用二維數組
多維數組的引用方式為:
arrayName[index1][index2];二維數組中使用兩個下標,一個表示行,另一個表示列。
例:在項目中創建類Matrix,在主方法中實現輸出一個3行3列且所有元素為0的矩陣。
public class Matrix {public static void main(String[] args) {int[][] arr;arr = new int[3][3];for(int i = 0; i < arr.length; i++){for(int j = 0; j < arr[i].length; j++){System.out.printf("%d ",arr[i][j]);}System.out.printf("\n");}}} /*輸出結果為 0 0 0 0 0 0 0 0 0 */多維數組的創建方法與二維數組相似。
三、數組的基本操作
3.1 遍歷數組
遍歷數組就是獲取數組中的每個元素。遍歷數組一般使用for循環來實現。遍歷一維數組很簡單,遍歷二維數組需要使用雙層for循環,通過數組的length屬性可以獲得數組的長度。
例:在項目中創建類Matrix,在主方法中實現遍歷輸出一個3行3列且所有元素為0的矩陣。
第一種方式如上,現在我們使用for each循環語句遍歷二維數組。
public class Matrix {public static void main(String[] args) {int[][] arr;arr = new int[3][3];for(int x[] : arr){for(int y : x){System.out.printf("%d ",y);}System.out.printf("\n");}}} /*輸出結果為 0 0 0 0 0 0 0 0 0 */3.2填充替換數組元素
數組中的元素定義完成后,可以通過Arrays類的靜態方法fill()來對數組中的元素進行替換。下面以int型數組為例:
1、fill(int[] a, int value)
該方法可以將指定的int值分配給int型數組的每個元素。
Arrays.fill(int[] a, int value);- a:要進行元素替換的數組。
- value:要存儲數組中所有元素的值。
2、fill(int [] a, int fromIndex, int toIndex, int value)
該方法將指定的int值分配給int型數組指定范圍中的每個元素。填充范圍從索引 fromIndex(包含)一直到索引 toIndex(不包含)。如果 fromIndex == toIndex,則填充范圍為空。
Arrays.fill(int [] a, int fromIndex, int toIndex, int value)- a:要進行填充的數組;
- fromIndex:要使用指定值填充的第一個元素索引(包括);
- toIndex:要使用指定值填充的最后一個元素的索引(不包括);
- value:要存儲在數組所有元素中的值。
3.3 對數組進行排序
通過Arrays類的靜態sort()方法可以實現對數組的排序。sort() 方法提供了多種重載方式,可對任意類型的數組進行升序排序。
Arrays.sort(object);object是指進行排序的數組名稱。
import java.util.Arrays; public class First {public static void main(String[] args) {int[] arr;arr = new int[]{23,42,12,8,20};Arrays.sort(arr);for(int i = 0; i < arr.length; i++){System.out.printf("%d ",arr[i]);}}} /*運行結果 8 12 20 23 42 */Java中String類型數組的排序算法是根據字典編排順序排序的,因此數字排在字母前面,大寫字母排在小寫字母前面。
3.4 復制數組
Arrays 類的 copyOf() 方法和 copyOfRange() 方法可以實現對數組的復制。
1、copyOf() 方法
copyOf() 方法是復制一個數組至指定長度的數組。
數據類型 數組名[] = Arrays.copyOf(arr, newlength);- arr:要復制的數組;
- newlength:int型常量,指復制后的新數組的長度。如果新數組的長度大于數組arr的長度,則根據復制數組的類型來決定填充的值,整型數組用0填充,char型數組則使用null來填充;如果復制后的數組長度小于數組arr的長度,則會從數組arr的第一個元素開始截取至滿足新數組長度為止。
2、copyOfRange() 方法
copyOfRange() 方法將指定數組的指定長度復制到一個新數組中。
copyOfRange(arr, int fromIndex, int toIndex)- arr:要進行復制的數組對象;
- fromIndex:指定開始復制數組的索引位置。fromIndex 必須在0至整個數組長度之間。新數組包括索引是 fromIndex 的元素。
- toIndex:要復制范圍的最后索引位置。可大于數組arr的長度。新數組不包括索引是toIndex的元素。
toIndex大于數組arr的長度,根據復制數組的類型來決定填充的值,整型數組用0填充,char型數組則使用null來填充;
新數組的長度等于toIndex 減去 fromIndex的值。
3.5 數組查詢
Arrays 類的 binarySearch()方法,可使用二分法來搜索指定數組,以獲得指定對象。該方法返回要搜索元素的索引值。數組在調用此方法前必須排序好的。
1、binarySearch(Object[] a, Object key)
binarySearch(Object[] a, Object key)- a:要搜索的數組;
- key:要搜索的值。
- 如果key包含在數組中,則返回搜索值的索引;否則返回“-x”。x是第一個大于key的元素索引值。如果key大于數組中的所有元素,x為a.length+1。
2、binarySearch(Object[] a, int fromIndex, int toIndex, Object key)
binarySearch(Object[] a, int fromIndex, int toIndex, Object key)- a:要搜索的數組;
- fromIndex:指定范圍的開始處索引(包含);
- toIndex:指定范圍的結束處索引(不包含);
- key:要搜索的值。
- 如果key包含在數組中,則返回搜索值的索引;否則返回“-x”。x是第一個大于key的元素索引值。如果key大于數組中的所有元素,x為toIndex+1。
總結
以上是生活随笔為你收集整理的Java学习笔记(九)--数组及Arrays类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅探C指针(一)--初识指针
- 下一篇: Java学习笔记(十)--控制台输入输出