数组类型:
1.定义及初始化:
数组可以只定义数组引用、定义空间在栈区的数组、定义空间在堆区的数组、通过反射使用Array类定义数组。例子如下:
class Test{
public static void main(String[] args)
{
/*栈区分配空间*/
int[] a = {1,2,3,4};
/*堆区分配空间*/
int[] b = new int[] {1,2,3,4};
/*只定义空间,不填入内容*/
int[] c = new int[5];
/*只定义数组引用*/
int[] d;
/*通过反射,使用Arrays类创建数组,后面介绍*/
}
}
当数组定义的时候,没有明确数组内容的时候;编译器会给数组初始默认值,一般都是为0,null,false。具体如下:
2.foreach循环:
Java 5之后,引入foreach循环,主要目的是用来遍历可迭代对象(数组、集合)
class Test{
public static void main(String[] args)
{
int[] b = new int[] {1,2,3,4};
/*b为迭代器,a为迭代子*/
for(int a : b){
System.out.println(a);
}
}
}
注意:使用foreach循环的时候,迭代子为一个临时变量;所以在foreach循环中,是不能改变迭代器中数据内容的!
3.数组长度获取(length字段):
数组对象唯一可以访问的字段为length,通过length字段可以获得当前引用的数组长度(既数组容量)
数组内存:
1.基本类型数组:new数组后,会在堆区开辟一段基本数据类型的空间,初始默认值为0;然后定义数组引用去指向该空间。
2.引用类型数组:new数组后,会在堆区开辟一段引用类型的空间(既一个引用数组),初始默认值为null;然后定义数组引用指向该引用数组;如果想使用这个数组还需用将引用数组中的引用指向对应的对象!
3.可变参数类型与数组类型:
Java8后,函数形参增加了Type...这样的可变参数类型;可以使用多参数作为实参,也可以使用数组作为实参!
public class ArrayTest
{
public static void main(String[] args)
{
int[] a = {1,2,3};
/*int[] i,入参为数组类型的,只能接受数组类型*/
ArrayTest1(a);
/*编译报错*/
//ArrayTest1(1,2,3);
/*int... i,入参为可变参数类型的,即可以接受可变参数类型,也可以接受数组类型*/
ArrayTest2(1,2,3);
ArrayTest2(new int[]{1,2,3});
}
private static void ArrayTest1(int[] i)
{
System.out.println("int[]");
}
/*ArrayTest1(int[] i)与ArrayTest1(int... i)不会发生重载,会导致编译报错
private static void ArrayTest1(int... i)
{
System.out.println("int[]");
}
*/
private static void ArrayTest2(int... i)
{
System.out.println("int...");
}
}
Array类和Arrays类:
1.Arrays类:
java.util类中有一个Arrays类,该类提供了一套数组基本操作的static方法(大量方法都根据基本类型和Object类型做过重载),包括:
数组元素赋值:Arrays.fill()
数组排序:Arrays.sort()
Ps:数组排序的规则定制(主要针对对象排序),使用Comparable接口类、或者使用Collections类
数组拷贝:Arrays.copyOf()
Ps:Java标准库中也提供了一个数组拷贝的方法,System.arraycopy(),注意两者都是浅拷贝(如果数组类型为引用类型,仅仅拷贝引用,而不重新创建引用内容)
数组元素查找:Arrays.binarySearch()
数组转字符串:Arrays.toString()
数组相等判断:Arrays.equals()
数组散列码产生:Arrays.hashCode()
数组转List:Arrays.asList()
2.Array类:
java.lang.reflect包下提供一个Array类,可以通过反射来操作数组:
import java.lang.reflect.*;
class Test{
public static void main(String[] args)
{
Object Arr = Array.newInstance(int.class,10);
int[] Arr1 = (int[])Arr;
Arr1[0] = 12;
System.out.println(Arr1[0]);
Array.set(Arr,1,10);
System.out.println(Array.get(Arr,1));
Array.setInt(Arr,2,11);
System.out.println(Array.getInt(Arr,2));
}
}
Ps:数组与泛型的相关问题,将在泛型的相关文章中具体介绍!<JavaSE学习笔记(10.Java之泛型)>