題記:對於java數組的整理,使調理化。個人理解是數組是一個存儲數據容器,優點是內存大小可控,這也恰恰是它缺點,容器容量是不變的。解決這問題便是集合。好久好久不用了,有種莫名的感覺……
一、初始化:(定義,分配空間,賦值這三步;注意堆與棧之間的關係,定義---棧,賦值---堆)
1.動態初始化:數組定義與爲數組分配空間和賦值的操作分開進行;
2.靜態初始化:在定義數字的同時就爲數組元素分配空間並賦值;
3.默認初始化:數組是引用類型,它的元素相當於類的成員變量,因此數組分配空間後,每個元素也被按照成員變量的規則被隱士初始化。
參考:http://developer.51cto.com/art/200906/128274.htm
二、二維數組
對二維複合數據類型的數組,必須首先爲最高維分配引用空間,然後再順次爲低維分配空間。而且,必須爲每個數組元素單獨分配空間。
例如:
int a[][] = new int[2][]; //a[0] = 1; //錯誤 a[0] = new int[2];//分配堆空間 a[0][0] = 1;//真實存值 a[0][1] = 2; a[1] = new int[2]; a[1][0] = 21; a[1][1] = 22;多維數組在二維數組基礎上迭代
理解:
一維數組是一行隊列
二維數組是多行隊列
三、工具類
java.util.Arrays類能方便地操作數組,它提供的所有方法都是靜態的。具有以下功能:(增刪改查,多了排序,比較相等)
1.給數組賦值:通過fill方法。
2.對數組排序:通過sort方法,按升序。(據說是一種優化了算法,反正看源碼看的頭疼……)
3.比較數組:通過equals方法/hashCode方法比較數組中元素值是否相等。
4.查找數組元素:通過binarySearch方法能對排序好的數組進行二分查找法操作
例如:
int[] array = new int[5];
//填充數組
Arrays.fill(array, 5);
System.out.println("填充數組:Arrays.fill(array, 5):");
TestArrays.output(array);
//將數組的第2和第3個元素賦值爲8,必須的連續
Arrays.fill(array, 2, 4, 8);
System.out.println("將數組的第2和第3個元素賦值爲8:Arrays.fill(array, 2, 4, 8):");
TestArrays.output(array);
int[] array1 = {7,8,3,2,12,6,3,5,4};
//對數組的第2個到第6個進行排序進行排序
Arrays.sort(array1,2,7);
System.out.println("對數組的第2個到第6個元素進行排序進行排序:Arrays.sort(array,2,7):");
TestArrays.output(array1);
//對整個數組進行排序
Arrays.sort(array1);
System.out.println("對整個數組進行排序:Arrays.sort(array1):");
TestArrays.output(array1);
//比較數組元素是否相等
System.out.println("比較數組元素是否相等:Arrays.equals(array, array1):"+"\n"+Arrays.equals(array, array1));
int[] array2 = array1.clone();
System.out.println("克隆後數組元素是否相等:Arrays.equals(array1, array2):"+"\n"+Arrays.equals(array1, array2));
//使用二分搜索算法查找指定元素所在的下標(必須是排序好的,否則結果不正確)
Arrays.sort(array1);
System.out.println("元素3在array1中的位置:Arrays.binarySearch(array1, 3):"+"\n"+Arrays.binarySearch(array1, 3));
//如果不存在就返回負數
System.out.println("元素9在array1中的位置:Arrays.binarySearch(array1, 9):"+"\n"+Arrays.binarySearch(array1, 9));
}
細節:
1.java中 數組a = 數組b 中僅僅是地址的傳遞,而不是值的複製
import org.junit.Test;
public class ArrayTest {
@Test
public void add()
{
int[] a = new int[5];
System.out.println(a);
for(int i=0; i<5; i++)
{
System.out.print("第" + i + "=" + a[i]+"; ");
}
int[] b = {1,2,3,4,5};
a = b;//把b賦值給a
System.out.println(a);
for(int i=0; i<5; i++)
{
System.out.print("第" + i + "=" + a[i]+"; ");
}
a[4]=10;//改變a中元素
for(int i=0; i<5; i++)
{
System.out.print("第b" + i + "=" + b[i]+"; ");
//返回中b中的元素也改變了,說明是b給a之是傳遞了地址
//而值存在堆中,a,b共用一個堆
}
}
}