数组是一个引用类型,父类是Object。
数组实际是一个容器,是一个数据的集合。
数组中既可以存储基本数据类型,也可以存储引用数据类型。
数组因为是引用数据类型,所以数组存储在堆内存中。
数组存储对象是,存储的是对象的内存地址,而不是直接存储对象。
数组一旦创建,长度不可变。
数组的分类:一维,二维,三维。
数组自带length属性,用来获取数组的长度。
数组中的元素类型统一。
数组中的元素内存地址连续。
所有的数组都是用第一个元素的地址作为整个数组的内存地址。
元素有下标(索引),从0开始。
数组优缺点:
优点:查询/查找/检索某个下标上的元素时效率极高。可以说是查询效率最高的一个数据结构。
为什么检索效率高?
第一:每一个元素的内存地址在空间存储上是连续的。
第二:每一个元素类型相同,所以占用空间大小一样。
第三:知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,所以
通过一个数学表达式就可以计算出某个下标上元素的内存地址。直接通过内存地址定位
元素,所以数组的检索效率是最高的。
数组中存储100个元素,或者存储100万个元素,在元素查询/检索方面,效率是相同的,
因为数组中元素查找的时候不会一个一个找,是通过数学表达式计算出来的。(算出一个
内存地址,直接定位的。)
缺点:
第一:由于为了保证数组中每个元素的内存地址连续,所以在数组上随机删除或者增加元素的时候,
效率较低,因为随机增删元素会涉及到后面元素统一向前或者向后位移的操作。
第二:数组不能存储大数据量,为什么?
因为很难在内存空间上找到一块特别大的连续的内存空间。
注意:对于数组中最后一个元素的增删,是没有效率影响的。
语法格式:
int[] array1;
double[] array2;
boolean[] array3;
String[] array4;
Object[] array5;
初始化数组,数组的定义
1、动态初始化
int[] array = new int[5];
// 这里的5表示数组的元素个数。
// 初始化一个5个长度的int类型数组,每个元素默认值0
String[] names = new String[6];
// 初始化6个长度的String类型数组,每个元素默认值null。
2、静态初始化
int[] array = {100, 2100, 300, 55};
public static void main(String[] args) {
//数组
/*
数组的定义
1、动态定义,使用new关键字创建数组
int [] array1 = new int[数组长度];
2、静态定义
int [] array2 = {1,2,3};
*/
//1、动态定义,定义了一个数组长度为3的int类型的数组
int [] array1 = new int[3];
//2、数组对应的索引的赋值 数组变量名[下表/索引]
array1[0] = 1;
array1[1] = 2;
array1[2] = 3;
System.out.println(array1[0]);
System.out.println(array1[1]);
System.out.println(array1[2]);
//4、获取数组最后一个索引的数据
System.out.println(array1[array1.length-1]);
}
在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。数组的遍历使用for循环
//定义数组
int[] arr = {
1,2,3,4,5};
//使用for循环遍历
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i])
}
//使用高级for循环
/*
for (每一个元素的数据类型 临时变量名: 要循环的容器的变量名) {
System.out.println(i)
}
*/
for(int i :array1){
System.out.println(i);
}
/**
* @param array 传入数组
* @return 数组索引对应的最大值
*/
public static int getArrayMax(int[] array) {
//定义临时最大值变量
int max = array[0];
for (int i = 1; i < array.length; i++) {
//判断,当索引对应的值大于max时,将这个值赋给max
if (max < array[i]) {
max = array[i];
}
}
//返回最大值
return max;
}
调用以上的方法
public static void main(String[] args) {
//使用静态定义,定义一个数组
int [] array01 = {
2,4,6,8,9,11};
//调用数组工具类中的获取数组最大值的方法,并接受最大值
int maxNum = ArrayUtil.getArrayMax(array01);
System.out.println("数组最大值maxNum = " + maxNum);
}
输出结果数组最大值maxNum = 11。
/**
* @param array 传入数组
* @return 数组索引对应的最小值
*/
public static int getArrayMin(int[] array) {
//定义临时最小值变量
int min = array[0];
for (int i = 1; i < array.length; i++) {
//判断,当索引对应的值小于min时,将这个值赋给min
if (min > array[i]) {
min = array[i];
}
}
//返回最小值
return min;
}
调用以上的方法
public static void main(String[] args) {
//使用静态定义,定义一个数组
int [] array01 = {
2,4,6,8,9,11};
//调用数组工具类中的获取数组最小值的方法,并接受最小值
int minNum = ArrayUtil.getArrayMin(array01);
System.out.println("数组最小值minNum = " + minNum);
}
输出结果数组最小值minNum = 2。
每个数组的索引都有一个范围,即0~length-1。在访问数组的元素时,索引不能超出这个范围,否则程序会报错(ArrayIndexOutOfBoundsException)
int[] array1 ={
1, 2, 3};
//以下代码编译正常,但编译报错ArrayIndexOutOfBoundsException
System.out.println(array1[3]);
array1数组的索引最大值为2,当访问array1[3]时,超出了范围,系统报错
在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常(NullPointerException)
int[] array1 ={
1, 2, 3};
//以下代码编译正常,运行报错NullPointerException
array1 = null;
System.out.println(array1.length);
选择排序法
概述:
将下标为0的元素当做是数组中最小的值,将该值分别与之后索引对应的值一一对比,若有值比该值更小的元素,则把这两个值的位置调换,那么再使用较小元素,再接着与后面的元素比较,若还有比这个较小的元素更小,则把这两个值的位置调换。直到把所有的元素比完,这样最小的元素就会出现在第一位。然后在进行第二遍排序,从下标1开始,重复length-1次。这样排序就完成了
public class ArrayTest06 {
// 需求:{3, 7, 6, 9, 2, 1, 8} 请按照从小到大排序返回
/*
0. 前置条件,假设索引为 0 的数字最小
1. 找到最小数的索引
2. 将最小数移动至数组第一个索引
*/
public static void main(String[] args) {
//定义一个int类型的数组
int[] array = {
3, 7, 6, 9, 2, 1, 8};
//调用排序的方法并接收返回的数组
int[] array1 = sortArrays(array);
System.out.println(ArrayUtil.printArray(array1));
}
/**
* 将int类型的数组进行按从小到大的方式排序的方法,选择排序法
*
* @param array 传入的int类型的数组
* @return 排好序的数组
*/
public static int[] sortArrays(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
for (int j = i + 1; j < array.length; j++) {
//假设索引为i时的数组元素为最小值
int min = i;
//将最小值循环与它后面的值进行比较,若后面的值更小则替换
if (array[j] < array[min]) {
int temp = array[min];
array[min] = array[j];
array[j] = temp;
}
}
}
//返回排好序的数组
return array;
}
}
二维数组属于多维数组,那么什么是多维数组呢,当数组元素的类型是数组时就成了多维数组,
//1、二维数组的定义
int[][] array1 = new int[3][4];//动态定义
int[][] array2 = {
{
1,2,3},{
4,5,6,7},{
8,9,0,10,11}};//静态定义
//2、二维数组的赋值
array1[0][1]=1;
array1[0][2]=2;
array1[0][3]=3;
array1[0][4]=4;
//3、二维数组的遍历
for (int i = 0; i < array2.length; i++) {
for (int j = 0; j < array2[i].length; j++) {
System.out.println("array2 [" + i + "]" + "[" + j + "]=" + array2[i][j]);
}
}
java.util.Arrays 包下有许多关于数组的方法。
public static void main(String[] args) {
//定义一个int类型的数组
int[] arr = {
3, 6, 7, 9, 2, 4, 8, 1, 5};
// Arrays.sort()方法 排序 从小到大
Arrays.sort(arr);
//Array.toString()方法,将数组转换为字符串
System.out.println(Arrays.toString(arr));
//Arrays.fill(int[] a,int val)方法 将指定的int值val来替换数组的每个元素的值
//Arrays.fill(arr,0);
//System.out.println(Arrays.toString(arr));
//fill(int[] a, int fromIndex, int toIndex, int val)
//将指定的int值val来替换数组的指定区间索引内的值。左闭右开
Arrays.fill(arr,0,2,1);
System.out.println(Arrays.toString(arr));
// copyOf(int[] original, int newLength)
// 拷贝数组指定拷贝的索引从0开始到newLength结束
int[] result = Arrays.copyOf(arr,5);
System.out.println(Arrays.toString(result));
//copyOfRange(int[] original, int from, int to)
//将指定的数组指定的范围复制到一个新的数组中。左闭右开
int[] result1 = Arrays.copyOfRange(arr,1,5);
System.out.println(Arrays.toString(result1));
}