1 数组的特殊性
数组与其他持有对象的容器之间有三方面区别:效率、类型和保存基本类型的能力。
- 效率:数组是Java中效率最高的存储和随机访问对象引用序列方式。这是一个简单的线性序列,使得元素访问非常快速,但是缺陷在于数组大小不可变。
- 类型:数组中元素类型一致。
保存基本类型:数组可以保持基本数据类型,而容器不可以,只能使用自动包装之后的数据类型。
2 数组的分类
2.1 按维度分类
一维数组
int[] a = new int[10];
- 多维数组
创建方式一:常用于基本类型数组,int[][] a = { {1, 2, 3}, {4, 5, 6}};
创建方式二:使用new分配数组,int[][][] a = new int[2][2][4];
。基本类型数组的值在不进行显示定义的情况下会自动初始化,对象数组会被初始化为null。
2.2 按数据类型分类
2.2.1 基本类型数组
2.2.2 对象数组
ClassName[] a = new ClassName[10];
3 数组的基本应用
大部分情况下还是更加倾向于选择容器。在具有特殊要求的场景下,由于数据具有高效性,此时会选择使用数组。
数组标识符只是个引用,指向堆中创建的一个真实对象。这个对象用于保存指向其他对象的引用。
使用[]
读取数组的元素。
4 数组作为返回值
虽然在C/C++中,返回一个数组是不可行的,但是在Java中可以直接返回一个数组,只要代码中还在使用,这个数组就一直存在,直到使用完,垃圾回收器清理掉它。
public static String[] f(int n){
String[] result = new String(n);
for(int i = 0; i < n; i++){
result[i] = i;
}
return result;
}
5 数组与泛型
数组和泛型结合较差,不能实例化具有参数类型的数组。这在泛型里面会详细涉及。
6 使用数组创建测试数据
6.1 Array.fill()
Java标准库中,Arrays类有一个fill()方法:只能用同一个值填充所有位置。
int[] a = new int[10];
Arrays.fill(a, 80);
System.out.println(Arrays.toString(a));
/*
Output:
[80, 80, 80, 80, 80, 80, 80, 80, 80, 80]
*/
6.2 数据生成器
6.3 从Generator中创建数组
7 Array类的实用功能
java.util库中存在Array类,实现了一套用于数组的static方法,包含了六个基本方法:
- equals()用于比较数组是否相等,deepEquals()用于比较多维数组
- fill()填充数组
- sort()数组排序
- binarySearch()已排序的数组进行查找
- toString()产生数组的String表示
- hashCode()产生数组的散列码
这些方法对基本数据类型和Object类都进行了重载;Arrays.asList()接受任何序列或数组作为参数,将其转换为List。
7.1 复制数组
Java标准类库提供的static方法System.arraycopy(),该方法针对所有类型都进行了重载,复制数组的效率高于for循环。System.arraycopy(ClassName1[] a, int idx, ClassName2[] b, int idy, int num);
a是源数组,idx是开始复制的位置下标,b是目标数组,idy是开始保存的位置下标,num是复制的元素个数。
7.2 数组比较
Arrays类型提供了equals()方法,数组的元素个数必须相同,每个位置的元素内容也必须相同。对每个位置元素使用该元素的equals进行比较判断。deepEquals()用于比较多维数组。
7.3 数组元素比较
7.3.1 实现java.lang.Comparable接口
该接口只有一个方法,compareTo(),用于接收另一个Object为参数,若当前对象小于参数则返回负值,若等于则返回0,若大于则返回正值。
class ClassA implements Comparable<ClassA>{
int i;
public int compareTo(ClassA rv){
return (i < rv.i ? -1 : (i == rv.i ? 0 : 1));
}
}
7.3.2 实现Comparator接口
该接口的类包含两个方法:compare()和equals()。equals()方法已经实现好了,如果不够用有特别需要,可以自定义实现compare()。
Collection.reverseOrder()返回一个反向排序的Comparator接口类。
class CompTypeComparator implements Comparator<ClassA>{
public int compare(ClassA a1, ClassA a2){
return (a1.i < a2.i ? -1 : (a1.i == a2.i ? 0 :1));
}
}
public class ComparatorTest{
public static void main(String[] args){
ClassA[] a = new ClassA[10];
...
Arrays.sort(a, new CompTypeComparator());
}
}
7.4 数组排序
Arrays.sort(ClassName1[] a, Collections.reverseOrder());
数排序从大到小Arrays.sort(ClassName1[] a, String.CASE_INSENSITIVE_ORDER);
字符串排序,按照字典序,默认不设置是区分大小写,大写先排,这里设置的意思是,忽略大小写。
7.5 已排序数组查找
**Arrays.binarySearch(ClassName1[] a, ClassName1 item)**
要求是排序完成的数组,否则会产生难以预料的结果。
找到了返回非负数,否则返回负值,这个负值为如果要插入该元素,应该放置的下标。