JavaSE學習筆記(7) 數組 1、什麼是數組 數組是相同類型數據的有序集合。數組描述的是相同類型的若幹個數據,按照一定的先後次序排列組合而成。其中,每一個數據稱作一個元素,每個元素可以通過一個索引(下標)來訪問它們。數組的三個基本特點: 1. 長度是確定的。數組一旦被創建,它的大小就是不可以改變 ...
JavaSE學習筆記(7)---數組
1、什麼是數組
數組是相同類型數據的有序集合。數組描述的是相同類型的若幹個數據,按照一定的先後次序排列組合而成。其中,每一個數據稱作一個元素,每個元素可以通過一個索引(下標)來訪問它們。數組的三個基本特點:
- 長度是確定的。數組一旦被創建,它的大小就是不可以改變的。
- 其元素必須是相同類型,不允許出現混合類型。
- 數組類型可以是任何數據類型,包括基本類型和引用類型。
提示
數組變數屬引用類型,數組也可以看成是對象,數組中的每個元素相當於該對象的成員變數。數組本身就是對象,Java中對象是在堆中的,因此數組無論保存原始類型還是其他對象類型,數組對象本身是在堆中存儲的
2、數組的聲明和初始化
聲明數組
type [] array = {}
//例如
int [] a = {1,2,3,4};
int [] b = new int[4];
註意事項
- 聲明的時候並沒有實例化任何對象,只有在實例化數組對象時,JVM才分配空間,這時才與長度有關。
- 聲明一個數組的時候並沒有數組真正被創建。
- 構造一個數組,必須指定長度。
創建基本類型一維數組
public class Test {
public static void main(String args[]) {
int[] s = null; // 聲明數組;
s = new int[10]; // 給數組分配空間;
for (int i = 0; i < 10; i++) {
s[i] = 2 * i + 1;//給數組元素賦值;
System.out.println(s[i]);
}
}
}
基本類型數組記憶體分配圖
創建引用類型一維數組
class Man{
private int age;
private int id;
public Man(int id,int age) {
super();
this.age = age;
this.id = id;
}
}
public class AppMain {
public static void main(String[] args) {
Man[] mans; //聲明引用類型數組;
mans = new Man[10]; //給引用類型數組分配空間;
Man m1 = new Man(1,11);
Man m2 = new Man(2,22);
mans[0]=m1;//給引用類型數組元素賦值;
mans[1]=m2;//給引用類型數組元素賦值;
}
}
引用類型數組記憶體分配圖
初始化數組
數組的初始化方式總共有三種:靜態初始化、動態初始化、預設初始化。下麵針對這三種方式分別講解。
1、靜態初始化
除了用new關鍵字來產生數組以外,還可以直接在定義數組的同時就為數組元素分配空間並賦值。
int[] a = { 1, 2, 3 };// 靜態初始化基本類型數組;
Man[] mans = { new Man(1, 1), new Man(2, 2) };// 靜態初始化引用類型數組;
2.動態初始化
數組定義與為數組元素分配空間並賦值的操作分開進行。
int[] a1 = new int[2];//動態初始化數組,先分配空間;
a1[0]=1;//給數組元素賦值;
a1[1]=2;//給數組元素賦值;
3.數組的預設初始化
數組是引用類型,它的元素相當於類的實例變數,因此數組一經分配空間,其中的每個元素也被按照實例變數同樣的方式被隱式初始化。
int a2[] = new int[2]; // 預設值:0,0
boolean[] b = new boolean[2]; // 預設值:false,false
String[] s = new String[2]; // 預設值:null, null
3、遍曆數組
傳統for迴圈遍歷
int [] a = {0,1,2,3,4}
for(int i=0;i<a.lenth;i++){
System.out.println(a[i]);
}
for-each遍歷
增強for迴圈for-each是JDK1.5新增加的功能,專門用於讀取數組或集合中所有的元素,即對數組進行遍歷。
String[] ss = { "aa", "bbb", "ccc", "ddd" };
for (String temp : ss) {
System.out.println(temp);
}
結果如下:
註意事項
- for-each增強for迴圈在遍曆數組過程中不能修改數組中某元素的值。
- for-each僅適用於遍歷,不涉及有關索引(下標)的操作。
4、數組的拷貝
System類里也包含了一個static void arraycopy(object src,int srcpos,object dest, int destpos,int length)方法,該方法可以將src數組裡的元素值賦給dest數組的元素,其中srcpos指定從src數組的第幾個元素開始賦值,length參數指定將src數組的多少個元素賦給dest數組的元素。
示例:數組拷貝
String[] s = {"阿裡","尚學堂","京東","搜狐","網易"};
String[] sBak = new String[6];
System.arraycopy(s,0,sBak,0,s.length);
for (int i = 0; i < sBak.length; i++) {
System.out.print(sBak[i]+ "\t");
}
結果如下:
5、Arrays類
JDK提供的java.util.Arrays類,包含了常用的數組操作,方便我們日常開發。Arrays類包含了:排序、查找、填充、列印內容等常見的操作。
列印數組
import java.util.Arrays;
public class Test {
public static void main(String args[]) {
int[] a = { 1, 2 };
System.out.println(a); // 列印數組引用的值;
System.out.println(Arrays.toString(a)); // 列印數組元素的值;
}
}
註意
此處的Arrays.toString()方法是Arrays類的靜態方法,不是前面講的Object的toString()方法。
數組元素的排序(sort方法)
import java.util.Arrays;
public class Test {
public static void main(String args[]) {
int[] a = {1,2,323,23,543,12,59};
System.out.println(Arrays.toString(a));
Arrays.sort(a);
System.out.println(Arrays.toString(a));
}
}
數組元素是引用類型的排序(Comparable介面的應用)
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Man[] msMans = { new Man(3, "a"), new Man(60, "b"), new Man(2, "c") };
Arrays.sort(msMans);
System.out.println(Arrays.toString(msMans));
}
}
class Man implements Comparable {
int age;
int id;
String name;
public Man(int age, String name) {
super();
this.age = age;
this.name = name;
}
public String toString() {
return this.name;
}
public int compareTo(Object o) {
Man man = (Man) o;
if (this.age < man.age) {
return -1;
}
if (this.age > man.age) {
return 1;
}
return 0;
}
}
Comparable介面里定義了一個compareTo(Object obj)方法,該方法返回一個整數值,實現該介面的類必須實現該方法,實現了該介面的類的對象就可以比較大小。當一個對象調用該方法與另一個對象進行比較時,例如obj1.compareTo(obj2),如果該方法返回0,則表示兩個對象相等,如果該方法返回一個正整數,則表明obj1大於obj2;如果該方法返回一個負整數,則表明obj1小於obj2。
下麵是一些已經實現了Comparable介面的常用類:
- BigDecimal類、BigInteger以及所有的數值型對應的包裝類:按他們對應的數值大小進行比較
- Character:按照字元的UNICODE值進行比較
- Boolean:true對應的包裝類實例大於false對應的包裝類實例
- String:按照字元的UNICODE值進行比較
- Date\Time:後面的時間、日期比前面的時間、日期大
二分法查找
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] a = {1,2,323,23,543,12,59};
System.out.println(Arrays.toString(a));
Arrays.sort(a); //使用二分法查找,必須先對數組進行排序;
System.out.println(Arrays.toString(a));
//返回排序後新的索引位置,若未找到返回負數。
System.out.println("該元素的索引:"+Arrays.binarySearch(a, 12));
}
}
數組填充
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] a= {1,2,323,23,543,12,59};
System.out.println(Arrays.toString(a));
Arrays.fill(a, 2, 4, 100); //將2到4索引的元素替換為100;
System.out.println(Arrays.toString(a));
}
}
6、多維數組
多維數組可以看成以數組為元素的數組。可以有二維、三維、甚至更多維數組,但是實際開發中用的非常少。最多到二維數組(學習容器後,我們一般使用容器,二維數組用的都很少)。
二維數組的聲明
public class Test {
public static void main(String[] args) {
// Java中多維數組的聲明和初始化應按從低維到高維的順序進行
int[][] a = new int[3][];
a[0] = new int[2];
a[1] = new int[4];
a[2] = new int[3];
// int a1[][]=new int[][4];//非法
}
}
二維數組的靜態初始化
public class Test {
public static void main(String[] args) {
int[][] a = { { 1, 2, 3 }, { 3, 4 }, { 3, 5, 6, 7 } };
System.out.println(a[2][3]);
}
}
二維數組的動態初始化
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[][] a = new int[3][];
// a[0] = {1,2,5}; //錯誤,沒有聲明類型就初始化
a[0] = new int[] { 1, 2 };
a[1] = new int[] { 2, 2 };
a[2] = new int[] { 2, 2, 3, 4 };
System.out.println(a[2][3]);
System.out.println(Arrays.toString(a[0]));
System.out.println(Arrays.toString(a[1]));
System.out.println(Arrays.toString(a[2]));
}
}
獲取數組長度
//獲取的二維數組第一維數組的長度。
System.out.println(a.length);
//獲取第二維第一個數組長度。
System.out.println(a[0].length);