1.定义数组
格式:type[ ] arrayname(type arrayname[]),建议使用第一种,符合语法习惯,type[ ]是一种类型。
数组是一种引用类型的变量,因此使用他定义的一个变量时,仅仅表示定义了一个引用变量(也就是定义了一个指针),这个引用变量还未指向任何有效的内存,因此定义的时候不能指定数组的长度,并且在没有初始化之前也是不能用的。
2.数组的初始化
(1)静态初始化:初始化时由程序员显示的指定每个数组元素的初始值,由系统决定数组的长度。
格式
arrayname = new type[ ]{element1,element2,element3...}; (前提有定义)
or type[ ] arrayname = {element1,element2,element3...};
由于java语言很好的继承性,数组的类型和元素的类型可以使一样也可以是父子关系。例如:
int[] intArray;
intArray=new int[]{5,6,7,8};
Object[] objArr;
objArr=new String[]{"hello","fine"};//数组类型时定义的数组的子类
Object[] objArr1;
obj1Arr=new Object[]{"java"};//元素类型时数组类型的子类
(2)动态初始化,初始化时只能指定数组长度,由系统为数组元素分配初始值。
格式 arrayname = new type[length];
执行动态初始化时,程序员只需要指定数组的长度,系统自动赋予初始值,有如下的规则:
(1)数组元素的类型是基本类型中的整型类型(byte,short, int 和 long),则元素为0。
(2)数组元素的类型是基本类型中的浮点类型(float, double),则元素为0.0。
(3)数组元素的类型是基本类型中的字符类型(char),则元素为‘\u0000’。
(4)数组元素的类型是基本类型中的布尔类型(boolean),则元素为‘false。
(3)数组元素的类型是引用类型(类,接口和数组),则元素为null
注意:不要同时使用静态初始化和动态初始化,即不要既指明长度又为每个元素赋初始值。
(3)foreach循环
一般遍历一个数组要获取他的属性length的值,但是foreach循环会自动遍历数组的每一个元素。
格式 for(type variableName:array)
{
public class test{
public static void main()(String [] args){
String [] book={"ab","cd","ef"};
for(String book:books)
System.out.println(book);
}
}
3.深入了解数组
(1)内存中的数组
实际的数组对象被存储在堆(heap)内存中,如果引用该数组对象的数组引用变量是一个局部变量,那么它被存储在栈(stack)内存中。数组在内存中的存储示意图如下:
如果堆内存中数组不再有任何引用变量指向自己,则这个数组将成为垃圾,该数组所占用的内存空间将会被系统的垃圾回收机制回收。
只要类型相互兼容,就可以让一个数组变量指向另一个实际的数组,这会让人产生数组的长度可变的错觉。如下代码:
public class arrayTest{
public static void main(){
int [] a= {5,7,20};
int [] b= new int[4];
System.out.println("b数组的长度为:"+b.length);
for(int num:a)
System.out.println(num);
for(int i=0;i<b.length;i++)
System.out.println(b[i]);
b=a;
System.out.println("b数组的长度"+b.length);
}
}
执行b=a后
(2)引用类型的初始化
先定义一个Person 类
class Person{
public int age;
public double height;
public void info(){
System.out.println("我的年龄是"+age+",我的身高是:"+height);
}
}
public class ArrayTest{
public static void main(String[] args) {
Person[] students;
students=new Person[2];
Person zhang=new Person();
zhang.age=15;
zhang.height=158;
Person cheng=new Person();
zhang.age=16;
zhang.height=161;
students[0]=zhang;
students[1]=cheng;
cheng.info();
students[1].info();
}
}
第一步:执行 Person[ ] students,此时仅仅在栈内存中定义了一个引用变量,也是一个指针,该指针没有指向任何内存区。
第二步:动态初始化:students=new Person[2],每个元素的值为null(引用类型的默认值)。
第三步:students数组的两个数组元素都是引用,这个引用没有指向人格有效的内存,这意味着依然不能使用students数组。接下来定义两个变量zhang和cheng。
第四步:依次把zhang和cheng赋值给students数组的两个元素,他们属于同意内存区,注意内存中加引号是代表的这个person对象。
4.Array类
java提供的Array类里包含了一些static修饰的方法可以直接操作数组(可以直接通过类名调用):
(1)int binarySearch(type[ ] a,type key):二分法查找要求已经升序排列,没有找到则返回负数。
(2)int binarySearch(type[ ] a,int fromIndex,int toIndex,type key):和第一个类似规定了范围查找。
(3)type[ ] copyOf(type[ ] original,int length):把original数组复制到一个新的数组,length是新数组的长度,如果length小于原数组长度就截取length长度的元素,大于的话在后面补充0(数值类型),false(布尔类型)和null(引用类型)。
(4)type[ ] copyOfRange(type[ ] original,int from,int to):加范围复制。
(5)boolean equals(type[ ] a,type[ ] a2):如果长度相等且元素一致返回true。
(6)void fill(type[ ] a,type val):把数组a中的所有元素赋值val。
(7)void fill(type[ ] a,int fromIndex,int toIndex,type val ):加了范围.
(8)void sort(type[ ] a):从小到大排序。
(9)void sort(type[ ] a,int fromIndex,int toIndex).
(10)String toString(type[ ] a):将数组转换为字符串。
//在这里补充一下:
java为8中基本类型提供了对应的包装类:boolean对应Boolean,byte对应Byte,short对应Short,int对应Integer,long对应Long,char对应Character,float对应Float,double对应Double,可以通过调用函数parseXxx来把字符串类型转换成基本类型。
String a=“45”;
int val=integer.parseInt(a);//val=45