数组的基本使用
概述
- 数组是相同类型数据的有序集合
- 数组的创建是JVM在堆空间(Heap)中为数组元素分配内存空间并返回地址的过程
- 数组可作为方法的返回值,返回的其实是地址
一维数组
创建一维数组
一维数组可以动态初始化也可以静态初始化
动态初始化:指定数组的长度,其中元素默认为0
int[] a = new int[10];
静态初始化:指定数组的内容
int[] a = new int[] {1, 2, 3};
或者
int[] a = {1, 2, 3};
获取长度
int len = a.length;
输出
如果直接输出数组名,则实际输出的是:数组对应内存地址的哈希值
System.out.println(a);
如果想要输出数组的内容,需要使用Arrays工具类的toString方法
System.out.println(Arrays.toString(a));
二维数组
创建二维数组
动态创建
int[][] a = new int[3][3];
二维数组还可以先创建一维数组,再对一维数组进行细化
int[][] a = new int[2][];
a[0] = new int[2];
a[1] = new int[3];
静态创建
int[][] a = {{1,2,3}, {1}};
二维数组的遍历
传统方式遍历:
for(int i = 0; i < a.length; i++) {
for(int j = 0; j < a[i].length; j++) {
}
}
使用foreach方式遍历:
for(int x[] : a) {
for(int e : x) {
System.out.println(e);
}
}
数组的特点
- 数组的长度是确定的。数组一旦被创建,其大小就是不可改变的
- 同一个数组内的元素必须是相同类型
- 数据中的元素可以是任何数据类型
- 数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该变量的成员变量
- 数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的
for-each
JDK 1.5 引进了一种新的循环类型,被称为 For-Each 循环或者加强型循环,它能在不使用下标的情况下遍历数组
格式:
for(类型 变量名:集合) {
}
- 类型:集合元素的类型
- 变量名:表示集合中的每一个元素
- 集合:需要被遍历的集合对象或数组
举例:
int[] num = {1,2,3,4};
for(int x : num) {
System.out.println(x);
}
String[] urls = { "http://c.biancheng.net/java", "http://c.biancheng.net/c", "http://c.biancheng.net/golang/" };
for (String url : urls) {
System.out.println(url);
}
Arrays类
Arrays类的是数据的工具类,包路径为:java.util.Arrays
Arrays类中包含了一些可以对数组进行操作的方法,如下:
赋值
fill(int[] a, int value)
fill(int[] a, int fromIndex, int toIndex, int value)
指定范围赋值[fromIndex,toIndex)
排序
Arrays.sort(a); //升序
Arrays.sort(a, Collections.reverseOrder()); //降序
复制
copyOf(a, int newlength);
- newlength:复制后新数组的长度大于原数组,用0填充
举例:
int[] a = new int[] {1, 2, 3};
int[] b = Arrays.copyOf(a, 5); //b数组为:1, 2, 3, 0, 0
指定范围复制:
copyOfRange(a, int formIndex, int toIndex);
查询
二分搜索法,使用前先排序
binarySearch(Object[] a, Object key);
- 如果key包含在数组中,返回索引,否则返回-1或插入点(第一个大于此键的元素索引)
举例:
int index = Arrays.binarySearch(a,10);
范围查询:
binarySearch(Object[], int fromIndex, int toIndex, Object key);