一:數組的介紹
數組是一種數據結構,它可以存儲多個數據,一個數據就是一個元素,通常可以通過元素的下標來訪問元素和爲元素賦值!
一個數組中,只能存儲一種數據類型的數據
二:數組的創建方式
2.1:靜態初始化:由程序員顯示的指定每個元素的初始值,由系統決定長度
int[] arr = new int[]{1,2,3};
int[] arr = {1,2,3}; //簡化形式: 推薦
2.2:動態初始化:由程序員指定長度,由系統爲數組元素分配初始值
byte,short, int, long: 0
float,double: 0.0
char: '\u0000'
boolean: false
引用類型(類,接口,數組): null
int[] arr = new int[3];
注:動態初始化和靜態初始化不能同時使用!
三:遍歷數組
3.1:普通for
public class Demo7 {
public static void main(String[] args) {
String[] ss = {"hello","world","java"};
for(int i=0; i<ss.length; i++) {
ss[i] = "test";
}
System.out.println(Arrays.toString(ss));//[test, test, test]
}
}
3.2:增強for(foreach並不能改變數組元素的值)
public class Demo {
public static void main(String[] args) {
for (String s : ss) {
s = "test";
}
System.out.println(Arrays.toString(ss));//[hello, world, java]
}
}
四:數組的內存圖解
4.1:基本類型數組的初始化
public class Demo {
public static void main(String[] args) {
//定義一個int[]類型的引用變量
int[] arr; //①
//初始化數組,長度爲3
arr = new int[3];//②
//爲數組元素賦值
for(int i=0; i<arr.length; i++) { //③
arr[i] = i+10;
}
}
}
解釋:
①步驟的時候,只是定義了一個引用變量,該變量沒有指向任何有效的內存!
②步驟的時候,new關鍵字出現了,這時系統爲數組開闢了空間,並給了默認值(因爲數組的元素類型是int,所以默認值爲0)
③步驟的時候,爲數組中每一個元素賦完值後的效果圖
4.2:引用類型數組的初始化
public class Demo{
public static void main(String[] args) {
//定義一個Person[]類型的引用變量ps
Person[] ps;
//爲這個數組動態初始化,長度爲2
ps = new Person[2];
//創建Person實例
Person p1 = new Person("wzj",22);
Person p2 = new Person("sbt",30);
ps[0] = p1;
ps[1] = p2;
//下面兩句執行效果一樣!
System.out.println(p1.MySelfIntroduce());;
System.out.println(ps[0].MySelfIntroduce());;
}
}
class Person{
String name;
int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String MySelfIntroduce() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
爲什麼最後兩句輸出的內容相同呢?原因是p1和ps[0]指向的是同一個對象!
五:沒有多維數組:
int[][],你可以看成就是一個一維數組,只不過裏面的元素是int[]類型的罷了
int[][] arr = new int[3][2];
public class Demo {
public static void main(String[] args) {
//靜態初始化,可以看出來數組的長度爲2,元素是一個一維數組長度也是2
int[][] arr = new int[][] {
{1,2},
{3,4}
};
//動態初始化
//方式一: 同時初始化兩個維數
int[][] arr = new int[3][2];
//方式二: 先初始化數組的長度
int[][] arr = new int[3][];
}
}
注:int[][] arr = new int[x][]; 如果是動態初始化第一個[]必須寫明長度
六:數組的工具類 Arrays
查找,複製,填充,排序等等
public class Demo7 {
public static void main(String[] args) {
int[] arr = {4,2,5,8,1,7};
int[] arr2 = {4,2,5,8,1,7};
int[] arr3 = {4,2,5,8,1,9};
int[] arr4 = {1,2,3};
int[] arr5 = {1,2,3,4};
// System.out.println(binarySearch(arr,23));
System.out.println(equals(arr,arr2));//爲了不影響效果,應該把上一行註釋掉!
System.out.println(file(arr3, 1));
int[] copy = copy(arr4,6); //大於原數組的長度--> copy:{1,2,3,0,0,0}
System.out.println(Arrays.toString(copy));//[1, 2, 3, 0, 0, 0]
int[] copyOfRange = copyOfRange(arr5,0,2);
System.out.println(Arrays.toString(copyOfRange));
}
/**
* 只複製: 數組中from...to的索引,包左不包右,不會發生數組越界異常!
* @param arr5
* @param from
* @param to
* @return
*/
private static int[] copyOfRange(int[] arr5, int from, int to) {
return Arrays.copyOfRange(arr5, from, to);
}
/**
* 將原數組複製成一個新數組,參數i是新數組的長度
* 如果i>原數組的長度,那麼多出來的就根據原數組的類型補默認值
* 如果i<原數組的長度, 那就只複製這麼長!
* @param arr4
* @param i
* @return
*/
private static int[] copy(int[] arr4, int i) {
return Arrays.copyOf(arr4, i);
}
/**
* 將數組中所以元素都填充成 i
* 注:也可以在數組中指定範圍填充
* @param arr3
* @param i
* @return
*/
private static String file(int[] arr3, int i) {
Arrays.fill(arr3, i);
return Arrays.toString(arr3);
}
/**
* 比較兩個數組的長度和元素是否相同
* 相同:返回true, 否則返回false
* @param arr
* @param arr2
* @return
*/
private static boolean equals(int[] arr, int[] arr2) {
return Arrays.equals(arr, arr2);
}
/**
* binarySearch(byte[], byte key):
* 查詢key在byte[]中的索引,前提是該數組是排完順序的
* 否則返回負數:怎麼判斷負數:(變量 & 1) != 0
* 注:也可以在數組中指定範圍查找key
*/
private static int binarySearch(int[] arr, int i) {
Arrays.sort(arr);
// System.out.println(Arrays.toString(arr));//[1, 2, 4, 5, 7, 8]
return Arrays.binarySearch(arr,i);
}
}
七:數組的應用:一般是裝一些固定的值:比如一年中的月份