数组
1.简介
数组是一种数据结构,是用来存储同一类型值的集合。数组是通过整型下标来访问其中的值的,如a是一个整型数组,a[i]就是下标为i的整数。
在声明数组时要指出数组的数据类型和数组的名字,如int[] a;
,但这只是声明并没有创建数组,创建数组要使用new运算符,因为数组也是对象,如int[] a=new int[10];
,数组的长度不要求是常量,可以是变量如i。
下面声明数组的方法是正确的:
int[] a; //建议使用这种
int a[];
int []a;
当创建一个数组但没有赋值时,这个数组的所有元素都初始化为该数组数据类型的默认值。
在Java中想要获得数组的长度可以使用array.length,例a.length
2.for each 循环
for each是Java中一种功能很强的循环结构,它可以依次处理数组中的每个元素,语法格式:
for(元素变量x : 遍历对象obj){
引用了x的Java语句;
}
在这个循环中元素变量x会遍历obj中的每个元素。
如果想打印数组中的所有值,可以使用Arrays类的toString方法,它会返回一个包含数组元素的字符串,这些元素会被放到括号内且被逗号分开。例,
int[] a;
a=new int[]{1,2,3,4,5,6};
System.out.println(Arrays.toString(a)); //输出[1, 2, 3, 4, 5, 6]
注:Arrays类是java.util类库中的,所以在使用时要在程序最前面加上:import java.util.Arrays;
3.数组初始化和匿名数组
在创建数组时初始化:
int[] a=new int[]{1,2,3,4,5,6};
int[] a={1,2,3,4,5,6};
int[] a;
a=new int[]{1,2,3,4,5,6};
String[] a= {new String("ma"),new String("ma"),new String("ma")};
创建匿名数组:new int[] {1,2,3,4,5}
Java允许数组长度为0,但数组长度为0和null不同。
数组对象也存放在内存中的堆区,并且数组对象在堆区中是一块连续的内存空间,这其中的每一小块空间都可以存放我们要保存的一个数据(元素)。
4.数组拷贝
在Java中允许将一个数组变量拷贝给另一个数组变量,这时两个变量将指向同一个内存地址。
如果希望将数组中的所有值拷贝到另一个新的数组,可以使用Arrays类的copyOf方法。例,
int[] b;
b=Arrays.copyOf(a, a.length);
此方法的第二个参数是新数组的长度且此长度可以增加,增加后多余的部分按照数据类型的默认值定。若新数组的长度比原数组的长度小,则只取最前面的数据元素。例,
int[] b;
b=Arrays.copyOf(a, 3*a.length);
System.out.println(Arrays.toString(b)); //输出[1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
还有一种数组拷贝的方法是System类库的arraycopy方法。
int[] a=new int[] {1,2,3,4,5};
int[] b=new int[20];
System.arraycopy(a, 0, b, 0,a.length);
System.out.println(Arrays.toString(b)); //输出[1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
arraycopy方法的第一个参数是拷贝哪个数组,第二个参数是从该数组的哪个位置开始拷贝,第三个参数是拷贝到哪个数组,第四个参数是在哪个位置开始拷贝,第五个参数是复制的大小(此处的大小应<=第一个参数.length-第二个参数)。
两者的区别在于,Arrays.copyOf()不仅仅只是拷贝数组中的元素,在拷贝元素时,会创建一个新的数组对象。而System.arrayCopy只拷贝已经存在数组元素。
其实,Arrays.copyOf()的底层还是调用了System.arrayCopyOf()方法。
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
5.数组的算法
①数组的比较
Arrays类提供了重载后的equals()方法,用来比较整个数组。此方法中数组相等的条件是元素个数必须相等,且对应位置的元素也相等。例,
int[] a=new int[10];
int[] b=new int[10];
Arrays.fill(a, 6);
Arrays.fill(b, 6);
System.out.println(Arrays.equals(a, b)); //结果是true
b[3]=3;
System.out.println(Arrays.equals(a, b)); //结果是false
上面的例子中使用了Arrays类的fill方法,这个方法的作用十分有限,它的第一个参数是数组名,第二个参数是符合该数组数据类型的值,然后这个值将填满这个数组。
②数组元素的排序
Arrays类的sort方法使用了优化的快速排序算法,效率比较高。例,Arrays.sort(a);
注:这些方法的修饰符为static,所以不需要实例化类对象来调用这些方法,直接使用类名.方法名来调用即可。
③数组元素的查找
Arrays类的binarySearch方法采用二分搜索算法查找值,如果查找成功返回该值的下标,否则返回一个负数值。
binarySearch(数组名,起始下标,终止下标,要查找的值),包含起始下标,不包含终止下标
6.二维数组
二维数组的声明:
int[][] a; //建议使用这种
int b[][];
int[] c[];
二维数组的初始化:
int[][] a=new int[3][4];
int b[][]=new int[][] {{1,2,3},{2,3,4}};
int[] c[]=new int[][] {{1,2,3},{2,3,4}};
int[][] d=new int[3][];
注:二维数组创建的时候一定要将第一维数组的长度表示出来,如上面第四个表达式,此时第二维数组的长度可以自定义,即可以根据实际情况的变化而变化。
二维数组的遍历输出:
for(int i=0;i<b.length;i++) {
for(int j=0;j<b[i].length;j++) {
System.out.println(b[i][j]);
}
}
7.字符串转数组
将字符串中的每一个字符取出来组成一个数组,利用java.lang.String类里的toCharArray方法。例,
String s="qwertyuioplkjhgfdsazxcvbnm0123456789";
char[] a=s.toCharArray();
System.out.println(Arrays.toString(a)); //输出[q, w, e, r, t, y, u, i, o, p, l, k, j, h, g, f, d, s, a, z, x, c, v, b, n, m, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
注:java.lang里的所有类和方法都是自动加载到每一个程序里的,不需要用import引入。