一.数组
1.1 数组是什么
数组是用来存储一批相同类型数据的容器。在定义数组时,可分为二种,分别是静态初始化数组、动态初始化数组。
1.2 数组的定义
1.2.1 静态初始化数组
静态初始化数组是指定义数组的时候直接给数组赋值。具体格式如下:
1.2.2 动态初始化数组
数组的动态初始化是指定义数组的时候只确定元素的类型和数组的长度,具体的数据之后存入。数组的动态初始化格式如下:
动态初始化数组的时候,数组会根据类型的不同初始化一个元素默认值,不同类型对应的元素默认值如下所示:
1.3 数组的访问
//访问数组的元素
数组变量名[索引]
//访问数组的长度
数组变量名.length
1.4 数组的遍历
数组的遍历就是访问到数组中的每一个元素。具体遍历方式有如下二种:
普通for循环
增强for循环
int[] args = {20,30,40,50};
for(int item : args){
System.out.println(item);
}
1.5 数组拷贝
在Java中,可以使用System.arraycopy()或者数组的clone()方法来将一个数组的内容拷贝到另外一个数组中。需要注意的是,使用clone()方法进行数组拷贝时,得到的是一个新的数组对象,其内存地址不同于原数组。而使用System.arraycopy()方法进行数组拷贝时,得到的是一个与原数组数据内容相同的数组对象,其内存地址与原数组相同。
1.System.arraycopy()方法
这个方法可以将源数组src,从索引srcPos开始的length个元素拷贝到,从索引destPos开始的目标数组dest中。
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
下面是一个使用System.arraycopy()方法进行数组拷贝的例子:
int[] sourceArray = {1, 2, 3, 4, 5};
int[] targetArray = new int[5];
System.arraycopy(sourceArray, 0, targetArray, 0, 5);
2.clone()方法
数组对象有一个clone()方法,可以创建一个当前数组的副本。下面是一个使用数组的clone()方法进行数组拷贝的例子:
int[] sourceArray = {1, 2, 3, 4, 5};
int[] targetArray = (int[]) sourceArray.clone();
1.6 数组在内存中的原理
Java的内存分为栈、堆、方法区、本地方法栈、寄存器,这个地方只介绍前三种。
下图中是二个数组变量指向同一个数组对象,可以看出,数组变量存在于栈内存中,变量名中存储的是数组在内存中的地址,数组本身是在堆内存中创建的,所以数组是引用数据类型。另外,基本数据类型的数组直接存储相应类型的值,而对象数组存储的是对象的引用。
二.Arrays类
2.1 Arrays类概述
Arrays类是数组操作工具类,专门用来操作数组的。
2.2 Arrays类的常用API
//返回数组的内容(字符串形式)
public static String toString(类型[] a)
//对数组进行排序,默认升序。也可以再传入一个比较器,按照比较器的方式进行排序。
public static void sort(类型[] a)
//使用比较器对象自定义排序。
public static <T> void sort(类型[] a, Comparator<? super T> c)
//二分查找数组中的数据,存在返回索引,不存在返回-1。数组a必须是排序好的。
public static int binarySearch(int[] a, int key)
//用来比较二个数组中的元素是否相同。数组a和b的类型可以是八种基本数据类型,也可以是引用数据类型。
public static boolean equals(类型[] a, 类型[] b);
//将一个数组的内容拷贝到另外一个数组
数据类型[] newArray = Arrays.copyOf(原数组, 新数组的长度);
//将数组中的所有元素设置为指定的值
Arrays.fill(数组, 指定的值);
Arrays类使用比较器对象自定义排序
排序规则:
例如: