Java基礎知識---數組
今天來學習一下數組。
數組是什麼??好像是一堆數據的集合。
在 Java 語言中,提供的數組是用來儲存固定大小的同類型元素。數組中的元素可以是任何類型,包括基本類型和引用類型數據。多維數組:多維數組可以看成是數組的數組,比如二維數組就是一個特殊的一維數組,其每一個元素都是一個一維數組
那麼怎樣去聲使用數組??
使用數組之前,首先需要先聲明該數組變量,才能在數組中進行使用。
要使用 Java 的數組,必須先經過兩個步驟:
1)聲明數組變量
2)創建數組:分配內存給這個數組
在 Java 中,將數組定義爲引用數據類型。但是聲明方式有兩種:
- 數組的動態初始化:動態初始化是指由程序員在初始化數組時指定數組的長度,由系統爲數組元素分配初始值。
數據類型 數組名稱[ ] = new 數據類型[長度 ];
數據類型[ ] 數組名稱 = new 數據類型[長度 ];
這兩種方式初始化的效果是一樣的,只是 [ ] 放置的位置是不一樣的。
- 數組的靜態初始化 :靜態初始化是指由程序員在初始化數組時爲數組每個元素賦值,由系統決定數組的長度。
簡化格式: 數據類型 數組名稱 [ ] ={ 數據1,數據2.....};
完整格式: 數據類型 數組名稱[ ] = new 數據類型[ ] {數據1,數據2 };
怎樣給數組分配內存??
首先我們先了解一下棧內存,堆內存的概念
- 棧內存:是一種連續儲存的數據結構,存放基本類型的變量,對象的引用變量和方法調用,遵循先入後出的規則。當在一段代碼塊定義一個變量時,Java就在棧中爲這個變量分配內存空間,當超過變量的作用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間可以立即被另作他用。
- 堆內存:用來存放所有new出來的對象
數據存放在了堆內存中,那麼怎樣訪問堆內存中的每一個數組元素呢?
數組裏面可以通過腳標對每一個元素進行訪問,腳標從 0 開始定義,所以可以使用的腳標範圍:“0 ~ 數組長度-1”。注意,如果使用的時候超過了數組腳標範圍則會出現 " ArrayIndexOutOfBoundsException (數組越界) "異常。對於數組的長度也可以使用 “ 數組名稱.length” 屬性進行獲得。
使用數組是爲了可以進行方便的變量管理,所以在進行數組操作的時候往往會利用 for 循環控制輸出。
public class ArrayTest {
public static void main(String[] args) {
int[] a = new int[3] ;
for(int i = 0 ; i < a.length ; i++) {
System.out.println(a[i]);
}
}
}
輸出結果爲:
0
0
0
說明在動態初始化聲明的時候,數組每一個元素的保存內容爲其對應數據類型的默認值。
數組引用傳遞
數組是引用數據類型,就會發生引用傳遞,出現:一個堆內存可以被多個棧內存所指向。
數組屬於引用類型,所以一定要爲其開闢堆內存空間之後纔可以使用。如果使用了未開闢內存空間的數組則會出現“NullPointException”異常。
數組內存分析:
從 JDK1.5 之後爲了減輕下標對程序的影響(如果下標處理不當則會出現數組越界),所以參考了.net 中的設計,引入了增強型的 for 循環(foreach),利用 foreach 的語法結構可以之際自動獲取數組中的每一個元素,避免下標訪問。
public class ArrayTest {
public static void main(String[] args) {
int[] aa = new int[3] ;
for(int a : aa ) {
System.out.println(a);
}
}
}
對於引用數據類型而言,主要的特點是可以與方法進行引用傳遞,而數組本身也屬於引用數據類型,所以可以通過方法實現引用傳遞的操作。
class LowHighSwap
{
static void doIt( int[] z )
{
int temp = z[z.length-1];
z[z.length-1] = z[0];
z[0] = temp;
}
}
class TestIt
{
public static void main( String[] args )
{
int[] myArray = {1, 2, 3, 4, 5};
LowHighSwap.doIt(myArray);
for (int i = 0; i < myArray.length; i++)
{
System.out.print(myArray[i] + " ");
}
}
}
輸出結果爲: 5 2 3 4 1
數組作爲參數是引用傳遞 ,在 doIt 方法中可以修改數組的值 。
Arrays 類
java.util.Arrays 類能方便地操作數組,它提供的所有方法都是靜態的。
具有以下功能:
- 給數組賦值:通過 fill 方法。
- 對數組排序:通過 sort 方法,按升序。
- 比較數組:通過 equals 方法比較數組中元素值是否相等。
- 查找數組元素:通過 binarySearch 方法能對排序好的數組進行二分查找法操作。
1 | public static int binarySearch(Object[] a, Object key) 用二分查找算法在給定數組中搜索給定值的對象(Byte,Int,double等)。數組在調用前必須排序好的。如果查找值包含在數組中,則返回搜索鍵的索引;否則返回 (-(插入點) - 1)。 |
2 | public static boolean equals(long[] a, long[] a2) 如果兩個指定的 long 型數組彼此相等,則返回 true。如果兩個數組包含相同數量的元素,並且兩個數組中的所有相應元素對都是相等的,則認爲這兩個數組是相等的。換句話說,如果兩個數組以相同順序包含相同的元素,則兩個數組是相等的。同樣的方法適用於所有的其他基本數據類型(Byte,short,Int等)。 |
3 | public static void fill(int[] a, int val) 將指定的 int 值分配給指定 int 型數組指定範圍中的每個元素。同樣的方法適用於所有的其他基本數據類型(Byte,short,Int等)。 |
4 | public static void sort(Object[] a) 對指定對象數組根據其元素的自然順序進行升序排列。同樣的方法適用於所有的其他基本數據類型(Byte,short,Int等)。 |
Java 中數組擴容的三種方式:
① int[] arr1=new int[arr1.length*2] //新數組長度
for(int i=0;i<arr1.length;i++){ //複製
arr1[i]=arr1[i];
}
② int[] arr2=java.util.Arrays.copyOf(原數組名,新數組長度);
③ int[] arr3=new int[arr1.length*2]
System.arraycopy(原數組名,起始下標,新數組名,起始下標,複製長度);
一點一點的學習吧,加油,我是站在巨人肩膀的小白菜。。