數(shù)組類型
理解數(shù)組
java中要求數(shù)組元素具有相同的數(shù)據(jù)類型铃诬,及一個數(shù)組這里只能存儲一種數(shù)據(jù)類型的數(shù)據(jù)。
一旦數(shù)組的初始化完成,數(shù)組在內(nèi)存中所占的空間將被固定下來盾剩,數(shù)組的長度不可改變蚁廓。
定義數(shù)組
java支持兩種語法格式來定義數(shù)組:
type[] arrayName; //推薦
type arrayName;
數(shù)組是一種引用類型的變量访圃,因此用它定義一個變量僅僅表示定義了一個引用變量,這個引用變量還未指向任何有效的內(nèi)存相嵌,因此定義數(shù)組時不能指定數(shù)組的長度腿时,而且沒有內(nèi)存空間來存儲數(shù)組元素况脆,所以只有對數(shù)組進(jìn)行初始化后才可以使用。
注意:定義數(shù)組時不能指定數(shù)組長度
數(shù)組的初始化
數(shù)組的初始化有兩種方式:
- 靜態(tài)初始化:初始化時由程序員顯式的指定每個數(shù)組元素的初始值批糟,由系統(tǒng)決定數(shù)組長度
- 動態(tài)初始化:初始化時程序員只指定數(shù)組長度格了,由系統(tǒng)為數(shù)組元素分配初始值
注意:不能同時使用靜態(tài)初始化和動態(tài)初始化。即徽鼎,不能數(shù)組初始化時及指定長度盛末,又指定初始值
1 靜態(tài)初始化
arrayName = new type[]{element1, element2, element3, ...}
簡化寫法:
//聲明和初始化一起完成
int[] a = {1,2,3,4};
實例:
int[] intArr;
intArr = new int[]{1,2,3,4}
Object[] objArr;
objArr = new Object[]{"你好", "世界"};
objArr = new String[]{"你好", "世界"};
2 動態(tài)初始化
arrayName = new type[length];
簡化寫法:
//數(shù)組的定義和初始化同時完成
int[] a = new int[4];
- 注意:動態(tài)初始化時,系統(tǒng)為元素分配的初始值為:
基本類型整數(shù)類型:0
基本類型浮點類型:0.0
基本類型字符類型:'\u0000'
基本類型布爾類型:false
引用類型(類否淤、接口和數(shù)組):null
內(nèi)存中的數(shù)組
實際的數(shù)組對象被存儲在堆(heap)內(nèi)存中悄但,如果引用該數(shù)組對象的數(shù)組引用變量是一個局部變量那么它被存儲在棧(stack)內(nèi)存中。
- 注:為什么要分棧內(nèi)存和堆內(nèi)存石抡?
當(dāng)一個方法執(zhí)行時檐嚣,每個方法都會建立自己的內(nèi)存棧,在這個方法中定義的變量都將會被逐個放入棧內(nèi)存中啰扛,方法執(zhí)行結(jié)束净嘀,這個方法的內(nèi)存棧自然銷毀。因此侠讯,所有在方法中定義的局部變量都是放在棧內(nèi)存中的挖藏。
在程序中創(chuàng)建一個對象時,這個對象將被保存到運行時數(shù)據(jù)區(qū)中厢漩,以便反復(fù)利用(因為對象的創(chuàng)建成本很大)膜眠,這個運行時數(shù)據(jù)區(qū)就是堆內(nèi)存。堆內(nèi)存中對象不會隨方法結(jié)束而銷毀溜嗜,只有當(dāng)一個對象沒有任何引用變量引用它時宵膨,會變成垃圾,但是長度依然不變炸宵。
實例:
int[] a = new int[]{1, 2, 3, 4}
int[] b = new int[4];
b = a;
//b = a辟躏,即把數(shù)組a的值賦給b后,就是讓數(shù)組變量b指向數(shù)組變量a所指向的地址土全,而原來堆中數(shù)組b失去引用捎琐,變成垃圾,但長度依然不變
注:對待數(shù)組問題要分成兩部分看待裹匙,一部分是數(shù)組引用瑞凑,即定義的數(shù)組引用變量;一部分是實際的數(shù)組對象概页,在堆內(nèi)存中運行的籽御,通常無法直接訪問它,只能通過數(shù)組引用變量來訪問。
引用類型數(shù)組的初始化
引用類型的數(shù)組技掏,存儲的每一個數(shù)組元素也是引用铃将,指向另一塊內(nèi)存。
代碼示例:
//person.java
package tmp;
public class Person {
public int age;
public double height;
// 定義一個info方法
public void info() {
System.out.println("我的年齡是:" + age + "哑梳,我的身高是:" + height);
}
}
//ReferenceArraryTest.java
package tmp;
public class ReferenceArrayTest {
public static void main(String[] args) {
//定義一個students數(shù)組變量麸塞,類型是Person[],并初始化
Person[] students = new Person[2];
//創(chuàng)建一個person實例涧衙,并將這個person實例賦給zhang變量
Person zhang = new Person();
//為zhang所引用的person對象的age、height賦值
zhang.age=22;
zhang.height=184;
//創(chuàng)建一個person實例奥此,并將這個person實例賦給wang變量
Person wang = new Person();
wang.age = 21;
wang.height=165;
//將zhang弧哎、wang變量的值分別賦給數(shù)組的元素
students[0]=zhang;
students[1]=wang;
//下面這兩行代碼是等效的,zhang和students[0]指向的是
//同一個Person實例
//zhang.info();
students[0].info();
}
}
輸出結(jié)果:
我的年齡是:22稚虎,我的身高是:184.0
java8 中的增強(qiáng)工具類:Arrarys
java提供的Arrarys類里包含的一些static修飾的方法可以直接操作數(shù)組撤嫩。
具體可查看api
常用的方法主要是:
- int binarySearch(type[] a, type key):使用二分法查詢key元素值在a數(shù)組中出現(xiàn)的索引;如果a數(shù)組不包含key元素值蠢终,則返回負(fù)數(shù)序攘。調(diào)用該方法時要求數(shù)組中元素已經(jīng)按升序排列。
- int binarySearch(type[] a,int fromIndex, int toIndex, type key):跟上一個類似寻拂,但它只搜索a數(shù)組中fromIndex到toIndex索引的元素程奠。調(diào)用該方法時要求數(shù)組中元素已經(jīng)按升序排列。
- type[] copyOf(type[] original, int length):這個方法將會把original數(shù)組復(fù)制成新數(shù)組祭钉,長度為length瞄沙。如果length小于original數(shù)組的長度,則新數(shù)組就是原數(shù)組的前面length個元素慌核;length大于original數(shù)組的長度距境,則新數(shù)組就是原數(shù)組的所有元素,后面補(bǔ)充相應(yīng)數(shù)據(jù)類型的默認(rèn)值垮卓,如int為0垫桂,boolean為false等
- copyOfRange、equals粟按、fill诬滩、sort、toString
- 等等……
注意:Arrarys類處于 java.util 包下灭将,為了在程序中使用Arrary類碱呼,需要進(jìn)行導(dǎo)包
實例:
package tmp;
import java.lang.reflect.Array;
import java.util.Arrays;
public class ArrarysTest {
public static void main(String[] args) {
// 定義一個a數(shù)組
int[] a = new int[] { 3, 4, 5, 6 };
// 定義一個a2數(shù)組
int[] a2 = new int[] { 3, 4, 5, 6 };
// a和a2數(shù)組的長度、每個元素順序值均相等宗侦,將輸出true
System.out.println("a愚臀、a2數(shù)組是否相等:" + Arrays.equals(a, a2));
// 通過賦值a數(shù)組生成新數(shù)組b
int[] b = Arrays.copyOf(a, 6);
System.out.println("a、b數(shù)組是否相等:" + Arrays.equals(a, b));
System.out.println("b的數(shù)組元素為:" + Arrays.toString(b));
// 將數(shù)組b的第3個元素到第5個元素賦值為1(區(qū)間前閉后開)
Arrays.fill(b, 3, 5, 1);
System.out.println(Arrays.toString(b));
// 將b數(shù)組進(jìn)行排序
Arrays.sort(b);
System.out.println(Arrays.toString(b));
}
}
運行結(jié)果:
a矾利、a2數(shù)組是否相等:true
a姑裂、b數(shù)組是否相等:false
b的數(shù)組元素為:[3, 4, 5, 6, 0, 0]
[3, 4, 5, 1, 1, 0]
[0, 1, 1, 3, 4, 5]